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.

model_method_tests.py 7.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. from decimal import Decimal as D
  2. from django.test import TestCase
  3. from oscar.apps.shipping.models import OrderAndItemCharges, WeightBased
  4. from oscar.core.compat import get_user_model
  5. from oscar.test import factories
  6. User = get_user_model()
  7. class TestOrderAndItemCharges(TestCase):
  8. def setUp(self):
  9. self.method = OrderAndItemCharges(
  10. price_per_order=D('5.00'), price_per_item=D('1.00'))
  11. def test_tax_is_known(self):
  12. basket = factories.create_basket(empty=True)
  13. charge = self.method.calculate(basket)
  14. self.assertTrue(charge.is_tax_known)
  15. def test_returns_order_level_charge_for_empty_basket(self):
  16. basket = factories.create_basket(empty=True)
  17. charge = self.method.calculate(basket)
  18. self.assertEqual(D('5.00'), charge.incl_tax)
  19. def test_single_item_basket(self):
  20. basket = factories.create_basket(empty=False)
  21. charge = self.method.calculate(basket)
  22. self.assertEqual(D('5.00') + D('1.00'),
  23. charge.incl_tax)
  24. def test_single_item_basket_that_doesnt_require_shipping(self):
  25. # Create a product that doesn't require shipping
  26. record = factories.create_stockrecord()
  27. product = record.product
  28. product.product_class.requires_shipping = False
  29. product.product_class.save()
  30. basket = factories.create_basket(empty=True)
  31. basket.add_product(record.product)
  32. charge = self.method.calculate(basket)
  33. self.assertEqual(D('5.00'), charge.incl_tax)
  34. def test_multi_item_basket(self):
  35. basket = factories.create_basket(empty=True)
  36. record = factories.create_stockrecord()
  37. basket.add_product(record.product, 7)
  38. charge = self.method.calculate(basket)
  39. self.assertEqual(D('5.00') + 7*D('1.00'), charge.incl_tax)
  40. class ZeroFreeThresholdTest(TestCase):
  41. def setUp(self):
  42. self.method = OrderAndItemCharges(
  43. price_per_order=D('10.00'), free_shipping_threshold=D('0.00'))
  44. self.basket = factories.create_basket(empty=True)
  45. def test_free_shipping_with_empty_basket(self):
  46. charge = self.method.calculate(self.basket)
  47. self.assertEqual(D('0.00'), charge.incl_tax)
  48. def test_free_shipping_with_nonempty_basket(self):
  49. record = factories.create_stockrecord(price_excl_tax=D('5.00'))
  50. self.basket.add_product(record.product)
  51. charge = self.method.calculate(self.basket)
  52. self.assertEqual(D('0.00'), charge.incl_tax)
  53. class TestNonZeroFreeThreshold(TestCase):
  54. def setUp(self):
  55. self.method = OrderAndItemCharges(
  56. price_per_order=D('10.00'), free_shipping_threshold=D('20.00'))
  57. self.basket = factories.create_basket(empty=True)
  58. def test_basket_below_threshold(self):
  59. record = factories.create_stockrecord(price_excl_tax=D('5.00'))
  60. self.basket.add_product(record.product)
  61. charge = self.method.calculate(self.basket)
  62. self.assertEqual(D('10.00'), charge.incl_tax)
  63. def test_basket_on_threshold(self):
  64. record = factories.create_stockrecord(price_excl_tax=D('5.00'))
  65. self.basket.add_product(record.product, quantity=4)
  66. charge = self.method.calculate(self.basket)
  67. self.assertEqual(D('0.00'), charge.incl_tax)
  68. def test_basket_above_threshold(self):
  69. record = factories.create_stockrecord(price_excl_tax=D('5.00'))
  70. self.basket.add_product(record.product, quantity=8)
  71. charge = self.method.calculate(self.basket)
  72. self.assertEqual(D('0.00'), charge.incl_tax)
  73. class WeightBasedMethodTests(TestCase):
  74. def setUp(self):
  75. self.standard = WeightBased.objects.create(name='Standard')
  76. self.express = WeightBased.objects.create(name='Express')
  77. def test_zero_weight_baskets_can_have_a_charge(self):
  78. self.standard.bands.create(upper_limit=1, charge=D('4.00'))
  79. charge = self.standard.get_charge(0)
  80. self.assertEqual(D('4.00'), charge)
  81. def test_zero_weight_baskets_can_have_no_charge(self):
  82. self.standard.bands.create(upper_limit=0, charge=D('0.00'))
  83. self.standard.bands.create(upper_limit=1, charge=D('4.00'))
  84. charge = self.standard.get_charge(0)
  85. self.assertEqual(D('0.00'), charge)
  86. def test_get_band_for_zero_weight(self):
  87. self.standard.bands.create(upper_limit=1, charge=D('4.00'))
  88. charge = self.standard.get_charge(0)
  89. self.assertEqual(D('4.00'), charge)
  90. def test_get_band_for_lower_weight(self):
  91. band = self.standard.bands.create(upper_limit=1, charge=D('4.00'))
  92. fetched_band = self.standard.get_band_for_weight(0.5)
  93. self.assertEqual(band.id, fetched_band.id)
  94. def test_get_band_for_higher_weight(self):
  95. self.standard.bands.create(upper_limit=1, charge=D('4.00'))
  96. fetched_band = self.standard.get_band_for_weight(1.5)
  97. self.assertIsNone(fetched_band)
  98. def test_get_band_for_matching_weight(self):
  99. band = self.standard.bands.create(upper_limit=1, charge=D('4.00'))
  100. fetched_band = self.standard.get_band_for_weight(1)
  101. self.assertEqual(band.id, fetched_band.id)
  102. def test_weight_to_is_upper_bound(self):
  103. band = self.standard.bands.create(upper_limit=1, charge=D('4.00'))
  104. self.assertEqual(1, band.weight_to)
  105. def test_weight_from_for_single_band(self):
  106. band = self.standard.bands.create(upper_limit=1, charge=D('4.00'))
  107. self.assertEqual(0, band.weight_from)
  108. def test_weight_from_for_multiple_bands(self):
  109. self.standard.bands.create(upper_limit=1, charge=D('4.00'))
  110. band = self.express.bands.create(upper_limit=2, charge=D('8.00'))
  111. self.assertEqual(0, band.weight_from)
  112. def test_get_band_for_series_of_bands(self):
  113. self.standard.bands.create(upper_limit=1, charge=D('4.00'))
  114. self.standard.bands.create(upper_limit=2, charge=D('8.00'))
  115. self.standard.bands.create(upper_limit=3, charge=D('12.00'))
  116. self.assertEqual(D('4.00'), self.standard.get_band_for_weight(0.5).charge)
  117. self.assertEqual(D('8.00'), self.standard.get_band_for_weight(1.5).charge)
  118. self.assertEqual(D('12.00'), self.standard.get_band_for_weight(2.5).charge)
  119. def test_get_band_for_series_of_bands_from_different_methods(self):
  120. self.express.bands.create(upper_limit=2, charge=D('8.00'))
  121. self.standard.bands.create(upper_limit=1, charge=D('4.00'))
  122. self.standard.bands.create(upper_limit=3, charge=D('12.00'))
  123. self.assertEqual(D('12.00'), self.standard.get_band_for_weight(2.5).charge)
  124. def test_for_smoke_with_basket_charge(self):
  125. basket = factories.create_basket(empty=True)
  126. charge = self.standard.calculate(basket)
  127. self.assertEqual(D('0.00'), charge.incl_tax)
  128. self.assertTrue(charge.is_tax_known)
  129. def test_simple_shipping_cost_scenario_handled_correctly(self):
  130. basket = factories.BasketFactory()
  131. product_attribute_value = factories.ProductAttributeValueFactory(
  132. value_float=2.5)
  133. basket.add_product(product_attribute_value.product)
  134. expected_charge = D('3.00')
  135. self.standard.bands.create(upper_limit=3, charge=expected_charge)
  136. charge = self.standard.calculate(basket)
  137. self.assertEqual(expected_charge, charge.excl_tax)
  138. def test_overflow_shipping_cost_scenario_handled_correctly(self):
  139. basket = factories.BasketFactory()
  140. product_attribute_value = factories.ProductAttributeValueFactory(
  141. value_float=2.5)
  142. basket.add_product(product_attribute_value.product)
  143. self.standard.bands.create(upper_limit=1, charge=D('1.00'))
  144. self.standard.bands.create(upper_limit=2, charge=D('2.00'))
  145. charge = self.standard.calculate(basket)
  146. self.assertEqual(D('1.00') + D('2.00'), charge.excl_tax)