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_applicator.py 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. from decimal import Decimal as D
  2. from unittest.mock import Mock
  3. from django.test import TestCase
  4. from oscar.apps.offer import models
  5. from oscar.apps.offer.results import OfferApplications
  6. from oscar.apps.offer.utils import Applicator
  7. from oscar.test.basket import add_product
  8. from oscar.test.factories import (
  9. BasketFactory, BenefitFactory, ConditionalOfferFactory, ConditionFactory,
  10. RangeFactory)
  11. class TestOfferApplicator(TestCase):
  12. def setUp(self):
  13. self.applicator = Applicator()
  14. self.basket = BasketFactory()
  15. rng = RangeFactory(includes_all_products=True)
  16. self.condition = ConditionFactory(
  17. range=rng, type=ConditionFactory._meta.model.VALUE,
  18. value=D('100'), proxy_class=None)
  19. self.benefit = BenefitFactory(
  20. range=rng, type=BenefitFactory._meta.model.FIXED,
  21. value=D('10'))
  22. def test_applies_offer_multiple_times_by_default(self):
  23. add_product(self.basket, D('100'), 5)
  24. offer = ConditionalOfferFactory(
  25. pk=1, condition=self.condition, benefit=self.benefit)
  26. self.applicator.apply
  27. self.applicator.apply_offers(self.basket, [offer])
  28. line = self.basket.all_lines()[0]
  29. self.assertTrue(line.quantity_with_offer_discount(offer) == 5)
  30. def test_respects_maximum_applications_field(self):
  31. add_product(self.basket, D('100'), 5)
  32. offer = ConditionalOfferFactory(
  33. pk=1, condition=self.condition, benefit=self.benefit,
  34. max_basket_applications=1)
  35. self.applicator.apply_offers(self.basket, [offer])
  36. line = self.basket.all_lines()[0]
  37. self.assertTrue(line.quantity_with_offer_discount(offer) == 5)
  38. applications = self.basket.offer_applications.applications
  39. self.assertTrue(applications[1]['freq'] == 1)
  40. def test_uses_offers_in_order_of_descending_priority(self):
  41. self.applicator.get_site_offers = Mock(
  42. return_value=[models.ConditionalOffer(
  43. name="offer1", condition=self.condition, benefit=self.benefit,
  44. priority=1)])
  45. self.applicator.get_user_offers = Mock(
  46. return_value=[models.ConditionalOffer(
  47. name="offer2", condition=self.condition, benefit=self.benefit,
  48. priority=-1)])
  49. offers = self.applicator.get_offers(self.basket)
  50. priorities = [offer.priority for offer in offers]
  51. self.assertEqual(sorted(priorities, reverse=True), priorities)
  52. def test_get_site_offers(self):
  53. models.ConditionalOffer.objects.create(
  54. name="globaloffer", condition=self.condition,
  55. benefit=self.benefit, offer_type=models.ConditionalOffer.SITE)
  56. models.ConditionalOffer.objects.create(
  57. name="sessionoffer", condition=self.condition,
  58. benefit=self.benefit, offer_type=models.ConditionalOffer.SESSION)
  59. site_offers = Applicator().get_site_offers()
  60. # Only one offer should be returned
  61. self.assertEqual(len(site_offers), 1)
  62. self.assertEqual(site_offers[0].name, "globaloffer")
  63. class TestOfferApplicationsWrapper(TestCase):
  64. def setUp(self):
  65. offer = models.ConditionalOffer()
  66. self.applications = OfferApplications()
  67. for i in range(4):
  68. self.applications.add(offer, models.BasketDiscount(D('5.00')))
  69. def test_is_iterable(self):
  70. for discount in self.applications:
  71. pass
  72. def test_aggregates_results_from_same_offer(self):
  73. self.assertEqual(1, len(list(self.applications)))