選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

test_strategy.py 5.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. from decimal import Decimal as D
  2. from django.test import TestCase
  3. from oscar.apps.basket.models import Line
  4. from oscar.apps.catalogue import models
  5. from oscar.apps.partner import strategy
  6. from oscar.test import factories
  7. class TestDefaultStrategy(TestCase):
  8. def setUp(self):
  9. self.strategy = strategy.Default()
  10. def test_no_stockrecords(self):
  11. product = factories.create_product()
  12. info = self.strategy.fetch_for_product(product)
  13. self.assertFalse(info.availability.is_available_to_buy)
  14. self.assertIsNone(info.price.incl_tax)
  15. def test_one_stockrecord(self):
  16. product = factories.create_product(price=D("1.99"), num_in_stock=4)
  17. info = self.strategy.fetch_for_product(product)
  18. self.assertTrue(info.availability.is_available_to_buy)
  19. self.assertEqual(D("1.99"), info.price.excl_tax)
  20. self.assertEqual(D("1.99"), info.price.incl_tax)
  21. def test_product_which_doesnt_track_stock(self):
  22. product_class = models.ProductClass.objects.create(
  23. name="Digital", track_stock=False
  24. )
  25. product = factories.create_product(
  26. product_class=product_class, price=D("1.99"), num_in_stock=None
  27. )
  28. info = self.strategy.fetch_for_product(product)
  29. self.assertTrue(info.availability.is_available_to_buy)
  30. def test_line_method_is_same_as_product_one(self):
  31. product = factories.create_product()
  32. line = Line(product=product)
  33. info = self.strategy.fetch_for_line(line)
  34. self.assertFalse(info.availability.is_available_to_buy)
  35. self.assertIsNone(info.price.incl_tax)
  36. def test_free_product_is_available_to_buy(self):
  37. product = factories.create_product(price=D("0"), num_in_stock=1)
  38. info = self.strategy.fetch_for_product(product)
  39. self.assertTrue(info.availability.is_available_to_buy)
  40. self.assertTrue(info.price.exists)
  41. def test_availability_does_not_require_price(self):
  42. # regression test for https://github.com/django-oscar/django-oscar/issues/2664
  43. # The availability policy should be independent of price.
  44. product_class = factories.ProductClassFactory(track_stock=False)
  45. product = factories.ProductFactory(product_class=product_class, stockrecords=[])
  46. factories.StockRecordFactory(price=None, product=product)
  47. info = self.strategy.fetch_for_product(product)
  48. self.assertTrue(info.availability.is_available_to_buy)
  49. class TestDefaultStrategyForParentProductWhoseVariantsHaveNoStockRecords(TestCase):
  50. def setUp(self):
  51. self.strategy = strategy.Default()
  52. parent = factories.create_product(structure="parent")
  53. for _ in range(3):
  54. factories.create_product(parent=parent)
  55. self.info = self.strategy.fetch_for_parent(parent)
  56. def test_specifies_product_is_unavailable(self):
  57. self.assertFalse(self.info.availability.is_available_to_buy)
  58. def test_specifies_correct_availability_code(self):
  59. self.assertEqual("unavailable", self.info.availability.code)
  60. def test_specifies_product_has_no_price(self):
  61. self.assertFalse(self.info.price.exists)
  62. class TestDefaultStrategyForParentProductWithInStockVariant(TestCase):
  63. def setUp(self):
  64. self.strategy = strategy.Default()
  65. parent = factories.create_product(structure="parent")
  66. factories.create_product(parent=parent, price=D("10.00"), num_in_stock=3)
  67. for _ in range(2):
  68. factories.create_product(parent=parent)
  69. self.info = self.strategy.fetch_for_parent(parent)
  70. def test_specifies_product_is_available(self):
  71. self.assertTrue(self.info.availability.is_available_to_buy)
  72. def test_specifies_correct_availability_code(self):
  73. self.assertEqual("available", self.info.availability.code)
  74. def test_specifies_product_has_correct_price(self):
  75. self.assertEqual(D("10.00"), self.info.price.incl_tax)
  76. class TestDefaultStrategyForParentProductWithOutOfStockVariant(TestCase):
  77. def setUp(self):
  78. self.strategy = strategy.Default()
  79. parent = factories.create_product(structure="parent")
  80. factories.create_product(parent=parent, price=D("10.00"), num_in_stock=0)
  81. for _ in range(2):
  82. factories.create_product(parent=parent)
  83. self.info = self.strategy.fetch_for_parent(parent)
  84. def test_specifies_product_is_unavailable(self):
  85. self.assertFalse(self.info.availability.is_available_to_buy)
  86. def test_specifies_correct_availability_code(self):
  87. self.assertEqual("unavailable", self.info.availability.code)
  88. def test_specifies_product_has_correct_price(self):
  89. self.assertEqual(D("10.00"), self.info.price.incl_tax)
  90. class TestFixedRateTax(TestCase):
  91. def test_pricing_policy_unavailable_if_no_price_excl_tax(self):
  92. product = factories.ProductFactory(stockrecords=[])
  93. factories.StockRecordFactory(price=None, product=product)
  94. info = strategy.UK().fetch_for_product(product)
  95. self.assertFalse(info.price.exists)
  96. class TestDeferredTax(TestCase):
  97. def test_pricing_policy_unavailable_if_no_price_excl_tax(self):
  98. product = factories.ProductFactory(stockrecords=[])
  99. factories.StockRecordFactory(price=None, product=product)
  100. info = strategy.US().fetch_for_product(product)
  101. self.assertFalse(info.price.exists)