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.

creator_tests.py 6.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. from decimal import Decimal as D
  2. from django.test import TestCase
  3. from django.test.utils import override_settings
  4. from mock import Mock
  5. from oscar.apps.basket.models import Basket
  6. from oscar.apps.catalogue.models import ProductClass, Product
  7. from oscar.apps.offer.utils import Applicator
  8. from oscar.apps.order.models import Order
  9. from oscar.apps.order.utils import OrderCreator
  10. from oscar.apps.shipping.methods import FixedPrice, Free
  11. from oscar.apps.shipping.repository import Repository
  12. from oscar.core.loading import get_class
  13. from oscar.test.factories import create_product, create_offer
  14. Range = get_class('offer.models', 'Range')
  15. Benefit = get_class('offer.models', 'Benefit')
  16. class TestOrderCreatorErrorCases(TestCase):
  17. def setUp(self):
  18. self.creator = OrderCreator()
  19. self.basket = Basket()
  20. def test_raises_exception_when_empty_basket_passed(self):
  21. with self.assertRaises(ValueError):
  22. self.creator.place_order(basket=self.basket)
  23. def test_raises_exception_if_duplicate_order_number_passed(self):
  24. self.basket.add_product(create_product(price=D('12.00')))
  25. self.creator.place_order(basket=self.basket, order_number='1234')
  26. with self.assertRaises(ValueError):
  27. self.creator.place_order(basket=self.basket, order_number='1234')
  28. class TestSuccessfulOrderCreation(TestCase):
  29. def setUp(self):
  30. self.creator = OrderCreator()
  31. self.basket = Basket.objects.create()
  32. def tearDown(self):
  33. Order.objects.all().delete()
  34. def test_creates_order_and_line_models(self):
  35. self.basket.add_product(create_product(price=D('12.00')))
  36. self.creator.place_order(basket=self.basket, order_number='1234')
  37. order = Order.objects.get(number='1234')
  38. lines = order.lines.all()
  39. self.assertEqual(1, len(lines))
  40. def test_sets_correct_order_status(self):
  41. self.basket.add_product(create_product(price=D('12.00')))
  42. self.creator.place_order(basket=self.basket, order_number='1234', status='Active')
  43. order = Order.objects.get(number='1234')
  44. self.assertEqual('Active', order.status)
  45. def test_defaults_to_using_free_shipping(self):
  46. self.basket.add_product(create_product(price=D('12.00')))
  47. self.creator.place_order(basket=self.basket, order_number='1234')
  48. order = Order.objects.get(number='1234')
  49. self.assertEqual(order.total_incl_tax, self.basket.total_incl_tax)
  50. self.assertEqual(order.total_excl_tax, self.basket.total_excl_tax)
  51. def test_defaults_to_setting_totals_to_basket_totals(self):
  52. self.basket.add_product(create_product(price=D('12.00')))
  53. method = Mock()
  54. method.is_discounted = False
  55. method.basket_charge_incl_tax = Mock(return_value=D('2.00'))
  56. method.basket_charge_excl_tax = Mock(return_value=D('2.00'))
  57. self.creator.place_order(basket=self.basket, order_number='1234', shipping_method=method)
  58. order = Order.objects.get(number='1234')
  59. self.assertEqual(order.total_incl_tax, self.basket.total_incl_tax + D('2.00'))
  60. self.assertEqual(order.total_excl_tax, self.basket.total_excl_tax + D('2.00'))
  61. def test_uses_default_order_status_from_settings(self):
  62. self.basket.add_product(create_product(price=D('12.00')))
  63. with override_settings(OSCAR_INITIAL_ORDER_STATUS='A'):
  64. self.creator.place_order(basket=self.basket, order_number='1234')
  65. order = Order.objects.get(number='1234')
  66. self.assertEqual('A', order.status)
  67. def test_uses_default_line_status_from_settings(self):
  68. self.basket.add_product(create_product(price=D('12.00')))
  69. with override_settings(OSCAR_INITIAL_LINE_STATUS='A'):
  70. self.creator.place_order(basket=self.basket, order_number='1234')
  71. order = Order.objects.get(number='1234')
  72. line = order.lines.all()[0]
  73. self.assertEqual('A', line.status)
  74. class TestPlacingOrderForDigitalGoods(TestCase):
  75. def setUp(self):
  76. self.creator = OrderCreator()
  77. self.basket = Basket.objects.create()
  78. def test_does_not_allocate_stock(self):
  79. ProductClass.objects.create(
  80. name="Digital", track_stock=False)
  81. product = create_product(
  82. price=D('9.99'), product_class="Digital", num_in_stock=None)
  83. self.assertTrue(product.stockrecord.num_in_stock is None)
  84. self.assertTrue(product.stockrecord.num_allocated is None)
  85. self.basket.add_product(product)
  86. self.creator.place_order(basket=self.basket, order_number='1234')
  87. product_ = Product.objects.get(id=product.id)
  88. self.assertTrue(product_.stockrecord.num_in_stock is None)
  89. self.assertTrue(product_.stockrecord.num_allocated is None)
  90. class StubRepository(Repository):
  91. """ Custom shipping methods """
  92. methods = (FixedPrice(D('5.00')), Free())
  93. class TestShippingOfferForOrder(TestCase):
  94. def setUp(self):
  95. self.creator = OrderCreator()
  96. self.basket = Basket.objects.create()
  97. def apply_20percent_shipping_offer(self):
  98. """Shipping offer 20% off"""
  99. range = Range.objects.create(name="All products range",
  100. includes_all_products=True)
  101. benefit = Benefit.objects.create(
  102. range=range, type=Benefit.SHIPPING_PERCENTAGE, value=20)
  103. offer = create_offer(range=range, benefit=benefit)
  104. Applicator().apply_offers(self.basket, [offer])
  105. def test_shipping_offer_is_applied(self):
  106. self.basket.add_product(create_product(price=D('12.00')))
  107. self.apply_20percent_shipping_offer()
  108. # Normal shipping 5.00
  109. shipping = StubRepository().find_by_code(FixedPrice.code, self.basket)
  110. self.creator.place_order(
  111. basket=self.basket,
  112. order_number='1234',
  113. shipping_method=shipping)
  114. order = Order.objects.get(number='1234')
  115. self.assertEqual(1, len(order.shipping_discounts))
  116. self.assertEqual(D('4.00'), order.shipping_incl_tax)
  117. self.assertEqual(D('16.00'), order.total_incl_tax)
  118. def test_zero_shipping_discount_is_not_created(self):
  119. self.basket.add_product(create_product(price=D('12.00')))
  120. self.apply_20percent_shipping_offer()
  121. # Free shipping
  122. shipping = StubRepository().find_by_code(Free.code, self.basket)
  123. self.creator.place_order(
  124. basket=self.basket,
  125. order_number='1234',
  126. shipping_method=shipping)
  127. order = Order.objects.get(number='1234')
  128. # No shipping discount
  129. self.assertEqual(0, len(order.shipping_discounts))
  130. self.assertEqual(D('0.00'), order.shipping_incl_tax)
  131. self.assertEqual(D('12.00'), order.total_incl_tax)