Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

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