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 9.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. from django.urls import reverse
  2. from oscar.core.loading import get_class, get_model
  3. from oscar.test import factories
  4. from oscar.test.testcases import WebTestCase
  5. from . import CheckoutMixin
  6. Order = get_model('order', 'Order')
  7. OrderPlacementMixin = get_class('checkout.mixins', 'OrderPlacementMixin')
  8. ConditionalOffer = get_model('offer', 'ConditionalOffer')
  9. UserAddress = get_model('address', 'UserAddress')
  10. GatewayForm = get_class('checkout.forms', 'GatewayForm')
  11. class TestIndexView(CheckoutMixin, WebTestCase):
  12. def test_requires_login(self):
  13. response = self.get(reverse('checkout:index'), user=None)
  14. self.assertIsRedirect(response)
  15. def test_redirects_customers_with_empty_basket(self):
  16. response = self.get(reverse('checkout:index'))
  17. self.assertRedirectsTo(response, 'basket:summary')
  18. def test_redirects_customers_to_shipping_address_view(self):
  19. self.add_product_to_basket()
  20. response = self.get(reverse('checkout:index'))
  21. self.assertRedirectsTo(response, 'checkout:shipping-address')
  22. class TestShippingAddressView(CheckoutMixin, WebTestCase):
  23. def setUp(self):
  24. super().setUp()
  25. self.user_address = factories.UserAddressFactory(
  26. user=self.user, country=self.create_shipping_country())
  27. def test_requires_login(self):
  28. response = self.get(reverse('checkout:shipping-address'), user=None)
  29. self.assertIsRedirect(response)
  30. def test_submitting_valid_form_adds_data_to_session(self):
  31. self.add_product_to_basket()
  32. page = self.get(reverse('checkout:shipping-address'))
  33. form = page.forms['new_shipping_address']
  34. form['first_name'] = 'Barry'
  35. form['last_name'] = 'Chuckle'
  36. form['line1'] = '1 King Street'
  37. form['line4'] = 'Gotham City'
  38. form['postcode'] = 'N1 7RR'
  39. response = form.submit()
  40. self.assertRedirectsTo(response, 'checkout:shipping-method')
  41. session_data = self.app.session['checkout_data']
  42. session_fields = session_data['shipping']['new_address_fields']
  43. self.assertEqual('Barry', session_fields['first_name'])
  44. self.assertEqual('Chuckle', session_fields['last_name'])
  45. self.assertEqual('1 King Street', session_fields['line1'])
  46. self.assertEqual('Gotham City', session_fields['line4'])
  47. self.assertEqual('N1 7RR', session_fields['postcode'])
  48. def test_only_shipping_addresses_are_shown(self):
  49. not_shipping_country = factories.CountryFactory(
  50. iso_3166_1_a2='US', name="UNITED STATES",
  51. is_shipping_country=False)
  52. not_shipping_address = factories.UserAddressFactory(
  53. user=self.user, country=not_shipping_country, line4='New York')
  54. self.add_product_to_basket()
  55. page = self.get(reverse('checkout:shipping-address'))
  56. page.mustcontain(
  57. self.user_address.line4, self.user_address.country.name,
  58. no=[not_shipping_address.country.name, not_shipping_address.line4])
  59. def test_can_select_an_existing_shipping_address(self):
  60. self.add_product_to_basket()
  61. page = self.get(reverse('checkout:shipping-address'), user=self.user)
  62. self.assertIsOk(page)
  63. form = page.forms["select_shipping_address_%s" % self.user_address.id]
  64. response = form.submit()
  65. self.assertRedirectsTo(response, 'checkout:shipping-method')
  66. class TestUserAddressUpdateView(CheckoutMixin, WebTestCase):
  67. def setUp(self):
  68. country = self.create_shipping_country()
  69. super().setUp()
  70. self.user_address = factories.UserAddressFactory(
  71. user=self.user, country=country)
  72. def test_requires_login(self):
  73. response = self.get(
  74. reverse('checkout:user-address-update',
  75. kwargs={'pk': self.user_address.pk}),
  76. user=None)
  77. self.assertIsRedirect(response)
  78. def test_submitting_valid_form_modifies_user_address(self):
  79. page = self.get(
  80. reverse(
  81. 'checkout:user-address-update',
  82. kwargs={'pk': self.user_address.pk}),
  83. user=self.user)
  84. form = page.forms['update_user_address']
  85. form['first_name'] = 'Tom'
  86. response = form.submit()
  87. self.assertRedirectsTo(response, 'checkout:shipping-address')
  88. self.assertEqual('Tom', UserAddress.objects.get().first_name)
  89. class TestShippingMethodView(CheckoutMixin, WebTestCase):
  90. def test_requires_login(self):
  91. response = self.get(reverse('checkout:shipping-method'), user=None)
  92. self.assertIsRedirect(response)
  93. def test_redirects_when_only_one_shipping_method(self):
  94. self.add_product_to_basket()
  95. self.enter_shipping_address()
  96. response = self.get(reverse('checkout:shipping-method'))
  97. self.assertRedirectsTo(response, 'checkout:payment-method')
  98. class TestDeleteUserAddressView(CheckoutMixin, WebTestCase):
  99. def setUp(self):
  100. super().setUp()
  101. self.country = self.create_shipping_country()
  102. self.user_address = factories.UserAddressFactory(
  103. user=self.user, country=self.country)
  104. def test_requires_login(self):
  105. response = self.get(
  106. reverse('checkout:user-address-delete',
  107. kwargs={'pk': self.user_address.pk}),
  108. user=None)
  109. self.assertIsRedirect(response)
  110. def test_can_delete_a_user_address_from_shipping_address_page(self):
  111. self.add_product_to_basket()
  112. page = self.get(reverse('checkout:shipping-address'), user=self.user)
  113. delete_confirm = page.click(
  114. href=reverse('checkout:user-address-delete',
  115. kwargs={'pk': self.user_address.pk}))
  116. form = delete_confirm.forms["delete_address_%s" % self.user_address.id]
  117. form.submit()
  118. # Ensure address is deleted
  119. user_addresses = UserAddress.objects.filter(user=self.user)
  120. self.assertEqual(0, len(user_addresses))
  121. class TestPreviewView(CheckoutMixin, WebTestCase):
  122. def test_allows_order_to_be_placed(self):
  123. self.add_product_to_basket()
  124. self.enter_shipping_address()
  125. payment_details = self.get(
  126. reverse('checkout:shipping-method')).follow().follow()
  127. preview = payment_details.click(linkid="view_preview")
  128. preview.forms['place_order_form'].submit().follow()
  129. self.assertEqual(1, Order.objects.all().count())
  130. class TestPlacingAnOrderUsingAVoucher(CheckoutMixin, WebTestCase):
  131. def test_records_use(self):
  132. self.add_product_to_basket()
  133. self.add_voucher_to_basket()
  134. self.enter_shipping_address()
  135. thankyou = self.place_order()
  136. order = thankyou.context['order']
  137. self.assertEqual(1, order.discounts.all().count())
  138. discount = order.discounts.all()[0]
  139. voucher = discount.voucher
  140. self.assertEqual(1, voucher.num_orders)
  141. class TestPlacingAnOrderUsingAnOffer(CheckoutMixin, WebTestCase):
  142. def test_records_use(self):
  143. offer = factories.create_offer()
  144. self.add_product_to_basket()
  145. self.enter_shipping_address()
  146. self.place_order()
  147. # Reload offer
  148. offer = ConditionalOffer.objects.get(id=offer.id)
  149. self.assertEqual(1, offer.num_orders)
  150. self.assertEqual(1, offer.num_applications)
  151. class TestThankYouView(CheckoutMixin, WebTestCase):
  152. def tests_gets_a_302_when_there_is_no_order(self):
  153. response = self.get(
  154. reverse('checkout:thank-you'), user=self.user, status="*")
  155. self.assertIsRedirect(response)
  156. self.assertRedirectsTo(response, 'catalogue:index')
  157. def tests_custumers_can_reach_the_thank_you_page(self):
  158. self.add_product_to_basket()
  159. self.enter_shipping_address()
  160. thank_you = self.place_order()
  161. self.assertIsOk(thank_you)
  162. def test_superusers_can_force_an_order(self):
  163. self.add_product_to_basket()
  164. self.enter_shipping_address()
  165. self.place_order()
  166. user = self.create_user('admin', 'admin@admin.com')
  167. user.is_superuser = True
  168. user.save()
  169. order = Order.objects.get()
  170. test_url = '%s?order_number=%s' % (
  171. reverse('checkout:thank-you'), order.number)
  172. response = self.get(test_url, status='*', user=user)
  173. self.assertIsOk(response)
  174. test_url = '%s?order_id=%s' % (reverse('checkout:thank-you'), order.pk)
  175. response = self.get(test_url, status='*', user=user)
  176. self.assertIsOk(response)
  177. def test_users_cannot_force_an_other_customer_order(self):
  178. self.add_product_to_basket()
  179. self.enter_shipping_address()
  180. self.place_order()
  181. user = self.create_user('John', 'john@test.com')
  182. user.save()
  183. order = Order.objects.get()
  184. test_url = '%s?order_number=%s' % (
  185. reverse('checkout:thank-you'), order.number)
  186. response = self.get(test_url, status='*', user=user)
  187. self.assertIsRedirect(response)
  188. self.assertRedirectsTo(response, 'catalogue:index')
  189. test_url = '%s?order_id=%s' % (reverse('checkout:thank-you'), order.pk)
  190. response = self.get(test_url, status='*', user=user)
  191. self.assertIsRedirect(response)
  192. self.assertRedirectsTo(response, 'catalogue:index')