Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

test_utils.py 4.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import pytest
  2. from oscar.apps.offer.applicator import Applicator
  3. from oscar.test.factories import (
  4. BasketFactory, ConditionalOfferFactory, ProductFactory)
  5. @pytest.fixture
  6. def filled_basket():
  7. basket = BasketFactory()
  8. product1 = ProductFactory()
  9. product2 = ProductFactory()
  10. basket.add_product(product1, quantity=10)
  11. basket.add_product(product2, quantity=20)
  12. return basket
  13. @pytest.fixture
  14. def single_offer():
  15. return ConditionalOfferFactory(
  16. condition__range__includes_all_products=True,
  17. condition__value=1,
  18. benefit__range__includes_all_products=True,
  19. benefit__max_affected_items=1,
  20. name='offer1',
  21. exclusive=False,
  22. )
  23. @pytest.fixture
  24. def multi_offers():
  25. offer1 = ConditionalOfferFactory(
  26. condition__range__includes_all_products=True,
  27. benefit__range__includes_all_products=True,
  28. name='offer1',
  29. exclusive=False,
  30. )
  31. offer2 = ConditionalOfferFactory(
  32. condition__range__includes_all_products=True,
  33. benefit__range__includes_all_products=True,
  34. name='offer2',
  35. exclusive=False
  36. )
  37. offer3 = ConditionalOfferFactory(
  38. condition__range__includes_all_products=True,
  39. benefit__range__includes_all_products=True,
  40. name='offer3',
  41. exclusive=False
  42. )
  43. return offer1, offer2, offer3
  44. @pytest.mark.django_db
  45. class TestLineOfferConsumer:
  46. def test_consumed_no_offer(self, filled_basket):
  47. for line in filled_basket.all_lines():
  48. assert line.consumer.consumed() == 0
  49. def test_consumed_with_offer(self, filled_basket):
  50. offer1 = ConditionalOfferFactory(name='offer1')
  51. offer2 = ConditionalOfferFactory(name='offer2')
  52. offer1.exclusive = False
  53. offer2.exclusive = False
  54. for line in filled_basket.all_lines():
  55. assert line.consumer.consumed(offer1) == 0
  56. assert line.consumer.consumed(offer2) == 0
  57. line1 = filled_basket.all_lines()[0]
  58. line2 = filled_basket.all_lines()[1]
  59. line1.consumer.consume(1, offer1)
  60. assert line1.consumer.consumed() == 1
  61. assert line1.consumer.consumed(offer1) == 1
  62. assert line1.consumer.consumed(offer2) == 0
  63. line1.consumer.consume(9, offer1)
  64. assert line1.consumer.consumed() == line1.quantity
  65. assert line1.consumer.consumed(offer1) == line1.quantity
  66. assert line1.consumer.consumed(offer2) == 0
  67. line1.consumer.consume(99, offer1)
  68. assert line1.consumer.consumed(offer1) == line1.quantity
  69. assert line1.consumer.consumed(offer2) == 0
  70. line1.consumer.consume(1, offer2)
  71. line2.consumer.consume(1, offer2)
  72. assert line1.consumer.consumed(offer2) == 1
  73. assert line2.consumer.consumed(offer2) == 1
  74. def test_consume(self, filled_basket):
  75. line = filled_basket.all_lines()[0]
  76. line.consume(1)
  77. assert line.quantity_with_discount == 1
  78. line.consume(99)
  79. assert line.quantity_with_discount == 10
  80. def test_consumed_with_exclusive_offer(self, filled_basket):
  81. offer1 = ConditionalOfferFactory(name='offer1')
  82. offer2 = ConditionalOfferFactory(name='offer2')
  83. offer3 = ConditionalOfferFactory(name='offer3')
  84. offer1.exclusive = True
  85. offer2.exclusive = False
  86. offer3.exclusive = False
  87. for line in filled_basket.all_lines():
  88. assert line.consumer.consumed(offer1) == 0
  89. assert line.consumer.consumed(offer2) == 0
  90. line1, line2 = list(filled_basket.all_lines())
  91. line1.consumer.consume(1, offer1)
  92. # offer1 is exclusive so that blocks other offers
  93. assert line1.is_available_for_offer_discount(offer2) is False
  94. line1.consumer.consume(99, offer1)
  95. # ran out of room for offer1
  96. assert line1.is_available_for_offer_discount(offer1) is False
  97. # offer2 was never an option
  98. assert line1.is_available_for_offer_discount(offer2) is False
  99. # exclusivity is per line so line2 is available for offer2
  100. line2.consumer.consume(1, offer2)
  101. # nope: exclusive and non-exclusive don't mix
  102. assert line2.is_available_for_offer_discount(offer1) is False
  103. line2.consumer.consume(99, offer2)
  104. # ran out of room for offer2
  105. assert line2.is_available_for_offer_discount(offer1) is False
  106. # but still room for offer3!
  107. assert line2.is_available_for_offer_discount(offer3) is True
  108. def test_consumed_by_application(self, filled_basket, single_offer):
  109. basket = filled_basket
  110. Applicator().apply(basket)
  111. assert len(basket.offer_applications.offer_discounts) == 1
  112. assert [x.consumer.consumed() for x in basket.all_lines()] == [1, 0]