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.

post_order_action_tests.py 2.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from decimal import Decimal as D
  2. from django.test import TestCase
  3. from django.test.client import RequestFactory
  4. import mock
  5. from oscar.apps.offer import models, utils, custom
  6. from oscar.test import factories
  7. from oscar.test.basket import add_product
  8. class CustomAction(models.Benefit):
  9. class Meta:
  10. proxy = True
  11. def apply(self, basket, condition, offer):
  12. condition.consume_items(offer, basket, ())
  13. return models.PostOrderAction(
  14. "Something will happen")
  15. def apply_deferred(self, basket, order, application):
  16. return "Something happened"
  17. @property
  18. def description(self):
  19. return "Will do something"
  20. def create_offer():
  21. range = models.Range.objects.create(
  22. name="All products", includes_all_products=True)
  23. condition = models.CountCondition.objects.create(
  24. range=range,
  25. type=models.Condition.COUNT,
  26. value=1)
  27. benefit = custom.create_benefit(CustomAction)
  28. return models.ConditionalOffer.objects.create(
  29. condition=condition,
  30. benefit=benefit,
  31. offer_type=models.ConditionalOffer.SITE)
  32. def apply_offers(basket):
  33. req = RequestFactory().get('/')
  34. req.user = mock.Mock()
  35. utils.Applicator().apply(req, basket)
  36. class TestAnOfferWithAPostOrderAction(TestCase):
  37. def setUp(self):
  38. self.basket = factories.create_basket(empty=True)
  39. add_product(self.basket, D('12.00'), 1)
  40. create_offer()
  41. apply_offers(self.basket)
  42. def test_applies_correctly_to_basket_which_meets_condition(self):
  43. self.assertEqual(1, len(self.basket.offer_applications))
  44. self.assertEqual(
  45. 1, len(self.basket.offer_applications.post_order_actions))
  46. action = self.basket.offer_applications.post_order_actions[0]
  47. self.assertEqual('Something will happen', action['description'])
  48. def test_has_discount_recorded_correctly_when_order_is_placed(self):
  49. order = factories.create_order(basket=self.basket)
  50. discounts = order.discounts.all()
  51. self.assertEqual(1, len(discounts))
  52. self.assertEqual(1, len(order.post_order_actions))
  53. discount = discounts[0]
  54. self.assertTrue(discount.is_post_order_action)
  55. self.assertEqual(D('0.00'), discount.amount)
  56. self.assertEqual('Something happened', discount.message)