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.

test_guest_checkout.py 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import sys
  2. from importlib import import_module, reload
  3. from unittest import mock
  4. from urllib.parse import quote
  5. from django.conf import settings
  6. from django.test.utils import override_settings
  7. from django.urls import clear_url_caches, reverse
  8. from oscar.core.loading import get_class
  9. from oscar.test import factories
  10. from oscar.test.testcases import WebTestCase
  11. from . import (
  12. CheckoutMixin,
  13. IndexViewPreConditionsMixin,
  14. PaymentDetailsPreviewViewMixin,
  15. PaymentDetailsViewMixin,
  16. PaymentMethodViewMixin,
  17. ShippingAddressViewMixin,
  18. ShippingMethodViewMixin,
  19. )
  20. GatewayForm = get_class("checkout.forms", "GatewayForm")
  21. def reload_url_conf():
  22. # Reload URLs to pick up the overridden settings
  23. if settings.ROOT_URLCONF in sys.modules:
  24. reload(sys.modules[settings.ROOT_URLCONF])
  25. import_module(settings.ROOT_URLCONF)
  26. clear_url_caches()
  27. class AnonymousMixin:
  28. is_anonymous = True
  29. def setUp(self):
  30. reload_url_conf()
  31. super().setUp()
  32. # Disable skip conditions, so that we do not first get redirected forwards
  33. # pylint: disable=unused-argument
  34. @mock.patch(
  35. "oscar.apps.checkout.session.CheckoutSessionMixin.skip_unless_basket_requires_shipping"
  36. )
  37. @mock.patch(
  38. "oscar.apps.checkout.session.CheckoutSessionMixin.skip_unless_payment_is_required"
  39. )
  40. def test_does_not_require_login(
  41. self,
  42. mock_skip_unless_payment_is_required,
  43. mock_skip_unless_basket_requires_shipping,
  44. ):
  45. response = self.get(reverse(self.view_name))
  46. self.assertRedirectsTo(response, "basket:summary")
  47. @override_settings(OSCAR_ALLOW_ANON_CHECKOUT=True)
  48. class TestIndexView(
  49. AnonymousMixin, IndexViewPreConditionsMixin, CheckoutMixin, WebTestCase
  50. ):
  51. view_name = "checkout:index"
  52. def test_redirects_new_customers_to_registration_page(self):
  53. self.add_product_to_basket()
  54. page = self.get(reverse("checkout:index"))
  55. form = page.form
  56. form["options"].select(GatewayForm.NEW)
  57. new_user_email = "newcustomer@test.com"
  58. form["username"].value = new_user_email
  59. response = form.submit()
  60. expected_url = "{register_url}?next={forward}&email={email}".format(
  61. register_url=reverse("customer:register"),
  62. forward=reverse("checkout:shipping-address"),
  63. email=quote(new_user_email),
  64. )
  65. self.assertRedirects(response, expected_url)
  66. def test_redirects_existing_customers_to_shipping_address_page(self):
  67. password = "password"
  68. user = factories.UserFactory(password=password)
  69. self.add_product_to_basket()
  70. page = self.get(reverse("checkout:index"))
  71. form = page.form
  72. form.select("options", GatewayForm.EXISTING)
  73. form["username"].value = user.email
  74. form["password"].value = password
  75. response = form.submit()
  76. self.assertRedirectsTo(response, "checkout:shipping-address")
  77. def test_redirects_guest_customers_to_shipping_address_page(self):
  78. self.add_product_to_basket()
  79. page = self.get(reverse("checkout:index"))
  80. form = page.form
  81. form.select("options", GatewayForm.GUEST)
  82. form["username"] = "guest@example.com"
  83. response = form.submit()
  84. self.assertRedirectsTo(response, "checkout:shipping-address")
  85. def test_prefill_form_with_email_for_returning_guest(self):
  86. self.add_product_to_basket()
  87. email = "forgetfulguest@test.com"
  88. self.enter_guest_details(email)
  89. page = self.get(reverse("checkout:index"))
  90. self.assertEqual(email, page.form["username"].value)
  91. def test_auto_select_existing_user(self):
  92. email = "forgetfulguest@test.com"
  93. self.create_user(email, email, self.password)
  94. self.add_product_to_basket()
  95. # select guest checkout
  96. page = self.get(reverse("checkout:index"))
  97. form = page.form
  98. form["options"].select(GatewayForm.GUEST)
  99. form["username"].value = email
  100. response = form.submit()
  101. # since this user allready exists
  102. self.assertEqual(email, response.form["username"].value)
  103. self.assertEqual(
  104. GatewayForm.EXISTING,
  105. response.form["options"].value,
  106. "Since this user has an account, the GatewayForm should "
  107. "be changed to existing, so the user can enter his password",
  108. )
  109. @override_settings(OSCAR_ALLOW_ANON_CHECKOUT=True)
  110. class TestShippingAddressView(
  111. AnonymousMixin, ShippingAddressViewMixin, CheckoutMixin, WebTestCase
  112. ):
  113. view_name = "checkout:shipping-address"
  114. next_view_name = "checkout:shipping-method"
  115. @override_settings(OSCAR_ALLOW_ANON_CHECKOUT=True)
  116. class TestShippingMethodView(
  117. AnonymousMixin, ShippingMethodViewMixin, CheckoutMixin, WebTestCase
  118. ):
  119. view_name = "checkout:shipping-method"
  120. next_view_name = "checkout:payment-method"
  121. @override_settings(OSCAR_ALLOW_ANON_CHECKOUT=True)
  122. class TestPaymentMethodView(
  123. AnonymousMixin, PaymentMethodViewMixin, CheckoutMixin, WebTestCase
  124. ):
  125. view_name = "checkout:payment-method"
  126. @override_settings(OSCAR_ALLOW_ANON_CHECKOUT=True)
  127. class TestPaymentDetailsView(
  128. AnonymousMixin, PaymentDetailsViewMixin, CheckoutMixin, WebTestCase
  129. ):
  130. view_name = "checkout:payment-details"
  131. @override_settings(OSCAR_ALLOW_ANON_CHECKOUT=True)
  132. class TestPaymentDetailsPreviewView(
  133. AnonymousMixin, PaymentDetailsPreviewViewMixin, CheckoutMixin, WebTestCase
  134. ):
  135. view_name = "checkout:preview"
  136. def test_placing_order_saves_guest_email_with_order(self):
  137. preview = self.ready_to_place_an_order()
  138. thank_you = preview.forms["place_order_form"].submit().follow()
  139. order = thank_you.context["order"]
  140. self.assertEqual("hello@egg.com", order.guest_email)