github.com/ismailbayram/bigpicture@v0.0.0-20231225173155-e4b21f5efcff/internal/browser/pyproject/baskets/tests/test_service.py (about)

     1  from model_mommy import mommy
     2  from decimal import Decimal
     3  import datetime
     4  
     5  from django.test import TestCase, override_settings
     6  from django.utils import timezone
     7  
     8  from base.test import BaseTestViewMixin
     9  from cars.enums import CarType
    10  from cars.service import CarService
    11  from cars.exceptions import CustomerHasNoSelectedCarException
    12  from products.service import ProductService
    13  from baskets.models import Basket, DiscountItem
    14  from baskets.service import BasketService
    15  from baskets.enums import BasketStatus, PromotionType
    16  from baskets.exceptions import (PrimaryProductsQuantityMustOne,
    17                                  BasketInvalidException,
    18                                  BasketEmptyException)
    19  from reservations.service import ReservationService
    20  
    21  
    22  @override_settings(DEFAULT_PRODUCT_PRICE=Decimal('20.00'))
    23  class BasketServiceTest(TestCase, BaseTestViewMixin):
    24      def setUp(self):
    25          self.service = BasketService()
    26          self.product_service = ProductService()
    27          self.car_service = CarService()
    28          self.init_users()
    29          self.store = mommy.make('stores.Store', washer_profile=self.washer_profile,
    30                                  is_approved=True, is_active=True)
    31          self.store2 = mommy.make('stores.Store', washer_profile=self.washer2_profile,
    32                                   is_approved=True, is_active=True)
    33          self.product1 = self.product_service.create_primary_product(self.store)
    34          self.product2 = self.product_service.create_product(name='Parfume', store=self.store,
    35                                                              washer_profile=self.store.washer_profile)
    36          self.product3 = self.product_service.create_primary_product(self.store2)
    37          self.product4 = self.product_service.create_product(name='Parfume', store=self.store,
    38                                                              washer_profile=self.store.washer_profile,
    39                                                              is_primary=True)
    40          self.car = self.car_service.create_car(licence_plate="34FH3773", car_type=CarType.sedan,
    41                                                 customer_profile=self.customer_profile)
    42  
    43      def test_get_or_create_basket(self):
    44          basket = self.service.get_or_create_basket(customer_profile=self.customer_profile)
    45          self.assertEqual(basket.status, BasketStatus.active)
    46          self.assertEqual(basket.get_total_amount(), Decimal('0.00'))
    47          self.assertEqual(basket.get_total_quantity(), 0)
    48          self.assertTrue(basket.is_empty)
    49          self.assertEqual(basket.car, self.car)
    50  
    51          basket = self.service.get_or_create_basket(customer_profile=self.customer_profile)
    52          self.assertEqual(Basket.objects.filter(customer_profile=self.customer_profile).count(), 1)
    53  
    54          basket.delete()
    55          self.car.delete()
    56          with self.assertRaises(CustomerHasNoSelectedCarException):
    57              self.service.get_or_create_basket(customer_profile=self.customer_profile)
    58  
    59      def test_add_basket_item(self):
    60          basket = self.service.get_or_create_basket(customer_profile=self.customer_profile)
    61  
    62          self.service.add_basket_item(basket, self.product1)
    63          self.assertEqual(basket.get_total_quantity(), 1)
    64          self.assertEqual(basket.get_total_amount(), Decimal('20.00'))
    65          self.assertFalse(basket.is_empty)
    66  
    67          with self.assertRaises(PrimaryProductsQuantityMustOne):
    68              self.service.add_basket_item(basket, self.product1)
    69  
    70          with self.assertRaises(PrimaryProductsQuantityMustOne):
    71              self.service.add_basket_item(basket, self.product4)
    72  
    73          self.service.add_basket_item(basket, self.product2)
    74          self.assertEqual(basket.get_total_quantity(), 2)
    75          self.assertEqual(basket.get_total_amount(), Decimal('40.00'))
    76  
    77          self.service.add_basket_item(basket, self.product2)
    78          self.assertEqual(basket.get_total_quantity(), 3)
    79          self.assertEqual(basket.get_total_amount(), Decimal('60.00'))
    80  
    81          self.service.add_basket_item(basket, self.product3)
    82          self.assertEqual(basket.get_total_quantity(), 1)
    83          self.assertEqual(basket.get_total_amount(), Decimal('20.00'))
    84  
    85      def test_clean_basket(self):
    86          basket = self.service.get_or_create_basket(customer_profile=self.customer_profile)
    87          self.service.add_basket_item(basket, self.product1)
    88          self.service.add_basket_item(basket, self.product2)
    89          self.service.add_basket_item(basket, self.product2)
    90  
    91          self.service.clean_basket(basket)
    92          self.assertEqual(basket.get_total_quantity(), 0)
    93          self.assertEqual(basket.get_total_amount(), Decimal('0.00'))
    94          self.assertTrue(basket.is_empty)
    95  
    96      def test_delete_basket_item(self):
    97          basket = self.service.get_or_create_basket(customer_profile=self.customer_profile)
    98          self.service.add_basket_item(basket, self.product1)
    99          self.service.add_basket_item(basket, self.product2)
   100          self.service.add_basket_item(basket, self.product2)
   101  
   102          self.service.delete_basket_item(basket, self.product2)
   103          self.assertEqual(basket.get_total_quantity(), 1)
   104          self.assertEqual(basket.get_total_amount(), Decimal('20.00'))
   105  
   106      def test_complete_basket(self):
   107          basket = self.service.get_or_create_basket(customer_profile=self.customer_profile)
   108          with self.assertRaises(BasketEmptyException):
   109              self.service.complete_basket(basket)
   110  
   111          self.service.add_basket_item(basket, self.product1)
   112          self.service.add_basket_item(basket, self.product2)
   113          self.service.add_basket_item(basket, self.product2)
   114  
   115          self.service.complete_basket(basket)
   116          self.assertEqual(basket.status, BasketStatus.completed)
   117  
   118          for bi in basket.basketitem_set.all():
   119              self.assertIsNotNone(bi.amount)
   120  
   121          self.product_service.delete_product(self.product2)
   122  
   123          with self.assertRaises(BasketInvalidException):
   124              self.service.complete_basket(basket)
   125  
   126  
   127  @override_settings(DEFAULT_PRODUCT_PRICE=Decimal('20.00'))
   128  class BasketDiscountedTest(TestCase, BaseTestViewMixin):
   129      def setUp(self):
   130          self.service = BasketService()
   131          self.product_service = ProductService()
   132          self.car_service = CarService()
   133          self.res_service = ReservationService()
   134          self.init_users()
   135          self.store = mommy.make('stores.Store', washer_profile=self.washer_profile,
   136                                  is_approved=True, is_active=True)
   137          self.product1 = self.product_service.create_primary_product(self.store)
   138          self.product2 = self.product_service.create_product(name='Parfume', store=self.store,
   139                                                              washer_profile=self.store.washer_profile)
   140          self.car = self.car_service.create_car(licence_plate="34FH3773", car_type=CarType.sedan,
   141                                                 customer_profile=self.customer_profile)
   142          self.campaign = mommy.make('baskets.Campaign', name='1FreeIn9',
   143                                     promotion_type=PromotionType.one_free_in_nine, priority=0)
   144  
   145      def _create_reservation_and_complete(self, customer):
   146          dt = timezone.now() + datetime.timedelta(minutes=70)
   147          for k in range(9):
   148              dt = dt + datetime.timedelta(minutes=70)
   149              res = self.res_service._create_reservation(self.store, start_datetime=dt, period=70)
   150              basket = self.service.get_or_create_basket(customer_profile=customer)
   151              self.service.clean_basket(basket)
   152              self.service.add_basket_item(basket, self.product1)
   153              self.res_service.occupy(res, customer)
   154              self.res_service.reserve(res, customer)
   155              self.res_service.start(res)
   156              self.res_service.complete(res)
   157  
   158      def test_one_free_in_nine(self):
   159          basket = self.service.get_or_create_basket(customer_profile=self.customer_profile)
   160          self.service.add_basket_item(basket, self.product1)
   161          self.service.apply_discounts(basket)
   162          self.assertEqual(DiscountItem.objects.filter(basket=basket).count(), 0)
   163          self.assertEqual(basket.get_total_amount(), Decimal('20.00'))
   164          self.assertEqual(basket.get_net_amount(), Decimal('20.00'))
   165  
   166          self._create_reservation_and_complete(self.customer_profile)
   167          basket = self.service.get_or_create_basket(self.customer_profile)
   168          self.service.add_basket_item(basket, self.product1)
   169          self.service.apply_discounts(basket)
   170          self.assertEqual(DiscountItem.objects.filter(basket=basket).count(), 1)
   171          self.assertEqual(basket.get_total_amount(), Decimal('20.00'))
   172          self.assertEqual(basket.get_net_amount(), Decimal('0.00'))
   173  
   174          self.service.add_basket_item(basket, self.product2)
   175          self.service.apply_discounts(basket)
   176          self.assertEqual(DiscountItem.objects.filter(basket=basket).count(), 1)
   177          self.assertEqual(basket.discountitem_set.first().campaign, self.campaign)
   178          self.assertEqual(basket.get_total_amount(), Decimal('40.00'))
   179          self.assertEqual(basket.get_net_amount(), Decimal('20.00'))
   180  
   181          dt = timezone.now() + datetime.timedelta(minutes=30)
   182          res = self.res_service._create_reservation(self.store, start_datetime=dt, period=30)
   183          self.res_service.occupy(res, self.customer_profile)
   184          self.res_service.reserve(res, self.customer_profile)
   185  
   186          basket = self.service.clean_basket(basket)
   187          self.service.add_basket_item(basket, self.product1)
   188          self.service.apply_discounts(basket)
   189          self.assertEqual(DiscountItem.objects.filter(basket=basket).count(), 1)
   190          self.assertEqual(basket.get_total_amount(), Decimal('20.00'))
   191          self.assertEqual(basket.get_net_amount(), Decimal('0.00'))
   192  
   193          self.service.add_basket_item(basket, self.product2)
   194          self.service.apply_discounts(basket)
   195          self.assertEqual(DiscountItem.objects.filter(basket=basket).count(), 1)
   196          self.assertEqual(basket.get_total_amount(), Decimal('40.00'))
   197          self.assertEqual(basket.get_net_amount(), Decimal('20.00'))