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.

event_handler_tests.py 3.6KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. class TestTotalCalculation(TestCase):
  47. def setUp(self):
  48. self.order = factories.create_order()
  49. self.handler = EventHandler()
  50. basket = factories.create_basket(empty=True)
  51. add_product(basket, D('10.00'), 5)
  52. self.order = factories.create_order(basket=basket)
  53. self.settled = models.PaymentEventType.objects.create(
  54. name='Settled')
  55. def test_normal_payment_sequence(self):
  56. # First payment event
  57. lines, line_quantities = self.order.lines.all(), [2]
  58. total = self.handler.calculate_payment_event_subtotal(
  59. self.settled, lines, line_quantities)
  60. self.assertEqual(2 * D('10.00'), total)
  61. self.handler.create_payment_event(
  62. self.order, self.settled, total, lines, line_quantities)
  63. # Second payment
  64. line_quantities = [3]
  65. total = self.handler.calculate_payment_event_subtotal(
  66. self.settled, lines, line_quantities)
  67. self.assertEqual(3 * D('10.00'), total)
  68. def test_invalid_payment_sequence(self):
  69. lines, line_quantities = self.order.lines.all(), [2]
  70. total = self.handler.calculate_payment_event_subtotal(
  71. self.settled, lines, line_quantities)
  72. self.assertEqual(2 * D('10.00'), total)
  73. self.handler.create_payment_event(
  74. self.order, self.settled, total, lines, line_quantities)
  75. with self.assertRaises(exceptions.InvalidPaymentEvent):
  76. self.handler.calculate_payment_event_subtotal(
  77. self.settled, self.order.lines.all(), [4])