您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

test_customer_checkout.py 9.9KB

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