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_tax.py 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. from decimal import Decimal as D
  2. from django.test import TestCase
  3. from django.test.utils import override_settings
  4. from oscar.apps.offer import models
  5. from oscar.apps.basket.models import Basket
  6. from oscar.apps.partner import strategy
  7. from oscar.test.basket import add_product
  8. from oscar.test.factories import create_order
  9. class TestAValueBasedOffer(TestCase):
  10. def setUp(self):
  11. # Get 20% if spending more than 20.00
  12. range = models.Range.objects.create(
  13. name="All products", includes_all_products=True)
  14. condition = models.Condition.objects.create(
  15. range=range,
  16. type=models.Condition.VALUE,
  17. value=D('10.00'))
  18. benefit = models.Benefit.objects.create(
  19. range=range,
  20. type=models.Benefit.PERCENTAGE,
  21. value=20)
  22. self.offer = models.ConditionalOffer.objects.create(
  23. name="Test",
  24. offer_type=models.ConditionalOffer.SITE,
  25. condition=condition,
  26. benefit=benefit)
  27. self.basket = Basket.objects.create()
  28. def test_respects_effective_price_when_taxes_not_known(self):
  29. # Assign US style strategy (no tax known)
  30. self.basket.strategy = strategy.US()
  31. # Add sufficient products to meet condition
  32. add_product(self.basket, price=D('6'), quantity=2)
  33. # Ensure discount is correct
  34. result = self.offer.apply_benefit(self.basket)
  35. self.assertEqual(D('2.40'), result.discount)
  36. def test_respects_effective_price_when_taxes_are_known(self):
  37. # Assign UK style strategy (20% tax)
  38. self.basket.strategy = strategy.UK()
  39. # Add sufficient products to meet condition
  40. add_product(self.basket, price=D('10'), quantity=2)
  41. # Ensure discount is calculated against tax-inclusive price
  42. result = self.offer.apply_benefit(self.basket)
  43. self.assertEqual(2 * D('10.00') * D('1.2') * D('0.20'), result.discount)
  44. order = create_order(basket=self.basket)
  45. self.assertEqual(order.basket_total_before_discounts_excl_tax, D('20'))
  46. self.assertEqual(order.basket_total_before_discounts_incl_tax, D('24'))
  47. self.assertEqual(order.total_before_discounts_incl_tax, D('24'))
  48. self.assertEqual(order.total_before_discounts_excl_tax, D('20'))
  49. self.assertEqual(order.total_discount_excl_tax, D('4.8'))
  50. self.assertEqual(order.total_discount_incl_tax, D('5.76'))
  51. @override_settings(OSCAR_OFFERS_INCL_TAX=True)
  52. def test_respects_effective_price_when_taxes_are_known_and_offer_is_tax_inclusive(self):
  53. self.basket.strategy = strategy.UK()
  54. add_product(self.basket, price=D('10'), quantity=2)
  55. result = self.offer.apply_benefit(self.basket)
  56. self.assertEqual(2 * D('10.00') * D('1.2') * D('0.20'), result.discount)
  57. order = create_order(basket=self.basket)
  58. self.assertEqual(order.total_before_discounts_incl_tax, D('24'))
  59. self.assertEqual(order.total_before_discounts_excl_tax, D('20'))
  60. self.assertEqual(order.total_discount_excl_tax, D('4'))
  61. self.assertEqual(order.total_discount_incl_tax, D('4.8'))