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_customer_checkout.py 7.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. from django.urls import reverse
  2. from oscar.core.loading import get_model
  3. from oscar.test import factories
  4. from oscar.test.testcases import WebTestCase
  5. from . import (
  6. CheckoutMixin, IndexViewPreConditionsMixin, PaymentDetailsPreviewViewMixin,
  7. PaymentDetailsViewMixin, PaymentMethodViewMixin, ShippingAddressViewMixin,
  8. ShippingMethodViewMixin)
  9. Order = get_model('order', 'Order')
  10. UserAddress = get_model('address', 'UserAddress')
  11. class LoginRequiredMixin:
  12. view_name = None
  13. view_url = None
  14. def test_requires_login(self):
  15. response = self.get(self.view_url or reverse(self.view_name), user=None)
  16. expected_url = '{login_url}?next={forward}'.format(
  17. login_url=reverse('customer:login'),
  18. forward=self.view_url or reverse(self.view_name))
  19. self.assertRedirects(response, expected_url)
  20. class TestIndexView(LoginRequiredMixin, IndexViewPreConditionsMixin, CheckoutMixin, WebTestCase):
  21. view_name = 'checkout:index'
  22. def test_redirects_customers_to_shipping_address_view(self):
  23. self.add_product_to_basket()
  24. response = self.get(reverse('checkout:index'))
  25. self.assertRedirectsTo(response, 'checkout:shipping-address')
  26. class TestShippingAddressView(LoginRequiredMixin, ShippingAddressViewMixin, CheckoutMixin, WebTestCase):
  27. view_name = 'checkout:shipping-address'
  28. next_view_name = 'checkout:shipping-method'
  29. def setUp(self):
  30. super().setUp()
  31. self.user_address = factories.UserAddressFactory(user=self.user, country=self.create_shipping_country())
  32. def test_only_shipping_addresses_are_shown(self):
  33. not_shipping_country = factories.CountryFactory(
  34. iso_3166_1_a2='US', name="UNITED STATES",
  35. is_shipping_country=False)
  36. not_shipping_address = factories.UserAddressFactory(
  37. user=self.user, country=not_shipping_country, line4='New York')
  38. self.add_product_to_basket()
  39. page = self.get(reverse('checkout:shipping-address'))
  40. page.mustcontain(
  41. self.user_address.line4, self.user_address.country.name,
  42. no=[not_shipping_address.country.name, not_shipping_address.line4])
  43. def test_can_select_an_existing_shipping_address(self):
  44. self.add_product_to_basket()
  45. page = self.get(reverse('checkout:shipping-address'), user=self.user)
  46. self.assertIsOk(page)
  47. form = page.forms["select_shipping_address_%s" % self.user_address.id]
  48. response = form.submit()
  49. self.assertRedirectsTo(response, 'checkout:shipping-method')
  50. class TestUserAddressUpdateView(LoginRequiredMixin, CheckoutMixin, WebTestCase):
  51. def setUp(self):
  52. super().setUp()
  53. user_address = factories.UserAddressFactory(user=self.user, country=self.create_shipping_country())
  54. self.view_url = reverse('checkout:user-address-update', kwargs={'pk': user_address.pk})
  55. def test_submitting_valid_form_modifies_user_address(self):
  56. page = self.get(self.view_url, user=self.user)
  57. form = page.forms['update_user_address']
  58. form['first_name'] = 'Tom'
  59. response = form.submit()
  60. self.assertRedirectsTo(response, 'checkout:shipping-address')
  61. self.assertEqual('Tom', UserAddress.objects.get().first_name)
  62. class TestUserAddressDeleteView(LoginRequiredMixin, CheckoutMixin, WebTestCase):
  63. def setUp(self):
  64. super().setUp()
  65. self.user_address = factories.UserAddressFactory(user=self.user, country=self.create_shipping_country())
  66. self.view_url = reverse('checkout:user-address-delete', kwargs={'pk': self.user_address.pk})
  67. def test_can_delete_a_user_address_from_shipping_address_page(self):
  68. self.add_product_to_basket()
  69. page = self.get(reverse('checkout:shipping-address'), user=self.user)
  70. delete_confirm = page.click(href=self.view_url)
  71. form = delete_confirm.forms["delete_address_%s" % self.user_address.id]
  72. form.submit()
  73. # Ensure address is deleted
  74. user_addresses = UserAddress.objects.filter(user=self.user)
  75. self.assertEqual(0, len(user_addresses))
  76. class TestShippingMethodView(LoginRequiredMixin, ShippingMethodViewMixin, CheckoutMixin, WebTestCase):
  77. view_name = 'checkout:shipping-method'
  78. next_view_name = 'checkout:payment-method'
  79. class TestPaymentMethodView(LoginRequiredMixin, PaymentMethodViewMixin, CheckoutMixin, WebTestCase):
  80. view_name = 'checkout:payment-method'
  81. class TestPaymentDetailsView(LoginRequiredMixin, PaymentDetailsViewMixin, CheckoutMixin, WebTestCase):
  82. view_name = 'checkout:payment-details'
  83. class TestPaymentDetailsPreviewView(LoginRequiredMixin, PaymentDetailsPreviewViewMixin, CheckoutMixin, WebTestCase):
  84. view_name = 'checkout:preview'
  85. class TestThankYouView(CheckoutMixin, WebTestCase):
  86. def tests_gets_a_302_when_there_is_no_order(self):
  87. response = self.get(
  88. reverse('checkout:thank-you'), user=self.user, status="*")
  89. self.assertIsRedirect(response)
  90. self.assertRedirectsTo(response, 'catalogue:index')
  91. def tests_gets_a_302_when_the_order_id_in_the_session_is_for_a_non_existent_order(self):
  92. session = self.client.session
  93. # Put the order ID in the session, mimicking an order that no longer
  94. # exists, so that we can be redirected to the home page.
  95. session['checkout_order_id'] = 0
  96. session.save()
  97. self.client.force_login(self.user)
  98. response = self.client.get(reverse('checkout:thank-you'))
  99. self.assertRedirects(response, reverse('catalogue:index'))
  100. def tests_custumers_can_reach_the_thank_you_page(self):
  101. self.add_product_to_basket()
  102. self.enter_shipping_address()
  103. thank_you = self.place_order()
  104. self.assertIsOk(thank_you)
  105. def test_superusers_can_force_an_order(self):
  106. self.add_product_to_basket()
  107. self.enter_shipping_address()
  108. self.place_order()
  109. user = self.create_user('admin', 'admin@admin.com')
  110. user.is_superuser = True
  111. user.save()
  112. order = Order.objects.get()
  113. test_url = '%s?order_number=%s' % (
  114. reverse('checkout:thank-you'), order.number)
  115. response = self.get(test_url, status='*', user=user)
  116. self.assertIsOk(response)
  117. test_url = '%s?order_id=%s' % (reverse('checkout:thank-you'), order.pk)
  118. response = self.get(test_url, status='*', user=user)
  119. self.assertIsOk(response)
  120. def test_superusers_cannot_force_a_non_existent_order(self):
  121. user = self.create_user('admin', 'admin@admin.com')
  122. user.is_superuser = True
  123. user.save()
  124. test_url = '%s?order_number=%s' % (reverse('checkout:thank-you'), 'non-existent')
  125. response = self.get(test_url, status='*', user=user)
  126. self.assertIsRedirect(response)
  127. self.assertRedirectsTo(response, 'catalogue:index')
  128. test_url = '%s?order_id=%s' % (reverse('checkout:thank-you'), 0)
  129. response = self.get(test_url, status='*', user=user)
  130. self.assertIsRedirect(response)
  131. self.assertRedirectsTo(response, 'catalogue:index')
  132. def test_users_cannot_force_an_other_customer_order(self):
  133. self.add_product_to_basket()
  134. self.enter_shipping_address()
  135. self.place_order()
  136. user = self.create_user('John', 'john@test.com')
  137. user.save()
  138. order = Order.objects.get()
  139. test_url = '%s?order_number=%s' % (
  140. reverse('checkout:thank-you'), order.number)
  141. response = self.get(test_url, status='*', user=user)
  142. self.assertIsRedirect(response)
  143. self.assertRedirectsTo(response, 'catalogue:index')
  144. test_url = '%s?order_id=%s' % (reverse('checkout:thank-you'), order.pk)
  145. response = self.get(test_url, status='*', user=user)
  146. self.assertIsRedirect(response)
  147. self.assertRedirectsTo(response, 'catalogue:index')