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.

test_mixins.py 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. from decimal import Decimal as D
  2. from unittest import mock
  3. from django.http import HttpRequest
  4. from django.test import TestCase
  5. from django.test.utils import override_settings
  6. from oscar.apps.checkout.calculators import OrderTotalCalculator
  7. from oscar.apps.checkout.exceptions import FailedPreCondition
  8. from oscar.apps.checkout.mixins import (
  9. CheckoutSessionMixin, OrderPlacementMixin)
  10. from oscar.apps.shipping.methods import FixedPrice, Free
  11. from oscar.core.loading import get_class, get_model
  12. from oscar.test import factories
  13. from oscar.test.basket import add_product
  14. from oscar.test.utils import RequestFactory
  15. Order = get_model('order', 'Order')
  16. Surcharge = get_model('order', 'Surcharge')
  17. SurchargeApplicator = get_class("checkout.applicator", "SurchargeApplicator")
  18. class TestOrderPlacementMixin(TestCase):
  19. def test_returns_none_when_no_shipping_address_passed_to_creation_method(self):
  20. address = OrderPlacementMixin().create_shipping_address(
  21. user=mock.Mock(), shipping_address=None)
  22. self.assertEqual(address, None)
  23. def test_update_address_book(self):
  24. basket = factories.create_basket(empty=True)
  25. user = factories.UserFactory()
  26. add_product(basket, D('12.00'))
  27. shipping_method = FixedPrice(D('5.00'), D('5.00'))
  28. billing_address = factories.BillingAddressFactory(line1='1 Boardwalk Place',
  29. line2='Trafalgar Way',
  30. line3='Tower Hamlets',
  31. line4='London')
  32. shipping_address = factories.ShippingAddressFactory(line1='Knightsbridge',
  33. line2='159',
  34. line4='London')
  35. shipping_charge = shipping_method.calculate(basket)
  36. applicator = SurchargeApplicator()
  37. surcharges = applicator.get_applicable_surcharges(basket)
  38. order_total = OrderTotalCalculator().calculate(basket, shipping_charge, surcharges)
  39. order_submission_data = {'user': user,
  40. 'order_number': '12345',
  41. 'basket': basket,
  42. 'shipping_address': shipping_address,
  43. 'shipping_method': shipping_method,
  44. 'shipping_charge': shipping_charge,
  45. 'billing_address': billing_address,
  46. 'order_total': order_total}
  47. OrderPlacementMixin().place_order(**order_submission_data)
  48. self.assertEqual(user.addresses.filter(hash=billing_address.generate_hash()).count(), 1)
  49. self.assertEqual(user.addresses.filter(hash=shipping_address.generate_hash()).count(), 1)
  50. user_billing_address = user.addresses.get(hash=billing_address.generate_hash())
  51. user_shipping_address = user.addresses.get(hash=shipping_address.generate_hash())
  52. self.assertEqual(user_billing_address.num_orders_as_billing_address, 1)
  53. self.assertEqual(user_shipping_address.num_orders_as_shipping_address, 1)
  54. order_submission_data['order_number'] = '12346'
  55. OrderPlacementMixin().place_order(**order_submission_data)
  56. user_billing_address = user.addresses.get(hash=billing_address.generate_hash())
  57. user_shipping_address = user.addresses.get(hash=shipping_address.generate_hash())
  58. self.assertEqual(user_billing_address.num_orders_as_billing_address, 2)
  59. self.assertEqual(user_shipping_address.num_orders_as_shipping_address, 2)
  60. order_submission_data.pop('billing_address', None)
  61. order_submission_data['order_number'] = '123457'
  62. OrderPlacementMixin().place_order(**order_submission_data)
  63. user_billing_address = user.addresses.get(hash=billing_address.generate_hash())
  64. user_shipping_address = user.addresses.get(hash=shipping_address.generate_hash())
  65. self.assertEqual(user_billing_address.num_orders_as_billing_address, 2)
  66. self.assertEqual(user_shipping_address.num_orders_as_shipping_address, 3)
  67. shipping_address.line2 = '160'
  68. order_submission_data['billing_address'] = billing_address
  69. order_submission_data['order_number'] = '123458'
  70. OrderPlacementMixin().place_order(**order_submission_data)
  71. user_billing_address = user.addresses.get(hash=billing_address.generate_hash())
  72. user_shipping_address = user.addresses.get(hash=shipping_address.generate_hash())
  73. self.assertEqual(user_billing_address.num_orders_as_billing_address, 3)
  74. self.assertEqual(user_shipping_address.num_orders_as_shipping_address, 1)
  75. @override_settings(SITE_ID='')
  76. def test_multi_site(self):
  77. basket = factories.create_basket(empty=True)
  78. site1 = factories.SiteFactory()
  79. site2 = factories.SiteFactory()
  80. request = HttpRequest()
  81. request.META['SERVER_PORT'] = 80
  82. request.META['SERVER_NAME'] = site1.domain
  83. user = factories.UserFactory()
  84. add_product(basket, D('12.00'))
  85. shipping_method = Free()
  86. shipping_charge = shipping_method.calculate(basket)
  87. applicator = SurchargeApplicator()
  88. surcharges = applicator.get_applicable_surcharges(basket)
  89. order_total = OrderTotalCalculator().calculate(basket, shipping_charge, surcharges)
  90. billing_address = factories.BillingAddressFactory()
  91. shipping_address = factories.ShippingAddressFactory()
  92. order_submission_data = {'user': user,
  93. 'order_number': '12345',
  94. 'basket': basket,
  95. 'shipping_method': shipping_method,
  96. 'shipping_charge': shipping_charge,
  97. 'order_total': order_total,
  98. 'billing_address': billing_address,
  99. 'shipping_address': shipping_address,
  100. 'request': request}
  101. OrderPlacementMixin().place_order(**order_submission_data)
  102. order1 = Order.objects.get(number='12345')
  103. for charge in surcharges:
  104. Surcharge.objects.create(
  105. order=order1,
  106. name=charge.surcharge.name,
  107. code=charge.surcharge.code,
  108. excl_tax=charge.price.excl_tax,
  109. incl_tax=charge.price.incl_tax)
  110. self.assertEqual(order1.site, site1)
  111. add_product(basket, D('12.00'))
  112. request.META['SERVER_NAME'] = site2.domain
  113. order_submission_data['order_number'] = '12346'
  114. order_submission_data['request'] = request
  115. OrderPlacementMixin().place_order(**order_submission_data)
  116. order2 = Order.objects.get(number='12346')
  117. self.assertEqual(order2.site, site2)
  118. def test_multiple_payment_events(self):
  119. basket = factories.create_basket(empty=True)
  120. user = factories.UserFactory()
  121. add_product(basket, D('100.00'))
  122. order_placement = OrderPlacementMixin()
  123. order_placement.add_payment_event('Gift Card Payment', D('10'))
  124. order_placement.add_payment_event('Credit Card Payment', D('90'))
  125. shipping_method = Free()
  126. shipping_charge = shipping_method.calculate(basket)
  127. applicator = SurchargeApplicator()
  128. surcharges = applicator.get_applicable_surcharges(basket)
  129. order_total = OrderTotalCalculator().calculate(basket, shipping_charge, surcharges)
  130. billing_address = factories.BillingAddressFactory()
  131. shipping_address = factories.ShippingAddressFactory()
  132. order_submission_data = {'user': user,
  133. 'order_number': '12345',
  134. 'basket': basket,
  135. 'shipping_method': shipping_method,
  136. 'shipping_charge': shipping_charge,
  137. 'order_total': order_total,
  138. 'billing_address': billing_address,
  139. 'shipping_address': shipping_address}
  140. order_placement.place_order(**order_submission_data)
  141. order1 = Order.objects.get(number='12345')
  142. for charge in surcharges:
  143. Surcharge.objects.create(
  144. order=order1,
  145. name=charge.surcharge.name,
  146. code=charge.surcharge.code,
  147. excl_tax=charge.price.excl_tax,
  148. incl_tax=charge.price.incl_tax)
  149. self.assertEqual(order1.payment_events.count(), 2)
  150. event1 = order1.payment_events.all()[0]
  151. event2 = order1.payment_events.all()[1]
  152. self.assertEqual(event1.event_type.name, 'Credit Card Payment')
  153. self.assertEqual(event1.amount, D('90'))
  154. self.assertEqual(event1.lines.count(), 1)
  155. self.assertEqual(event2.event_type.name, 'Gift Card Payment')
  156. self.assertEqual(event2.amount, D('10'))
  157. self.assertEqual(event2.lines.count(), 1)
  158. class TestCheckoutSessionMixin(TestCase):
  159. def setUp(self):
  160. self.request = RequestFactory().get('/')
  161. self.product = factories.create_product(num_in_stock=10)
  162. self.stock_record = self.product.stockrecords.first()
  163. def add_product_to_basket(self, product, quantity=1):
  164. self.request.basket.add_product(product, quantity=quantity)
  165. self.assertEqual(len(self.request.basket.all_lines()), 1)
  166. self.assertEqual(self.request.basket.all_lines()[0].product, product)
  167. def test_check_basket_is_valid_no_stock_available(self):
  168. self.add_product_to_basket(self.product)
  169. CheckoutSessionMixin().check_basket_is_valid(self.request)
  170. self.stock_record.allocate(10)
  171. self.stock_record.save()
  172. with self.assertRaises(FailedPreCondition):
  173. CheckoutSessionMixin().check_basket_is_valid(self.request)
  174. def test_check_basket_is_valid_stock_exceeded(self):
  175. self.add_product_to_basket(self.product)
  176. CheckoutSessionMixin().check_basket_is_valid(self.request)
  177. self.request.basket.add_product(self.product, quantity=11)
  178. with self.assertRaises(FailedPreCondition):
  179. CheckoutSessionMixin().check_basket_is_valid(self.request)