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.

tests.py 8.5KB

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