Coverage for src/shopping_bags/services.py: 77%

22 statements  

« prev     ^ index     » next       coverage.py v7.9.2, created at 2025-08-04 12:59 +0300

1from rest_framework.exceptions import ValidationError, NotFound 

2 

3from src.shopping_bags.models import ShoppingBag 

4from src.common.services import UserIdentificationService 

5from src.shopping_bags.constants import ShoppingBagErrorMessages 

6from src.products.models.inventory import Inventory 

7 

8 

9class ShoppingBagService: 

10 """ 

11 This class encapsulates all business logic related to shopping bag functionality, 

12 including user identification, inventory validation, and quantity management. 

13 

14 Key Responsibilities: 

15 - Inventory object retrieval and validation 

16 - Stock quantity validation 

17 - Atomic database operations for inventory updates 

18 - Shopping bag item creation and retrieval 

19 """ 

20 

21 @staticmethod 

22 def get_user_identifier(request): 

23 return UserIdentificationService.get_user_identifier(request) 

24 

25 @staticmethod 

26 def get_inventory_object(inventory_id): 

27 """ 

28 Retrieve an inventory object by its ID. 

29 """ 

30 try: 

31 return Inventory.objects.get(pk=inventory_id) 

32 except Inventory.DoesNotExist: 

33 raise NotFound(ShoppingBagErrorMessages.PRODUCT_NOT_FOUND) 

34 

35 @staticmethod 

36 def validate_inventory_quantity(inventory_obj, required_quantity): 

37 if required_quantity > inventory_obj.quantity: 

38 raise ValidationError( 

39 { 

40 'quantity': ShoppingBagErrorMessages.INSUFFICIENT_STOCK.format( 

41 quantity=inventory_obj.quantity 

42 ) 

43 } 

44 ) 

45 

46 @staticmethod 

47 def get_or_create_bag_item(filters, defaults): 

48 return ShoppingBag.objects.get_or_create(**filters, defaults=defaults)