您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

test_event_handler.py 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. from decimal import Decimal as D
  2. from django.test import TestCase
  3. from oscar.apps.order.processing import EventHandler
  4. from oscar.apps.order import models, exceptions
  5. from oscar.test import factories
  6. from oscar.test.basket import add_product
  7. class TestEventHandler(TestCase):
  8. def setUp(self):
  9. self.order = factories.create_order()
  10. self.handler = EventHandler()
  11. self.shipped = models.ShippingEventType.objects.create(
  12. name='Shipped')
  13. self.returned = models.ShippingEventType.objects.create(
  14. name='Returned')
  15. def test_creates_shipping_events_correctly(self):
  16. self.handler.handle_shipping_event(
  17. self.order, self.shipped, self.order.lines.all(), [1])
  18. events = self.order.shipping_events.all()
  19. self.assertEqual(1, len(events))
  20. event = events[0]
  21. self.assertEqual('Shipped', event.event_type.name)
  22. def test_verifies_lines_has_passed_shipping_event(self):
  23. basket = factories.create_basket(empty=True)
  24. add_product(basket, D('10.00'), 5)
  25. order = factories.create_order(basket=basket)
  26. lines = order.lines.all()
  27. self.handler.handle_shipping_event(
  28. order, self.shipped, lines, [4])
  29. self.assertTrue(self.handler.have_lines_passed_shipping_event(
  30. order, lines, [3], self.shipped))
  31. self.assertTrue(self.handler.have_lines_passed_shipping_event(
  32. order, lines, [4], self.shipped))
  33. self.assertFalse(self.handler.have_lines_passed_shipping_event(
  34. order, lines, [5], self.shipped))
  35. def test_prevents_event_quantities_higher_than_original_line(self):
  36. basket = factories.create_basket(empty=True)
  37. add_product(basket, D('10.00'), 5)
  38. order = factories.create_order(basket=basket)
  39. # First shipping event
  40. lines = order.lines.all()
  41. self.handler.handle_shipping_event(
  42. order, self.shipped, lines, [4])
  43. with self.assertRaises(exceptions.InvalidShippingEvent):
  44. self.handler.handle_shipping_event(
  45. order, self.shipped, lines, [4])
  46. def test_are_stock_allocations_available(self):
  47. product_class = factories.ProductClassFactory(
  48. requires_shipping=False, track_stock=True)
  49. product = factories.ProductFactory(product_class=product_class)
  50. basket = factories.create_basket(empty=True)
  51. add_product(basket, D('10.00'), 5, product=product)
  52. order = factories.create_order(basket=basket)
  53. line = order.lines.get()
  54. self.assertEqual(
  55. self.handler.are_stock_allocations_available(
  56. [line], [line.quantity]),
  57. True,
  58. )
  59. self.assertEqual(
  60. self.handler.are_stock_allocations_available(
  61. [line], [105]),
  62. False,
  63. )
  64. def test_are_stock_allocations_available_track_stock_off(self):
  65. product_class = factories.ProductClassFactory(
  66. requires_shipping=False, track_stock=False)
  67. product = factories.ProductFactory(product_class=product_class)
  68. basket = factories.create_basket(empty=True)
  69. add_product(basket, D('10.00'), 5, product=product)
  70. order = factories.create_order(basket=basket)
  71. line = order.lines.get()
  72. self.assertEqual(
  73. self.handler.are_stock_allocations_available(
  74. [line], [105]),
  75. True,
  76. )
  77. def test_consume_stock_allocations_track_stock_on(self):
  78. product_class = factories.ProductClassFactory(
  79. requires_shipping=False, track_stock=True)
  80. product = factories.ProductFactory(product_class=product_class)
  81. basket = factories.create_basket(empty=True)
  82. add_product(basket, D('10.00'), 5, product=product)
  83. order = factories.create_order(basket=basket)
  84. stockrecord = product.stockrecords.get()
  85. num_in_stock = stockrecord.num_in_stock
  86. num_allocated = stockrecord.num_allocated
  87. lines = order.lines.all()
  88. self.handler.consume_stock_allocations(
  89. order, lines, [line.quantity for line in lines])
  90. stockrecord.refresh_from_db()
  91. self.assertEqual(
  92. stockrecord.num_allocated,
  93. num_allocated - 5,
  94. "Allocated stock should have decreased, but didn't."
  95. )
  96. self.assertEqual(
  97. stockrecord.num_in_stock,
  98. num_in_stock - 5,
  99. "Stock should have decreased, but didn't."
  100. )
  101. def test_consume_stock_allocations_track_stock_off(self):
  102. product_class = factories.ProductClassFactory(
  103. requires_shipping=False, track_stock=False)
  104. product = factories.ProductFactory(product_class=product_class)
  105. basket = factories.create_basket(empty=True)
  106. add_product(basket, D('10.00'), 5, product=product)
  107. order = factories.create_order(basket=basket)
  108. stockrecord = product.stockrecords.get()
  109. num_in_stock = stockrecord.num_in_stock
  110. num_allocated = stockrecord.num_allocated
  111. lines = order.lines.all()
  112. self.handler.consume_stock_allocations(
  113. order, lines, [line.quantity for line in lines])
  114. stockrecord.refresh_from_db()
  115. self.assertEqual(
  116. stockrecord.num_allocated,
  117. num_allocated,
  118. "Allocated stock shouldn't have changed, but it did."
  119. )
  120. self.assertEqual(
  121. stockrecord.num_in_stock,
  122. num_in_stock,
  123. "Stock shouldn't have changed, but it did."
  124. )
  125. def test_consume_stock_allocations_without_line_arguments(self):
  126. product_class = factories.ProductClassFactory(
  127. requires_shipping=False, track_stock=True)
  128. product = factories.ProductFactory(product_class=product_class)
  129. basket = factories.create_basket(empty=True)
  130. add_product(basket, D('10.00'), 5, product=product)
  131. order = factories.create_order(basket=basket)
  132. stockrecord = product.stockrecords.get()
  133. num_in_stock = stockrecord.num_in_stock
  134. num_allocated = stockrecord.num_allocated
  135. self.handler.consume_stock_allocations(order)
  136. stockrecord.refresh_from_db()
  137. self.assertEqual(
  138. stockrecord.num_allocated,
  139. num_allocated - 5,
  140. "Allocated stock should have decreased, but didn't."
  141. )
  142. self.assertEqual(
  143. stockrecord.num_in_stock,
  144. num_in_stock - 5,
  145. "Stock should have decreased, but didn't."
  146. )
  147. def test_cancel_stock_allocations_track_stock_on(self):
  148. product_class = factories.ProductClassFactory(
  149. requires_shipping=False, track_stock=True)
  150. product = factories.ProductFactory(product_class=product_class)
  151. basket = factories.create_basket(empty=True)
  152. add_product(basket, D('10.00'), 5, product=product)
  153. order = factories.create_order(basket=basket)
  154. stockrecord = product.stockrecords.get()
  155. num_allocated = stockrecord.num_allocated
  156. lines = order.lines.all()
  157. self.handler.cancel_stock_allocations(
  158. order, lines, [line.quantity for line in lines])
  159. stockrecord.refresh_from_db()
  160. self.assertEqual(
  161. stockrecord.num_allocated,
  162. num_allocated - 5,
  163. "Allocated stock should have decreased, but didn't."
  164. )
  165. def test_cancel_stock_allocations_track_stock_off(self):
  166. product_class = factories.ProductClassFactory(
  167. requires_shipping=False, track_stock=False)
  168. product = factories.ProductFactory(product_class=product_class)
  169. basket = factories.create_basket(empty=True)
  170. add_product(basket, D('10.00'), 5, product=product)
  171. order = factories.create_order(basket=basket)
  172. stockrecord = product.stockrecords.get()
  173. num_allocated = stockrecord.num_allocated
  174. lines = order.lines.all()
  175. self.handler.cancel_stock_allocations(
  176. order, lines, [line.quantity for line in lines])
  177. stockrecord.refresh_from_db()
  178. self.assertEqual(
  179. stockrecord.num_allocated,
  180. num_allocated,
  181. "Allocated stock shouldn't have changed, but it did."
  182. )
  183. def test_cancel_stock_allocations_without_line_arguments(self):
  184. product_class = factories.ProductClassFactory(
  185. requires_shipping=False, track_stock=True)
  186. product = factories.ProductFactory(product_class=product_class)
  187. basket = factories.create_basket(empty=True)
  188. add_product(basket, D('10.00'), 5, product=product)
  189. order = factories.create_order(basket=basket)
  190. stockrecord = product.stockrecords.get()
  191. num_allocated = stockrecord.num_allocated
  192. self.handler.cancel_stock_allocations(order)
  193. stockrecord.refresh_from_db()
  194. self.assertEqual(
  195. stockrecord.num_allocated,
  196. num_allocated - 5,
  197. "Allocated stock should have decreased, but didn't."
  198. )
  199. class TestTotalCalculation(TestCase):
  200. def setUp(self):
  201. self.order = factories.create_order()
  202. self.handler = EventHandler()
  203. basket = factories.create_basket(empty=True)
  204. add_product(basket, D('10.00'), 5)
  205. self.order = factories.create_order(basket=basket)
  206. self.settled = models.PaymentEventType.objects.create(
  207. name='Settled')
  208. def test_normal_payment_sequence(self):
  209. # First payment event
  210. lines, line_quantities = self.order.lines.all(), [2]
  211. total = self.handler.calculate_payment_event_subtotal(
  212. self.settled, lines, line_quantities)
  213. self.assertEqual(2 * D('10.00'), total)
  214. self.handler.create_payment_event(
  215. self.order, self.settled, total, lines, line_quantities)
  216. # Second payment
  217. line_quantities = [3]
  218. total = self.handler.calculate_payment_event_subtotal(
  219. self.settled, lines, line_quantities)
  220. self.assertEqual(3 * D('10.00'), total)
  221. def test_invalid_payment_sequence(self):
  222. lines, line_quantities = self.order.lines.all(), [2]
  223. total = self.handler.calculate_payment_event_subtotal(
  224. self.settled, lines, line_quantities)
  225. self.assertEqual(2 * D('10.00'), total)
  226. self.handler.create_payment_event(
  227. self.order, self.settled, total, lines, line_quantities)
  228. with self.assertRaises(exceptions.InvalidPaymentEvent):
  229. self.handler.calculate_payment_event_subtotal(
  230. self.settled, self.order.lines.all(), [4])