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'))