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.

shipping_benefit_tests.py 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. from decimal import Decimal as D
  2. from django.test import TestCase
  3. from django.test.client import RequestFactory
  4. from django_dynamic_fixture import G
  5. import mock
  6. from oscar.apps.offer import models, utils
  7. from oscar.apps.basket.models import Basket
  8. from oscar.apps.order.utils import OrderCreator
  9. from oscar.apps.shipping.repository import Repository
  10. from oscar.apps.shipping.methods import FixedPrice
  11. from oscar.test.factories import create_product
  12. def create_offer():
  13. range = models.Range.objects.create(
  14. name="All products", includes_all_products=True)
  15. condition = models.CountCondition.objects.create(
  16. range=range,
  17. type=models.Condition.COUNT,
  18. value=1)
  19. benefit = models.ShippingFixedPriceBenefit.objects.create(
  20. type=models.Benefit.SHIPPING_FIXED_PRICE,
  21. value=D('1.00'))
  22. return models.ConditionalOffer.objects.create(
  23. condition=condition,
  24. benefit=benefit,
  25. offer_type=models.ConditionalOffer.SITE)
  26. def apply_offers(basket):
  27. req = RequestFactory().get('/')
  28. req.user = mock.Mock()
  29. utils.Applicator().apply(req, basket)
  30. class StubRepository(Repository):
  31. """
  32. Stubbed shipped repository which overrides the get_shipping_methods method
  33. in order to use a non-free default shipping method. This allows the
  34. shipping discounts to be tested.
  35. """
  36. def get_shipping_methods(self, basket):
  37. methods = [FixedPrice(D('10.00'))]
  38. return self.prime_methods(basket, methods)
  39. class TestAnOfferWithAShippingBenefit(TestCase):
  40. def setUp(self):
  41. self.basket = G(Basket)
  42. create_offer()
  43. def test_applies_correctly_to_basket_which_matches_condition(self):
  44. for product in [create_product(price=D('12.00'))]:
  45. self.basket.add_product(product, 1)
  46. apply_offers(self.basket)
  47. self.assertEqual(1, len(self.basket.offer_applications))
  48. def test_applies_correctly_to_basket_which_exceeds_condition(self):
  49. for product in [create_product(price=D('12.00'))]:
  50. self.basket.add_product(product, 2)
  51. apply_offers(self.basket)
  52. self.assertEqual(1, len(self.basket.offer_applications))
  53. def test_wraps_shipping_method_from_repository(self):
  54. for product in [create_product(price=D('12.00'))]:
  55. self.basket.add_product(product, 1)
  56. apply_offers(self.basket)
  57. methods = StubRepository().get_shipping_methods(self.basket)
  58. method = methods[0]
  59. self.assertTrue(method.is_discounted)
  60. self.assertEqual(D('1.00'), method.basket_charge_incl_tax())
  61. def test_has_discount_recorded_correctly_when_order_is_placed(self):
  62. for product in [create_product(price=D('12.00'))]:
  63. self.basket.add_product(product, 1)
  64. apply_offers(self.basket)
  65. methods = StubRepository().get_shipping_methods(self.basket)
  66. method = methods[0]
  67. creator = OrderCreator()
  68. order = creator.place_order(self.basket, shipping_method=method)
  69. discounts = order.discounts.all()
  70. self.assertEqual(1, len(discounts))
  71. discount = discounts[0]
  72. self.assertTrue(discount.is_shipping_discount)
  73. self.assertEqual(D('9.00'), discount.amount)