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.1KB

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