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.

checkout_tests.py 8.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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
  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. class CheckoutMixin(object):
  11. fixtures = ['countries.json']
  12. def complete_guest_email_form(self, email='test@example.com'):
  13. response = self.client.post(reverse('checkout:index'),
  14. {'username': email,
  15. 'options': 'new'})
  16. self.assertIsRedirect(response)
  17. def complete_shipping_address(self):
  18. response = self.client.post(reverse('checkout:shipping-address'),
  19. {'last_name': 'Doe',
  20. 'line1': '1 Egg Street',
  21. 'postcode': 'N1 9RT',
  22. 'country': 'GB',
  23. })
  24. self.assertIsRedirect(response)
  25. def complete_shipping_method(self):
  26. self.client.get(reverse('checkout:shipping-method'))
  27. def assertRedirectUrlName(self, response, name):
  28. location = response['Location'].replace('http://testserver', '')
  29. self.assertEqual(location, reverse(name))
  30. class DisabledAnonymousCheckoutViewsTests(ClientTestCase):
  31. is_anonymous = True
  32. def test_index_does_not_require_login(self):
  33. url = reverse('checkout:index')
  34. response = self.client.get(url)
  35. self.assertIsOk(response)
  36. def test_user_address_views_require_a_login(self):
  37. urls = [reverse('checkout:user-address-create'),
  38. reverse('checkout:user-address-update', kwargs={'pk': 1}),
  39. reverse('checkout:user-address-delete', kwargs={'pk': 1}),]
  40. for url in urls:
  41. response = self.client.get(url)
  42. self.assertIsRedirect(response)
  43. def test_core_checkout_requires_login(self):
  44. urls = [reverse('checkout:shipping-address'),
  45. reverse('checkout:payment-method'),
  46. reverse('checkout:shipping-method'),
  47. reverse('checkout:payment-details')]
  48. for url in urls:
  49. response = self.client.get(url)
  50. self.assertIsRedirect(response)
  51. class EnabledAnonymousCheckoutViewsTests(ClientTestCase, CheckoutMixin):
  52. is_anonymous = True
  53. def reload_urlconf(self):
  54. if settings.ROOT_URLCONF in sys.modules:
  55. reload(sys.modules[settings.ROOT_URLCONF])
  56. return import_module(settings.ROOT_URLCONF)
  57. def add_product_to_basket(self):
  58. product = create_product(price=D('12.00'))
  59. self.client.post(reverse('basket:add'), {'product_id': product.id,
  60. 'quantity': 1})
  61. def test_shipping_address_does_require_session_email_address(self):
  62. with patch_settings(OSCAR_ALLOW_ANON_CHECKOUT=True):
  63. self.reload_urlconf()
  64. url = reverse('checkout:shipping-address')
  65. response = self.client.get(url)
  66. self.assertIsRedirect(response)
  67. def test_email_address_is_saved_with_order(self):
  68. with patch_settings(OSCAR_ALLOW_ANON_CHECKOUT=True):
  69. self.reload_urlconf()
  70. self.add_product_to_basket()
  71. self.complete_guest_email_form('barry@example.com')
  72. self.complete_shipping_address()
  73. self.complete_shipping_method()
  74. response = self.client.post(reverse('checkout:preview'), {'action': 'place_order'})
  75. response = self.client.get(reverse('checkout:thank-you'))
  76. order = response.context['order']
  77. self.assertEqual('barry@example.com', order.guest_email)
  78. class ShippingAddressViewTests(ClientTestCase):
  79. fixtures = ['countries.json']
  80. def test_anon_checkout_disabled_by_default(self):
  81. self.assertFalse(settings.OSCAR_ALLOW_ANON_CHECKOUT)
  82. def test_create_shipping_address_adds_address_to_session(self):
  83. response = self.client.post(reverse('checkout:shipping-address'),
  84. {'last_name': 'Doe',
  85. 'line1': '1 Egg Street',
  86. 'postcode': 'N1 9RT',
  87. 'country': 'GB',
  88. })
  89. self.assertIsRedirect(response)
  90. session_address = self.client.session['checkout_data']['shipping']['new_address_fields']
  91. self.assertEqual('Doe', session_address['last_name'])
  92. self.assertEqual('1 Egg Street', session_address['line1'])
  93. self.assertEqual('N1 9RT', session_address['postcode'])
  94. class ShippingMethodViewTests(ClientTestCase, CheckoutMixin):
  95. fixtures = ['countries.json']
  96. def test_shipping_method_view_redirects_if_no_shipping_address(self):
  97. response = self.client.get(reverse('checkout:shipping-method'))
  98. self.assertIsRedirect(response)
  99. self.assertRedirectUrlName(response, 'checkout:shipping-address')
  100. def test_redirects_by_default(self):
  101. self.complete_shipping_address()
  102. response = self.client.get(reverse('checkout:shipping-method'))
  103. self.assertRedirectUrlName(response, 'checkout:payment-method')
  104. class PaymentMethodViewTests(ClientTestCase, CheckoutMixin):
  105. def test_view_redirects_if_no_shipping_address(self):
  106. response = self.client.get(reverse('checkout:payment-method'))
  107. self.assertIsRedirect(response)
  108. self.assertRedirectUrlName(response, 'checkout:shipping-address')
  109. def test_view_redirects_if_no_shipping_method(self):
  110. self.complete_shipping_address()
  111. response = self.client.get(reverse('checkout:payment-method'))
  112. self.assertIsRedirect(response)
  113. self.assertRedirectUrlName(response, 'checkout:shipping-method')
  114. class PreviewViewTests(ClientTestCase, CheckoutMixin):
  115. def test_view_redirects_if_no_shipping_address(self):
  116. response = self.client.get(reverse('checkout:preview'))
  117. self.assertIsRedirect(response)
  118. self.assertRedirectUrlName(response, 'checkout:shipping-address')
  119. def test_view_redirects_if_no_shipping_method(self):
  120. self.complete_shipping_address()
  121. response = self.client.get(reverse('checkout:preview'))
  122. self.assertIsRedirect(response)
  123. self.assertRedirectUrlName(response, 'checkout:shipping-method')
  124. def test_ok_response_if_previous_steps_complete(self):
  125. self.complete_shipping_address()
  126. self.complete_shipping_method()
  127. response = self.client.get(reverse('checkout:preview'))
  128. self.assertIsOk(response)
  129. class PaymentDetailsViewTests(ClientTestCase, CheckoutMixin):
  130. def test_view_redirects_if_no_shipping_address(self):
  131. response = self.client.post(reverse('checkout:payment-details'))
  132. self.assertIsRedirect(response)
  133. self.assertRedirectUrlName(response, 'checkout:shipping-address')
  134. def test_view_redirects_if_no_shipping_method(self):
  135. self.complete_shipping_address()
  136. response = self.client.post(reverse('checkout:payment-details'))
  137. self.assertIsRedirect(response)
  138. self.assertRedirectUrlName(response, 'checkout:shipping-method')
  139. def test_placing_order_with_empty_basket_redirects(self):
  140. self.complete_shipping_address()
  141. self.complete_shipping_method()
  142. response = self.client.post(reverse('checkout:preview'), {'action': 'place_order'})
  143. self.assertIsRedirect(response)
  144. self.assertRedirectUrlName(response, 'checkout:shipping-address')
  145. class OrderPlacementTests(ClientTestCase, CheckoutMixin):
  146. def setUp(self):
  147. Order.objects.all().delete()
  148. super(OrderPlacementTests, self).setUp()
  149. self.basket = Basket.objects.create(owner=self.user)
  150. self.basket.add_product(create_product(price=D('12.00')))
  151. self.complete_shipping_address()
  152. self.complete_shipping_method()
  153. self.response = self.client.post(reverse('checkout:preview'), {'action': 'place_order'})
  154. def test_placing_order_with_nonempty_basket_redirects(self):
  155. self.assertIsRedirect(self.response)
  156. self.assertRedirectUrlName(self.response, 'checkout:thank-you')
  157. def test_order_is_created(self):
  158. self.assertIsRedirect(self.response)
  159. orders = Order.objects.all()
  160. self.assertEqual(1, len(orders))