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 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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.order.models import Order
  7. from oscar.test.factories import create_product
  8. from oscar.apps.order.utils import OrderCreator
  9. from oscar.apps.catalogue.models import ProductClass, Product
  10. class TestOrderCreatorErrorCases(TestCase):
  11. def setUp(self):
  12. self.creator = OrderCreator()
  13. self.basket = Basket()
  14. def test_raises_exception_when_empty_basket_passed(self):
  15. with self.assertRaises(ValueError):
  16. self.creator.place_order(basket=self.basket)
  17. def test_raises_exception_if_duplicate_order_number_passed(self):
  18. self.basket.add_product(create_product(price=D('12.00')))
  19. self.creator.place_order(basket=self.basket, order_number='1234')
  20. with self.assertRaises(ValueError):
  21. self.creator.place_order(basket=self.basket, order_number='1234')
  22. class TestSuccessfulOrderCreation(TestCase):
  23. def setUp(self):
  24. self.creator = OrderCreator()
  25. self.basket = Basket.objects.create()
  26. def tearDown(self):
  27. Order.objects.all().delete()
  28. def test_creates_order_and_line_models(self):
  29. self.basket.add_product(create_product(price=D('12.00')))
  30. self.creator.place_order(basket=self.basket, order_number='1234')
  31. order = Order.objects.get(number='1234')
  32. lines = order.lines.all()
  33. self.assertEqual(1, len(lines))
  34. def test_sets_correct_order_status(self):
  35. self.basket.add_product(create_product(price=D('12.00')))
  36. self.creator.place_order(basket=self.basket, order_number='1234', status='Active')
  37. order = Order.objects.get(number='1234')
  38. self.assertEqual('Active', order.status)
  39. def test_defaults_to_using_free_shipping(self):
  40. self.basket.add_product(create_product(price=D('12.00')))
  41. self.creator.place_order(basket=self.basket, order_number='1234')
  42. order = Order.objects.get(number='1234')
  43. self.assertEqual(order.total_incl_tax, self.basket.total_incl_tax)
  44. self.assertEqual(order.total_excl_tax, self.basket.total_excl_tax)
  45. def test_defaults_to_setting_totals_to_basket_totals(self):
  46. self.basket.add_product(create_product(price=D('12.00')))
  47. method = Mock()
  48. method.is_discounted = False
  49. method.basket_charge_incl_tax = Mock(return_value=D('2.00'))
  50. method.basket_charge_excl_tax = Mock(return_value=D('2.00'))
  51. self.creator.place_order(basket=self.basket, order_number='1234', shipping_method=method)
  52. order = Order.objects.get(number='1234')
  53. self.assertEqual(order.total_incl_tax, self.basket.total_incl_tax + D('2.00'))
  54. self.assertEqual(order.total_excl_tax, self.basket.total_excl_tax + D('2.00'))
  55. def test_uses_default_order_status_from_settings(self):
  56. self.basket.add_product(create_product(price=D('12.00')))
  57. with override_settings(OSCAR_INITIAL_ORDER_STATUS='A'):
  58. self.creator.place_order(basket=self.basket, order_number='1234')
  59. order = Order.objects.get(number='1234')
  60. self.assertEqual('A', order.status)
  61. def test_uses_default_line_status_from_settings(self):
  62. self.basket.add_product(create_product(price=D('12.00')))
  63. with override_settings(OSCAR_INITIAL_LINE_STATUS='A'):
  64. self.creator.place_order(basket=self.basket, order_number='1234')
  65. order = Order.objects.get(number='1234')
  66. line = order.lines.all()[0]
  67. self.assertEqual('A', line.status)
  68. class TestPlacingOrderForDigitalGoods(TestCase):
  69. def setUp(self):
  70. self.creator = OrderCreator()
  71. self.basket = Basket.objects.create()
  72. def test_does_not_allocate_stock(self):
  73. ProductClass.objects.create(
  74. name="Digital", track_stock=False)
  75. product = create_product(
  76. price=D('9.99'), product_class="Digital", num_in_stock=None)
  77. self.assertTrue(product.stockrecord.num_in_stock is None)
  78. self.assertTrue(product.stockrecord.num_allocated is None)
  79. self.basket.add_product(product)
  80. self.creator.place_order(basket=self.basket, order_number='1234')
  81. product_ = Product.objects.get(id=product.id)
  82. self.assertTrue(product_.stockrecord.num_in_stock is None)
  83. self.assertTrue(product_.stockrecord.num_allocated is None)