From 60831045b54de0c186a096fe212685e94d180ad0 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Wed, 10 Jun 2020 22:23:03 +0200 Subject: [PATCH] Tests + timezone fix --- kfet/tests/test_views.py | 97 +++++++++++++++++++++++++++++++++++++++- kfet/views.py | 6 ++- 2 files changed, 100 insertions(+), 3 deletions(-) diff --git a/kfet/tests/test_views.py b/kfet/tests/test_views.py index bcd9a9b4..dbf90b3b 100644 --- a/kfet/tests/test_views.py +++ b/kfet/tests/test_views.py @@ -1,5 +1,5 @@ import json -from datetime import datetime, timedelta +from datetime import timedelta from decimal import Decimal from unittest import mock @@ -1365,6 +1365,8 @@ class ArticleCreateViewTests(ViewTestCaseMixin, TestCase): "category": self.category.pk, "stock": 5, "price": "2.5", + "volume": "33", + "abv": "6.3", } def setUp(self): @@ -1451,6 +1453,8 @@ class ArticleUpdateViewTests(ViewTestCaseMixin, TestCase): "price": "3.5", "box_type": "carton", # 'hidden': not checked + "volume": "33", + "abv": "6.3", } def setUp(self): @@ -4220,6 +4224,74 @@ class AccountReadJSONViewTests(ViewTestCaseMixin, TestCase): def url_expected(self): return "/k-fet/accounts/{}/.json".format(self.accounts["user"].trigramme) + def setUp(self): + super().setUp() + + # A Checkout, curently usable, balance=100 + self.checkout = Checkout.objects.create( + created_by=self.accounts["team"], + name="Checkout", + valid_from=self.now - timedelta(days=7), + valid_to=self.now + timedelta(days=7), + balance=Decimal("100.00"), + ) + # An Article, price=2.5, stock=20 + self.article = Article.objects.create( + category=ArticleCategory.objects.create(name="Category"), + name="Article", + price=Decimal("2.5"), + stock=20, + volume=Decimal("33"), + abv=Decimal("7.3"), + ) + + now = timezone.localtime(self.now) + + ope_party1 = OperationGroup.objects.create( + on_acc=self.accounts["user"], + checkout=self.checkout, + at=now.replace(hour=1), + ) + + ope_party2 = OperationGroup.objects.create( + on_acc=self.accounts["user"], + checkout=self.checkout, + at=now.replace(day=now.day - 1, hour=22), + ) + + ope_noparty = OperationGroup.objects.create( + on_acc=self.accounts["user"], + checkout=self.checkout, + at=now.replace(day=now.day - 1, hour=19), + ) + + Operation.objects.create( + group=ope_party1, + type=Operation.PURCHASE, + article=self.article, + article_nb=2, + ) + + Operation.objects.create( + group=ope_party2, + type=Operation.PURCHASE, + article=self.article, + article_nb=1, + ) + Operation.objects.create( + group=ope_party2, + type=Operation.PURCHASE, + article=self.article, + article_nb=1, + ) + + Operation.objects.create( + group=ope_noparty, + type=Operation.PURCHASE, + article=self.article, + article_nb=3, + ) + def test_ok(self): r = self.client.get(self.url) self.assertEqual(r.status_code, 200) @@ -4243,10 +4315,33 @@ class AccountReadJSONViewTests(ViewTestCaseMixin, TestCase): "nickname", "promo", "trigramme", + "n_units", ] ), ) + @mock.patch("django.utils.timezone.now") + def test_without_party(self, mock_now): + now = timezone.localtime(self.now) + mock_now.return_value = now.replace(hour=20).astimezone(timezone.utc) + r = self.client.get(self.url) + self.assertEqual(r.status_code, 200) + + content = json.loads(r.content.decode("utf-8")) + + self.assertEqual(content["n_units"], 0) + + @mock.patch("django.utils.timezone.now") + def test_with_party(self, mock_now): + now = timezone.localtime(self.now) + mock_now.return_value = now.replace(hour=5).astimezone(timezone.utc) + r = self.client.get(self.url) + self.assertEqual(r.status_code, 200) + + content = json.loads(r.content.decode("utf-8")) + + self.assertAlmostEqual(float(content["n_units"]), 3 * 33 * 7.3 * 0.8 / 100) + class SettingsListViewTests(ViewTestCaseMixin, TestCase): url_name = "kfet.settings" diff --git a/kfet/views.py b/kfet/views.py index f9d39885..18e442f2 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -923,13 +923,15 @@ def account_read_json(request, trigramme): now = timezone.localtime(timezone.now()) # une soirée va de XXh à 06h if time(21) <= now.time() or now.time() <= time(6): - begin_time = datetime.combine(now.date(), time(21)) + begin_time = now.replace(hour=21, minute=0, second=0, microsecond=0) # si on est après minuit, il faut retrancher un jour if now.time() <= time(6): begin_time -= timedelta(days=1) qs = Operation.objects.filter( - group__on_acc=account, type=Operation.PURCHASE, group__at__gte=begin_time, + group__on_acc=account, + type=Operation.PURCHASE, + group__at__gte=begin_time.astimezone(timezone.utc), ).annotate( units=F("article__volume") * F("article__abv") * alcohol_density / 100 )