You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_upsell_messages.py 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. from decimal import Decimal as D
  2. from django.test.client import RequestFactory
  3. from django.urls import reverse
  4. from django.utils.timezone import now
  5. from oscar.apps.basket.views import BasketView
  6. from oscar.apps.offer.applicator import Applicator
  7. from oscar.core.loading import get_class
  8. from oscar.test import factories
  9. from oscar.test.testcases import WebTestCase
  10. Selector = get_class('partner.strategy', 'Selector')
  11. class TestUpsellMessages(WebTestCase):
  12. def setUp(self):
  13. super().setUp()
  14. self.basket = factories.create_basket(empty=True)
  15. # Create range and add one product to it.
  16. rng = factories.RangeFactory(name='All products', includes_all_products=True)
  17. self.product = factories.ProductFactory()
  18. rng.add_product(self.product)
  19. # Create offer #1.
  20. condition1 = factories.ConditionFactory(
  21. range=rng, type=factories.ConditionFactory._meta.model.COUNT, value=D('2'),
  22. )
  23. benefit1 = factories.BenefitFactory(
  24. range=rng, type=factories.BenefitFactory._meta.model.MULTIBUY, value=None,
  25. )
  26. self.offer1 = factories.ConditionalOfferFactory(
  27. condition=condition1, benefit=benefit1,
  28. slug='offer-1',
  29. start_datetime=now(),
  30. name='Test offer #1',
  31. priority=1,
  32. )
  33. # Create offer #2.
  34. condition2 = factories.ConditionFactory(
  35. range=rng, type=factories.ConditionFactory._meta.model.VALUE, value=D('1.99'),
  36. )
  37. benefit2 = factories.BenefitFactory(
  38. range=rng, type=factories.BenefitFactory._meta.model.MULTIBUY, value=None,
  39. )
  40. self.offer2 = factories.ConditionalOfferFactory(
  41. condition=condition2,
  42. benefit=benefit2,
  43. slug='offer-2',
  44. start_datetime=now(),
  45. name='Test offer #2',
  46. )
  47. # Create offer #3.
  48. condition3 = factories.ConditionFactory(
  49. range=rng, type=factories.ConditionFactory._meta.model.COVERAGE, value=1,
  50. )
  51. benefit3 = factories.BenefitFactory(
  52. range=rng, type=factories.BenefitFactory._meta.model.MULTIBUY, value=None,
  53. )
  54. self.offer3 = factories.ConditionalOfferFactory(
  55. condition=condition3,
  56. benefit=benefit3,
  57. slug='offer-3',
  58. start_datetime=now(),
  59. name='Test offer #3',
  60. )
  61. # Prepare `BasketView` to use `get_upsell_messages` method in tests.
  62. self.view = BasketView()
  63. self.view.request = RequestFactory().get(reverse('basket:summary'))
  64. self.view.request.user = factories.UserFactory()
  65. self.view.args = []
  66. self.view.kwargs = {}
  67. def add_product(self):
  68. self.basket.add_product(self.product)
  69. self.basket.strategy = Selector().strategy()
  70. Applicator().apply(self.basket)
  71. self.assertBasketUpsellMessagesAreNotNone()
  72. def assertBasketUpsellMessagesAreNotNone(self):
  73. messages = self.view.get_upsell_messages(self.basket)
  74. for message_data in messages:
  75. # E.g. message data:
  76. # {
  77. # 'message': 'Buy 1 more product from All products',
  78. # 'offer': <ConditionalOffer: Test offer #1>
  79. # }.
  80. self.assertIsNotNone(message_data['message'])
  81. self.assertIsNotNone(message_data['offer'])
  82. def assertOffersApplied(self, offers):
  83. applied_offers = self.basket.applied_offers()
  84. self.assertEqual(len(offers), len(applied_offers))
  85. for offer in offers:
  86. self.assertIn(offer.id, applied_offers, msg=offer)
  87. def test_upsell_messages(self):
  88. # The basket is empty. No offers are applied.
  89. self.assertEqual(self.offer1.get_upsell_message(self.basket), 'Buy 2 more products from All products')
  90. self.assertEqual(self.offer2.get_upsell_message(self.basket), 'Spend £1.99 more from All products')
  91. self.assertEqual(self.offer3.get_upsell_message(self.basket), 'Buy 1 more product from All products')
  92. self.add_product()
  93. # 1 product in the basket. Offer #2 is applied.
  94. self.assertOffersApplied([self.offer2])
  95. self.assertEqual(self.offer1.get_upsell_message(self.basket), 'Buy 1 more product from All products')
  96. self.assertIsNone(self.offer2.get_upsell_message(self.basket))
  97. self.assertEqual(self.offer3.get_upsell_message(self.basket), 'Buy 1 more product from All products')
  98. self.add_product()
  99. # 2 products in the basket. Offers #1 is applied.
  100. self.assertOffersApplied([self.offer1])
  101. self.assertIsNone(self.offer1.get_upsell_message(self.basket))
  102. self.assertEqual(self.offer2.get_upsell_message(self.basket), 'Spend £1.99 more from All products')
  103. self.assertEqual(self.offer3.get_upsell_message(self.basket), 'Buy 1 more product from All products')
  104. self.add_product()
  105. # 3 products in the basket. Offers #1 and #2 are applied.
  106. self.assertOffersApplied([self.offer1, self.offer2])
  107. self.assertIsNone(self.offer1.get_upsell_message(self.basket))
  108. self.assertIsNone(self.offer2.get_upsell_message(self.basket))
  109. self.assertEqual(self.offer3.get_upsell_message(self.basket), 'Buy 1 more product from All products')
  110. self.add_product()
  111. # 4 products in the basket. All offers are applied.
  112. self.assertOffersApplied([self.offer1, self.offer2, self.offer3])
  113. self.assertIsNone(self.offer1.get_upsell_message(self.basket))
  114. self.assertIsNone(self.offer2.get_upsell_message(self.basket))
  115. self.assertIsNone(self.offer3.get_upsell_message(self.basket))