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.

checkout_tests.py 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. from decimal import Decimal as D
  2. import sys
  3. from django.core.urlresolvers import reverse
  4. from django.conf import settings
  5. from django.utils.importlib import import_module
  6. from oscar.test.helpers import create_product, create_voucher
  7. from oscar.test import ClientTestCase, patch_settings
  8. from oscar.apps.basket.models import Basket
  9. from oscar.apps.order.models import Order
  10. from oscar.apps.address.models import Country
  11. class CheckoutMixin(object):
  12. def add_product_to_basket(self):
  13. product = create_product(price=D('12.00'))
  14. self.client.post(reverse('basket:add'), {'product_id': product.id,
  15. 'quantity': 1})
  16. def add_voucher_to_basket(self):
  17. voucher = create_voucher()
  18. self.client.post(reverse('basket:vouchers-add'),
  19. {'code': voucher.code})
  20. def complete_guest_email_form(self, email='test@example.com'):
  21. response = self.client.post(reverse('checkout:index'),
  22. {'username': email,
  23. 'options': 'new'})
  24. self.assertIsRedirect(response)
  25. def complete_shipping_address(self):
  26. Country.objects.get_or_create(
  27. iso_3166_1_a2='GB',
  28. is_shipping_country=True
  29. )
  30. response = self.client.post(reverse('checkout:shipping-address'),
  31. {'last_name': 'Doe',
  32. 'line1': '1 Egg Street',
  33. 'postcode': 'N1 9RT',
  34. 'country': 'GB',
  35. })
  36. self.assertIsRedirect(response)
  37. def complete_shipping_method(self):
  38. self.client.get(reverse('checkout:shipping-method'))
  39. def submit(self):
  40. return self.client.post(reverse('checkout:preview'), {'action': 'place_order'})
  41. class DisabledAnonymousCheckoutViewsTests(ClientTestCase):
  42. is_anonymous = True
  43. def test_index_does_not_require_login(self):
  44. url = reverse('checkout:index')
  45. response = self.client.get(url)
  46. self.assertIsOk(response)
  47. def test_user_address_views_require_a_login(self):
  48. urls = [reverse('checkout:user-address-create'),
  49. reverse('checkout:user-address-update', kwargs={'pk': 1}),
  50. reverse('checkout:user-address-delete', kwargs={'pk': 1}),]
  51. for url in urls:
  52. response = self.client.get(url)
  53. self.assertIsRedirect(response)
  54. def test_core_checkout_requires_login(self):
  55. urls = [reverse('checkout:shipping-address'),
  56. reverse('checkout:payment-method'),
  57. reverse('checkout:shipping-method'),
  58. reverse('checkout:payment-details')]
  59. for url in urls:
  60. response = self.client.get(url)
  61. self.assertIsRedirect(response)
  62. class EnabledAnonymousCheckoutViewsTests(ClientTestCase, CheckoutMixin):
  63. is_anonymous = True
  64. def reload_urlconf(self):
  65. if settings.ROOT_URLCONF in sys.modules:
  66. reload(sys.modules[settings.ROOT_URLCONF])
  67. return import_module(settings.ROOT_URLCONF)
  68. def add_product_to_basket(self):
  69. product = create_product(price=D('12.00'))
  70. self.client.post(reverse('basket:add'), {'product_id': product.id,
  71. 'quantity': 1})
  72. def test_shipping_address_does_require_session_email_address(self):
  73. with patch_settings(OSCAR_ALLOW_ANON_CHECKOUT=True):
  74. self.reload_urlconf()
  75. url = reverse('checkout:shipping-address')
  76. response = self.client.get(url)
  77. self.assertIsRedirect(response)
  78. def test_email_address_is_saved_with_order(self):
  79. with patch_settings(OSCAR_ALLOW_ANON_CHECKOUT=True):
  80. self.reload_urlconf()
  81. self.add_product_to_basket()
  82. self.complete_guest_email_form('barry@example.com')
  83. self.complete_shipping_address()
  84. self.complete_shipping_method()
  85. response = self.client.post(reverse('checkout:preview'), {'action': 'place_order'})
  86. response = self.client.get(reverse('checkout:thank-you'))
  87. order = response.context['order']
  88. self.assertEqual('barry@example.com', order.guest_email)
  89. class TestShippingAddressView(ClientTestCase, CheckoutMixin):
  90. fixtures = ['countries.json']
  91. def test_pages_returns_200(self):
  92. self.add_product_to_basket()
  93. response = self.client.get(reverse('checkout:shipping-address'))
  94. self.assertIsOk(response)
  95. def test_anon_checkout_disabled_by_default(self):
  96. self.assertFalse(settings.OSCAR_ALLOW_ANON_CHECKOUT)
  97. def test_create_shipping_address_adds_address_to_session(self):
  98. response = self.client.post(reverse('checkout:shipping-address'),
  99. {'last_name': 'Doe',
  100. 'line1': '1 Egg Street',
  101. 'postcode': 'N1 9RT',
  102. 'country': 'GB',
  103. })
  104. self.assertIsRedirect(response)
  105. session_address = self.client.session['checkout_data']['shipping']['new_address_fields']
  106. self.assertEqual('Doe', session_address['last_name'])
  107. self.assertEqual('1 Egg Street', session_address['line1'])
  108. self.assertEqual('N1 9RT', session_address['postcode'])
  109. def test_user_must_have_a_nonempty_basket(self):
  110. response = self.client.get(reverse('checkout:shipping-address'))
  111. self.assertRedirectUrlName(response, 'basket:summary')
  112. class TestShippingMethodView(ClientTestCase, CheckoutMixin):
  113. fixtures = ['countries.json']
  114. def test_shipping_method_view_redirects_if_no_shipping_address(self):
  115. self.add_product_to_basket()
  116. response = self.client.get(reverse('checkout:shipping-method'))
  117. self.assertIsRedirect(response)
  118. self.assertRedirectUrlName(response, 'checkout:shipping-address')
  119. def test_redirects_by_default(self):
  120. self.add_product_to_basket()
  121. self.complete_shipping_address()
  122. response = self.client.get(reverse('checkout:shipping-method'))
  123. self.assertRedirectUrlName(response, 'checkout:payment-method')
  124. def test_user_must_have_a_nonempty_basket(self):
  125. response = self.client.get(reverse('checkout:shipping-method'))
  126. self.assertRedirectUrlName(response, 'basket:summary')
  127. class TestPaymentMethodView(ClientTestCase, CheckoutMixin):
  128. def test_view_redirects_if_no_shipping_address(self):
  129. self.add_product_to_basket()
  130. response = self.client.get(reverse('checkout:payment-method'))
  131. self.assertIsRedirect(response)
  132. self.assertRedirectUrlName(response, 'checkout:shipping-address')
  133. def test_view_redirects_if_no_shipping_method(self):
  134. self.add_product_to_basket()
  135. self.complete_shipping_address()
  136. response = self.client.get(reverse('checkout:payment-method'))
  137. self.assertIsRedirect(response)
  138. self.assertRedirectUrlName(response, 'checkout:shipping-method')
  139. def test_user_must_have_a_nonempty_basket(self):
  140. response = self.client.get(reverse('checkout:payment-method'))
  141. self.assertRedirectUrlName(response, 'basket:summary')
  142. class TestPreviewView(ClientTestCase, CheckoutMixin):
  143. def test_user_must_have_a_nonempty_basket(self):
  144. response = self.client.get(reverse('checkout:preview'))
  145. self.assertRedirectUrlName(response, 'basket:summary')
  146. def test_view_redirects_if_no_shipping_address(self):
  147. self.add_product_to_basket()
  148. response = self.client.get(reverse('checkout:preview'))
  149. self.assertIsRedirect(response)
  150. self.assertRedirectUrlName(response, 'checkout:shipping-address')
  151. def test_view_redirects_if_no_shipping_method(self):
  152. self.add_product_to_basket()
  153. self.complete_shipping_address()
  154. response = self.client.get(reverse('checkout:preview'))
  155. self.assertIsRedirect(response)
  156. self.assertRedirectUrlName(response, 'checkout:shipping-method')
  157. def test_ok_response_if_previous_steps_complete(self):
  158. self.add_product_to_basket()
  159. self.complete_shipping_address()
  160. self.complete_shipping_method()
  161. response = self.client.get(reverse('checkout:preview'))
  162. self.assertIsOk(response)
  163. class PaymentDetailsViewTests(ClientTestCase, CheckoutMixin):
  164. def test_user_must_have_a_nonempty_basket(self):
  165. response = self.client.get(reverse('checkout:payment-details'))
  166. self.assertRedirectUrlName(response, 'basket:summary')
  167. def test_view_redirects_if_no_shipping_address(self):
  168. self.add_product_to_basket()
  169. response = self.client.post(reverse('checkout:payment-details'))
  170. self.assertIsRedirect(response)
  171. self.assertRedirectUrlName(response, 'checkout:shipping-address')
  172. def test_view_redirects_if_no_shipping_method(self):
  173. self.add_product_to_basket()
  174. self.complete_shipping_address()
  175. response = self.client.post(reverse('checkout:payment-details'))
  176. self.assertIsRedirect(response)
  177. self.assertRedirectUrlName(response, 'checkout:shipping-method')
  178. def test_placing_order_with_empty_basket_redirects(self):
  179. response = self.client.post(reverse('checkout:preview'), {'action': 'place_order'})
  180. self.assertIsRedirect(response)
  181. self.assertRedirectUrlName(response, 'basket:summary')
  182. class OrderPlacementTests(ClientTestCase, CheckoutMixin):
  183. def setUp(self):
  184. Order.objects.all().delete()
  185. super(OrderPlacementTests, self).setUp()
  186. self.basket = Basket.objects.create(owner=self.user)
  187. self.basket.add_product(create_product(price=D('12.00')))
  188. self.complete_shipping_address()
  189. self.complete_shipping_method()
  190. self.response = self.client.post(reverse('checkout:preview'), {'action': 'place_order'})
  191. def test_placing_order_with_nonempty_basket_redirects(self):
  192. self.assertIsRedirect(self.response)
  193. self.assertRedirectUrlName(self.response, 'checkout:thank-you')
  194. def test_order_is_created(self):
  195. self.assertIsRedirect(self.response)
  196. orders = Order.objects.all()
  197. self.assertEqual(1, len(orders))
  198. class TestAnonUserOrderPlacementScenarios(ClientTestCase, CheckoutMixin):
  199. def test_basic_submission_gets_redirect_to_thankyou(self):
  200. self.add_product_to_basket()
  201. self.complete_shipping_address()
  202. self.complete_shipping_method()
  203. response = self.submit()
  204. self.assertRedirectUrlName(response, 'checkout:thank-you')
  205. def test_submission_using_voucher(self):
  206. self.add_product_to_basket()
  207. self.add_voucher_to_basket()
  208. self.complete_shipping_address()
  209. self.complete_shipping_method()
  210. response = self.submit()
  211. self.assertRedirectUrlName(response, 'checkout:thank-you')