123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 |
- import sys
-
- from django.test.utils import override_settings
- from django.core.urlresolvers import reverse
- from django.conf import settings
- from django.utils.importlib import import_module
- import mock
-
- from oscar.test.testcases import WebTestCase
- from oscar.test import factories
- from . import CheckoutMixin
-
- # Python 3 compat
- try:
- from imp import reload
- except ImportError:
- pass
-
-
- def reload_url_conf():
- # Reload URLs to pick up the overridden settings
- if settings.ROOT_URLCONF in sys.modules:
- reload(sys.modules[settings.ROOT_URLCONF])
- import_module(settings.ROOT_URLCONF)
-
-
- @override_settings(OSCAR_ALLOW_ANON_CHECKOUT=True)
- class TestIndexView(CheckoutMixin, WebTestCase):
- is_anonymous = True
-
- def setUp(self):
- reload_url_conf()
- super(TestIndexView, self).setUp()
-
- def test_redirects_customers_with_empty_basket(self):
- response = self.get(reverse('checkout:index'))
- self.assertRedirectUrlName(response, 'basket:summary')
-
- def test_redirects_customers_with_invalid_basket(self):
- # Add product to basket but then remove its stock so it is not
- # purchasable.
- product = factories.create_product(num_in_stock=1)
- self.add_product_to_basket(product)
- product.stockrecords.all().update(num_in_stock=0)
-
- response = self.get(reverse('checkout:index'))
- self.assertRedirectUrlName(response, 'basket:summary')
-
-
- @override_settings(OSCAR_ALLOW_ANON_CHECKOUT=True)
- class TestShippingAddressView(CheckoutMixin, WebTestCase):
- is_anonymous = True
-
- def setUp(self):
- reload_url_conf()
- super(TestShippingAddressView, self).setUp()
-
- def test_redirects_customers_with_empty_basket(self):
- response = self.get(reverse('checkout:shipping-address'))
- self.assertRedirectUrlName(response, 'basket:summary')
-
- def test_redirects_customers_who_have_skipped_guest_form(self):
- self.add_product_to_basket()
- response = self.get(reverse('checkout:shipping-address'))
- self.assertRedirectUrlName(response, 'checkout:index')
-
- def test_redirects_customers_whose_basket_doesnt_require_shipping(self):
- product = self.create_digital_product()
- self.add_product_to_basket(product)
- self.enter_guest_details()
-
- response = self.get(reverse('checkout:shipping-address'))
- self.assertRedirectUrlName(response, 'checkout:shipping-method')
-
- def test_redirects_customers_with_invalid_basket(self):
- # Add product to basket but then remove its stock so it is not
- # purchasable.
- product = factories.create_product(num_in_stock=1)
- self.add_product_to_basket(product)
- self.enter_guest_details()
-
- product.stockrecords.all().update(num_in_stock=0)
-
- response = self.get(reverse('checkout:shipping-address'))
- self.assertRedirectUrlName(response, 'basket:summary')
-
-
- @override_settings(OSCAR_ALLOW_ANON_CHECKOUT=True)
- class TestShippingMethodView(CheckoutMixin, WebTestCase):
- is_anonymous = True
-
- def setUp(self):
- reload_url_conf()
- super(TestShippingMethodView, self).setUp()
-
- def test_redirects_customers_with_empty_basket(self):
- response = self.get(reverse('checkout:shipping-method'))
- self.assertRedirectUrlName(response, 'basket:summary')
-
- def test_redirects_customers_with_invalid_basket(self):
- product = factories.create_product(num_in_stock=1)
- self.add_product_to_basket(product)
- self.enter_guest_details()
- self.enter_shipping_address()
- product.stockrecords.all().update(num_in_stock=0)
-
- response = self.get(reverse('checkout:shipping-method'))
- self.assertRedirectUrlName(response, 'basket:summary')
-
- def test_redirects_customers_who_have_skipped_guest_form(self):
- self.add_product_to_basket()
-
- response = self.get(reverse('checkout:shipping-method'))
- self.assertRedirectUrlName(response, 'checkout:index')
-
- def test_redirects_customers_whose_basket_doesnt_require_shipping(self):
- product = self.create_digital_product()
- self.add_product_to_basket(product)
- self.enter_guest_details()
-
- response = self.get(reverse('checkout:shipping-method'))
- self.assertRedirectUrlName(response, 'checkout:payment-method')
-
- def test_redirects_customers_who_have_skipped_shipping_address_form(self):
- self.add_product_to_basket()
- self.enter_guest_details()
-
- response = self.get(reverse('checkout:shipping-method'))
- self.assertRedirectUrlName(response, 'checkout:shipping-address')
-
- @mock.patch('oscar.apps.checkout.views.Repository')
- def test_redirects_customers_when_no_shipping_methods_available(self, mock_repo):
- self.add_product_to_basket()
- self.enter_guest_details()
- self.enter_shipping_address()
-
- # Ensure no shipping methods available
- instance = mock_repo.return_value
- instance.get_shipping_methods.return_value = []
-
- response = self.get(reverse('checkout:shipping-address'))
- self.assertIsOk(response)
-
- @mock.patch('oscar.apps.checkout.views.Repository')
- def test_redirects_customers_when_only_one_shipping_methods_available(self, mock_repo):
- self.add_product_to_basket()
- self.enter_guest_details()
- self.enter_shipping_address()
-
- # Ensure one shipping method available
- method = mock.MagicMock()
- method.code = 'm'
- instance = mock_repo.return_value
- instance.get_shipping_methods.return_value = [method]
-
- response = self.get(reverse('checkout:shipping-method'))
- self.assertRedirectUrlName(response, 'checkout:payment-method')
-
- @mock.patch('oscar.apps.checkout.views.Repository')
- def test_shows_form_when_multiple_shipping_methods_available(self, mock_repo):
- self.add_product_to_basket()
- self.enter_guest_details()
- self.enter_shipping_address()
-
- # Ensure multiple shipping methods available
- method = mock.MagicMock()
- method.code = 'm'
- instance = mock_repo.return_value
- instance.get_shipping_methods.return_value = [method, method]
-
- response = self.get(reverse('checkout:shipping-method'))
- self.assertIsOk(response)
-
-
- @override_settings(OSCAR_ALLOW_ANON_CHECKOUT=True)
- class TestPaymentMethodView(CheckoutMixin, WebTestCase):
- is_anonymous = True
-
- def setUp(self):
- reload_url_conf()
- super(TestPaymentMethodView, self).setUp()
-
- def test_redirects_customers_with_empty_basket(self):
- response = self.get(reverse('checkout:payment-method'))
- self.assertRedirectUrlName(response, 'basket:summary')
-
- def test_redirects_customers_with_invalid_basket(self):
- product = factories.create_product(num_in_stock=1)
- self.add_product_to_basket(product)
- self.enter_guest_details()
- self.enter_shipping_address()
-
- product.stockrecords.all().update(num_in_stock=0)
-
- response = self.get(reverse('checkout:payment-method'))
- self.assertRedirectUrlName(response, 'basket:summary')
-
- def test_redirects_customers_who_have_skipped_guest_form(self):
- self.add_product_to_basket()
-
- response = self.get(reverse('checkout:payment-method'))
- self.assertRedirectUrlName(response, 'checkout:index')
-
- def test_redirects_customers_who_have_skipped_shipping_address_form(self):
- self.add_product_to_basket()
- self.enter_guest_details()
-
- response = self.get(reverse('checkout:payment-method'))
- self.assertRedirectUrlName(response, 'checkout:shipping-address')
-
- def test_redirects_customers_who_have_skipped_shipping_method_step(self):
- self.add_product_to_basket()
- self.enter_guest_details()
- self.enter_shipping_address()
-
- response = self.get(reverse('checkout:payment-method'))
- self.assertRedirectUrlName(response, 'checkout:shipping-method')
-
-
- @override_settings(OSCAR_ALLOW_ANON_CHECKOUT=True)
- class TestPaymentDetailsView(CheckoutMixin, WebTestCase):
- is_anonymous = True
-
- def setUp(self):
- reload_url_conf()
- super(TestPaymentDetailsView, self).setUp()
-
- def test_redirects_customers_with_empty_basket(self):
- response = self.get(reverse('checkout:payment-details'))
- self.assertRedirectUrlName(response, 'basket:summary')
-
- def test_redirects_customers_with_invalid_basket(self):
- product = factories.create_product(num_in_stock=1)
- self.add_product_to_basket(product)
- self.enter_guest_details()
- self.enter_shipping_address()
-
- product.stockrecords.all().update(num_in_stock=0)
-
- response = self.get(reverse('checkout:payment-details'))
- self.assertRedirectUrlName(response, 'basket:summary')
-
- def test_redirects_customers_who_have_skipped_guest_form(self):
- self.add_product_to_basket()
-
- response = self.get(reverse('checkout:payment-details'))
- self.assertRedirectUrlName(response, 'checkout:index')
-
- def test_redirects_customers_who_have_skipped_shipping_address_form(self):
- self.add_product_to_basket()
- self.enter_guest_details()
-
- response = self.get(reverse('checkout:payment-details'))
- self.assertRedirectUrlName(response, 'checkout:shipping-address')
-
- def test_redirects_customers_who_have_skipped_shipping_method_step(self):
- self.add_product_to_basket()
- self.enter_guest_details()
- self.enter_shipping_address()
-
- response = self.get(reverse('checkout:payment-details'))
- self.assertRedirectUrlName(response, 'checkout:shipping-method')
-
-
- @override_settings(OSCAR_ALLOW_ANON_CHECKOUT=True)
- class TestPlacingOrder(CheckoutMixin, WebTestCase):
- is_anonymous = True
-
- def setUp(self):
- reload_url_conf()
- super(TestPlacingOrder, self).setUp()
-
- def test_saves_guest_email_with_order(self):
- self.add_product_to_basket()
- self.enter_guest_details('hello@egg.com')
- self.enter_shipping_address()
-
- page = self.get(reverse('checkout:shipping-method')).follow().follow()
- preview = page.click(linkid="view_preview")
- thank_you = preview.forms['place-order-form'].submit().follow()
-
- order = thank_you.context['order']
- self.assertEqual('hello@egg.com', order.guest_email)
|