Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

test_customer_checkout.py 9.1KB

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