Browse Source

Rewrite checkout functional tests

We no longer use Django's test client.
master
David Winterbottom 11 years ago
parent
commit
21d73a1a96

+ 1
- 1
oscar/apps/basket/forms.py View File

@@ -1,9 +1,9 @@
1 1
 from django import forms
2 2
 from django.conf import settings
3
-from oscar.core.loading import get_model
4 3
 from django.forms.models import modelformset_factory, BaseModelFormSet
5 4
 from django.utils.translation import ugettext_lazy as _
6 5
 
6
+from oscar.core.loading import get_model
7 7
 from oscar.forms import widgets
8 8
 
9 9
 Line = get_model('basket', 'line')

+ 1
- 1
oscar/templates/oscar/basket/basket.html View File

@@ -32,7 +32,7 @@
32 32
     {{ block.super }}
33 33
     {# We pass in the URL to send AJAX requests to #}
34 34
     var options = {
35
-    'basketURL': '{% url 'basket:summary' %}'
35
+        'basketURL': '{% url 'basket:summary' %}'
36 36
     };
37 37
     oscar.basket.init(options);
38 38
 {% endblock %}

+ 1
- 1
oscar/templates/oscar/basket/partials/basket_content.html View File

@@ -114,7 +114,7 @@
114 114
 
115 115
                 <div id="voucher_form_container" style="display:none">
116 116
                     <h4>{% trans "Voucher code" %}</h4>
117
-                    <form action="{% url 'basket:vouchers-add' %}" method="post">
117
+                    <form id="voucher_form" action="{% url 'basket:vouchers-add' %}" method="post">
118 118
                         {% csrf_token %}
119 119
                         {% include "partials/form_fields.html" with form=voucher_form %}
120 120
                         <button type="submit" class="btn btn-info">{% trans "Add voucher" %}</button>

+ 61
- 0
tests/functional/checkout/__init__.py View File

@@ -0,0 +1,61 @@
1
+from decimal import Decimal as D
2
+
3
+from django.core.urlresolvers import reverse
4
+
5
+from oscar.apps.address.models import Country
6
+from oscar.test import factories
7
+
8
+
9
+class CheckoutMixin(object):
10
+
11
+    def create_digital_product(self):
12
+        product = factories.create_product(price=D('12.00'), num_in_stock=None)
13
+        product.product_class.requires_shipping = False
14
+        product.product_class.track_stock = False
15
+        product.product_class.save()
16
+        return product
17
+
18
+    def add_product_to_basket(self, product=None):
19
+        if product is None:
20
+            product = factories.create_product(price=D('12.00'),
21
+                                               num_in_stock=10)
22
+        detail_page = self.get(product.get_absolute_url())
23
+        form = detail_page.forms['add_to_basket_form']
24
+        form.submit()
25
+
26
+    def add_voucher_to_basket(self, voucher=None):
27
+        if voucher is None:
28
+            voucher = factories.create_voucher()
29
+        basket_page = self.get(reverse('basket:summary'))
30
+        form = basket_page.forms['voucher_form']
31
+        form['code'] = voucher.code
32
+        form.submit()
33
+
34
+    def enter_guest_details(self, email='guest@example.com'):
35
+        index_page = self.get(reverse('checkout:index'))
36
+        index_page.form['username'] = email
37
+        index_page.form.submit()
38
+
39
+    def create_shipping_country(self):
40
+        Country.objects.get_or_create(
41
+            iso_3166_1_a2='GB', is_shipping_country=True)
42
+
43
+    def enter_shipping_address(self):
44
+        self.create_shipping_country()
45
+        address_page = self.get(reverse('checkout:shipping-address'))
46
+        form = address_page.forms['new_shipping_address']
47
+        form['first_name'] = 'John'
48
+        form['last_name'] = 'Doe'
49
+        form['line1'] = '1 Egg Road'
50
+        form['line4'] = 'Shell City'
51
+        form['postcode'] = 'N12 9RT'
52
+        form.submit()
53
+
54
+    def enter_shipping_method(self):
55
+        self.get(reverse('checkout:shipping-method'))
56
+
57
+    def place_order(self):
58
+        payment_details = self.get(
59
+            reverse('checkout:shipping-method')).follow().follow()
60
+        preview = payment_details.click(linkid="view_preview")
61
+        return preview.forms['place-order-form'].submit().follow()

+ 0
- 289
tests/functional/checkout/checkout_tests.py View File

@@ -1,289 +0,0 @@
1
-from decimal import Decimal as D
2
-import sys
3
-
4
-from django.core.urlresolvers import reverse
5
-from django.conf import settings
6
-from django.utils.importlib import import_module
7
-from django.test.utils import override_settings
8
-
9
-from oscar.test.factories import (
10
-    create_product, create_voucher, create_offer)
11
-from oscar.test.testcases import WebTestCase
12
-from oscar.apps.basket.models import Basket
13
-from oscar.apps.order.models import Order
14
-from oscar.apps.address.models import Country
15
-from oscar.apps.voucher.models import Voucher
16
-from oscar.apps.offer.models import ConditionalOffer
17
-from oscar.test.basket import add_product
18
-
19
-# Python 3 compat
20
-try:
21
-    from imp import reload
22
-except ImportError:
23
-    pass
24
-
25
-
26
-class CheckoutMixin(object):
27
-
28
-    def add_product_to_basket(self):
29
-        product = create_product(price=D('12.00'), num_in_stock=10)
30
-        self.client.post(reverse('basket:add'), {'product_id': product.id,
31
-                                                 'quantity': 1})
32
-
33
-    def add_voucher_to_basket(self, voucher=None):
34
-        if voucher is None:
35
-            voucher = create_voucher()
36
-        self.client.post(reverse('basket:vouchers-add'),
37
-                         {'code': voucher.code})
38
-
39
-    def complete_guest_email_form(self, email='test@example.com'):
40
-        response = self.client.post(reverse('checkout:index'),
41
-                                    {'username': email,
42
-                                     'options': 'new'})
43
-        self.assertIsRedirect(response)
44
-
45
-    def complete_shipping_address(self):
46
-        Country.objects.get_or_create(
47
-            iso_3166_1_a2='GB',
48
-            is_shipping_country=True
49
-        )
50
-        response = self.client.post(reverse('checkout:shipping-address'),
51
-                                     {'last_name': 'Doe',
52
-                                      'first_name': 'John',
53
-                                      'line1': '1 Egg Street',
54
-                                      'line4': 'City',
55
-                                      'postcode': 'N1 9RT',
56
-                                      'country': 'GB',
57
-                                     })
58
-        self.assertRedirectUrlName(response, 'checkout:shipping-method')
59
-
60
-    def complete_shipping_method(self):
61
-        self.client.get(reverse('checkout:shipping-method'))
62
-
63
-    def submit(self):
64
-        return self.client.post(reverse('checkout:preview'), {'action': 'place_order'})
65
-
66
-
67
-class DisabledAnonymousCheckoutViewsTests(WebTestCase):
68
-    is_anonymous = True
69
-
70
-    def test_index_does_require_login(self):
71
-        url = reverse('checkout:index')
72
-        response = self.client.get(url)
73
-        self.assertIsRedirect(response)
74
-
75
-    def test_user_address_views_require_a_login(self):
76
-        urls = [reverse('checkout:user-address-update', kwargs={'pk': 1}),
77
-                reverse('checkout:user-address-delete', kwargs={'pk': 1}),]
78
-        for url in urls:
79
-            response = self.client.get(url)
80
-            self.assertIsRedirect(response)
81
-
82
-    def test_core_checkout_requires_login(self):
83
-        urls = [reverse('checkout:shipping-address'),
84
-                reverse('checkout:payment-method'),
85
-                reverse('checkout:shipping-method'),
86
-                reverse('checkout:payment-details')]
87
-        for url in urls:
88
-            response = self.client.get(url)
89
-            self.assertIsRedirect(response)
90
-
91
-
92
-class TestShippingAddressView(WebTestCase, CheckoutMixin):
93
-    fixtures = ['countries.json']
94
-
95
-    def test_pages_returns_200(self):
96
-        self.add_product_to_basket()
97
-        response = self.client.get(reverse('checkout:shipping-address'))
98
-        self.assertIsOk(response)
99
-
100
-    def test_anon_checkout_disabled_by_default(self):
101
-        self.assertFalse(settings.OSCAR_ALLOW_ANON_CHECKOUT)
102
-
103
-    def test_create_shipping_address_adds_address_to_session(self):
104
-        self.add_product_to_basket()
105
-        response = self.client.post(reverse('checkout:shipping-address'),
106
-                                            {'last_name': 'Doe',
107
-                                             'first_name': 'John',
108
-                                             'line1': '1 Egg Street',
109
-                                             'line4': 'City',
110
-                                             'postcode': 'N1 9RT',
111
-                                             'country': 'GB',
112
-                                            })
113
-        self.assertIsRedirect(response)
114
-        session_address = self.client.session['checkout_data']['shipping']['new_address_fields']
115
-        self.assertEqual('Doe', session_address['last_name'])
116
-        self.assertEqual('1 Egg Street', session_address['line1'])
117
-        self.assertEqual('N1 9RT', session_address['postcode'])
118
-
119
-    def test_invalid_shipping_address_fails(self):
120
-        self.add_product_to_basket()
121
-        response = self.client.post(reverse('checkout:shipping-address'),
122
-                                    {'last_name': 'Doe',
123
-                                     'first_name': 'John',
124
-                                     'postcode': 'N1 9RT',
125
-                                     'country': 'GB',
126
-                                     })
127
-        self.assertIsOk(response)  # no redirect
128
-
129
-    def test_user_must_have_a_nonempty_basket(self):
130
-        response = self.client.get(reverse('checkout:shipping-address'))
131
-        self.assertRedirectUrlName(response, 'basket:summary')
132
-
133
-
134
-class TestShippingMethodView(WebTestCase, CheckoutMixin):
135
-    fixtures = ['countries.json']
136
-
137
-    def test_shipping_method_view_redirects_if_no_shipping_address(self):
138
-        self.add_product_to_basket()
139
-        response = self.client.get(reverse('checkout:shipping-method'))
140
-        self.assertIsRedirect(response)
141
-        self.assertRedirectUrlName(response, 'checkout:shipping-address')
142
-
143
-    def test_redirects_by_default(self):
144
-        self.add_product_to_basket()
145
-        self.complete_shipping_address()
146
-        response = self.client.get(reverse('checkout:shipping-method'))
147
-        self.assertRedirectUrlName(response, 'checkout:payment-method')
148
-
149
-    def test_user_must_have_a_nonempty_basket(self):
150
-        response = self.client.get(reverse('checkout:shipping-method'))
151
-        self.assertRedirectUrlName(response, 'basket:summary')
152
-
153
-
154
-class TestPaymentMethodView(WebTestCase, CheckoutMixin):
155
-
156
-    def test_view_redirects_if_no_shipping_address(self):
157
-        self.add_product_to_basket()
158
-        response = self.client.get(reverse('checkout:payment-method'))
159
-        self.assertIsRedirect(response)
160
-        self.assertRedirectUrlName(response, 'checkout:shipping-address')
161
-
162
-    def test_view_redirects_if_no_shipping_method(self):
163
-        self.add_product_to_basket()
164
-        self.complete_shipping_address()
165
-        response = self.client.get(reverse('checkout:payment-method'))
166
-        self.assertIsRedirect(response)
167
-        self.assertRedirectUrlName(response, 'checkout:shipping-method')
168
-
169
-    def test_user_must_have_a_nonempty_basket(self):
170
-        response = self.client.get(reverse('checkout:payment-method'))
171
-        self.assertRedirectUrlName(response, 'basket:summary')
172
-
173
-
174
-class TestPreviewView(WebTestCase, CheckoutMixin):
175
-
176
-    def test_user_must_have_a_nonempty_basket(self):
177
-        response = self.client.get(reverse('checkout:preview'))
178
-        self.assertRedirectUrlName(response, 'basket:summary')
179
-
180
-    def test_view_redirects_if_no_shipping_address(self):
181
-        self.add_product_to_basket()
182
-        response = self.client.get(reverse('checkout:preview'))
183
-        self.assertIsRedirect(response)
184
-        self.assertRedirectUrlName(response, 'checkout:shipping-address')
185
-
186
-    def test_view_redirects_if_no_shipping_method(self):
187
-        self.add_product_to_basket()
188
-        self.complete_shipping_address()
189
-        response = self.client.get(reverse('checkout:preview'))
190
-        self.assertIsRedirect(response)
191
-        self.assertRedirectUrlName(response, 'checkout:shipping-method')
192
-
193
-    def test_ok_response_if_previous_steps_complete(self):
194
-        self.add_product_to_basket()
195
-        self.complete_shipping_address()
196
-        self.complete_shipping_method()
197
-        response = self.client.get(reverse('checkout:preview'))
198
-        self.assertIsOk(response)
199
-
200
-
201
-class TestPaymentDetailsView(WebTestCase, CheckoutMixin):
202
-
203
-    def test_user_must_have_a_nonempty_basket(self):
204
-        response = self.client.get(reverse('checkout:payment-details'))
205
-        self.assertRedirectUrlName(response, 'basket:summary')
206
-
207
-    def test_view_redirects_if_no_shipping_address(self):
208
-        self.add_product_to_basket()
209
-        response = self.client.post(reverse('checkout:payment-details'))
210
-        self.assertIsRedirect(response)
211
-        self.assertRedirectUrlName(response, 'checkout:shipping-address')
212
-
213
-    def test_view_redirects_if_no_shipping_method(self):
214
-        self.add_product_to_basket()
215
-        self.complete_shipping_address()
216
-        response = self.client.post(reverse('checkout:payment-details'))
217
-        self.assertIsRedirect(response)
218
-        self.assertRedirectUrlName(response, 'checkout:shipping-method')
219
-
220
-    def test_placing_order_with_empty_basket_redirects(self):
221
-        response = self.client.post(reverse('checkout:preview'), {'action': 'place_order'})
222
-        self.assertIsRedirect(response)
223
-        self.assertRedirectUrlName(response, 'basket:summary')
224
-
225
-
226
-class TestOrderPlacement(WebTestCase, CheckoutMixin):
227
-
228
-    def setUp(self):
229
-        super(TestOrderPlacement, self).setUp()
230
-        self.basket = Basket.objects.create(owner=self.user)
231
-        add_product(self.basket, D('12.00'))
232
-
233
-        self.complete_shipping_address()
234
-        self.complete_shipping_method()
235
-        self.response = self.client.post(reverse('checkout:preview'), {'action': 'place_order'})
236
-
237
-    def test_placing_order_with_nonempty_basket_redirects(self):
238
-        self.assertIsRedirect(self.response)
239
-        self.assertRedirectUrlName(self.response, 'checkout:thank-you')
240
-
241
-    def test_order_is_created(self):
242
-        self.assertIsRedirect(self.response)
243
-        orders = Order.objects.all()
244
-        self.assertEqual(1, len(orders))
245
-
246
-
247
-class TestPlacingOrderUsingAVoucher(WebTestCase, CheckoutMixin):
248
-
249
-    def setUp(self):
250
-        super(TestPlacingOrderUsingAVoucher, self).setUp()
251
-        self.add_product_to_basket()
252
-        voucher = create_voucher()
253
-        self.add_voucher_to_basket(voucher)
254
-        self.complete_shipping_address()
255
-        self.complete_shipping_method()
256
-        self.response = self.submit()
257
-
258
-        # Reload voucher
259
-        self.voucher = Voucher.objects.get(id=voucher.id)
260
-
261
-    def test_is_successful(self):
262
-        self.assertRedirectUrlName(self.response, 'checkout:thank-you')
263
-
264
-    def test_records_use(self):
265
-        self.assertEqual(1, self.voucher.num_orders)
266
-
267
-    def test_records_discount(self):
268
-        self.assertEqual(1, self.voucher.num_orders)
269
-
270
-
271
-class TestPlacingOrderUsingAnOffer(WebTestCase, CheckoutMixin):
272
-
273
-    def setUp(self):
274
-        super(TestPlacingOrderUsingAnOffer, self).setUp()
275
-        offer = create_offer()
276
-        self.add_product_to_basket()
277
-        self.complete_shipping_address()
278
-        self.complete_shipping_method()
279
-        self.response = self.submit()
280
-
281
-        # Reload offer
282
-        self.offer = ConditionalOffer.objects.get(id=offer.id)
283
-
284
-    def test_is_successful(self):
285
-        self.assertRedirectUrlName(self.response, 'checkout:thank-you')
286
-
287
-    def test_records_use(self):
288
-        self.assertEqual(1, self.offer.num_orders)
289
-        self.assertEqual(1, self.offer.num_applications)

+ 112
- 0
tests/functional/checkout/customer_checkout_tests.py View File

@@ -0,0 +1,112 @@
1
+from django.core.urlresolvers import reverse
2
+
3
+from oscar.test.testcases import WebTestCase
4
+from oscar.test import factories
5
+from oscar.apps.order.models import Order
6
+from oscar.apps.offer.models import ConditionalOffer
7
+from . import CheckoutMixin
8
+
9
+
10
+class TestIndexView(CheckoutMixin, WebTestCase):
11
+
12
+    def test_requires_login(self):
13
+        response = self.get(reverse('checkout:index'), user=None)
14
+        self.assertIsRedirect(response)
15
+
16
+    def test_redirects_customers_with_empty_basket(self):
17
+        response = self.get(reverse('checkout:index'))
18
+        self.assertRedirectUrlName(response, 'basket:summary')
19
+
20
+    def test_redirects_customers_to_shipping_address_view(self):
21
+        self.add_product_to_basket()
22
+        response = self.get(reverse('checkout:index'))
23
+        self.assertRedirectUrlName(response, 'checkout:shipping-address')
24
+
25
+
26
+class TestShippingAddressView(CheckoutMixin, WebTestCase):
27
+
28
+    def setUp(self):
29
+        self.create_shipping_country()
30
+        super(TestShippingAddressView, self).setUp()
31
+
32
+    def test_requires_login(self):
33
+        response = self.get(reverse('checkout:shipping-address'), user=None)
34
+        self.assertIsRedirect(response)
35
+
36
+    def test_submitting_valid_form_adds_data_to_session(self):
37
+        self.add_product_to_basket()
38
+        page = self.get(reverse('checkout:shipping-address'))
39
+        form = page.forms['new_shipping_address']
40
+        form['first_name'] = 'Barry'
41
+        form['last_name'] = 'Chuckle'
42
+        form['line1'] = '1 King Street'
43
+        form['line4'] = 'Gotham City'
44
+        form['postcode'] = 'N1 7RR'
45
+        response = form.submit()
46
+        self.assertRedirectUrlName(response, 'checkout:shipping-method')
47
+
48
+        session_data = self.app.session['checkout_data']
49
+        session_fields = session_data['shipping']['new_address_fields']
50
+        self.assertEqual(u'Barry', session_fields['first_name'])
51
+        self.assertEqual(u'Chuckle', session_fields['last_name'])
52
+        self.assertEqual(u'1 King Street', session_fields['line1'])
53
+        self.assertEqual(u'Gotham City', session_fields['line4'])
54
+        self.assertEqual(u'N1 7RR', session_fields['postcode'])
55
+
56
+
57
+class TestShippingMethodView(CheckoutMixin, WebTestCase):
58
+
59
+    def test_requires_login(self):
60
+        response = self.get(reverse('checkout:shipping-method'), user=None)
61
+        self.assertIsRedirect(response)
62
+
63
+    def test_redirects_when_only_one_shipping_method(self):
64
+        self.add_product_to_basket()
65
+        self.enter_shipping_address()
66
+        response = self.get(reverse('checkout:shipping-method'))
67
+        self.assertRedirectUrlName(response, 'checkout:payment-method')
68
+
69
+
70
+class TestPreviewView(CheckoutMixin, WebTestCase):
71
+
72
+    def test_allows_order_to_be_placed(self):
73
+        self.add_product_to_basket()
74
+        self.enter_shipping_address()
75
+
76
+        payment_details = self.get(
77
+            reverse('checkout:shipping-method')).follow().follow()
78
+        preview = payment_details.click(linkid="view_preview")
79
+        preview.forms['place-order-form'].submit().follow()
80
+
81
+        self.assertEqual(1, Order.objects.all().count())
82
+
83
+
84
+class TestPlacingAnOrderUsingAVoucher(CheckoutMixin, WebTestCase):
85
+
86
+    def test_records_use(self):
87
+        self.add_product_to_basket()
88
+        self.add_voucher_to_basket()
89
+        self.enter_shipping_address()
90
+        thankyou = self.place_order()
91
+
92
+        order = thankyou.context['order']
93
+        self.assertEqual(1, order.discounts.all().count())
94
+
95
+        discount = order.discounts.all()[0]
96
+        voucher = discount.voucher
97
+        self.assertEqual(1, voucher.num_orders)
98
+
99
+
100
+class TestPlacingAnOrderUsingAnOffer(CheckoutMixin, WebTestCase):
101
+
102
+    def test_records_use(self):
103
+        offer = factories.create_offer()
104
+        self.add_product_to_basket()
105
+        self.enter_shipping_address()
106
+        self.place_order()
107
+
108
+        # Reload offer
109
+        offer = ConditionalOffer.objects.get(id=offer.id)
110
+
111
+        self.assertEqual(1, offer.num_orders)
112
+        self.assertEqual(1, offer.num_applications)

+ 1
- 39
tests/functional/checkout/guest_checkout_tests.py View File

@@ -1,4 +1,3 @@
1
-from decimal import Decimal as D
2 1
 import sys
3 2
 
4 3
 from django.test.utils import override_settings
@@ -7,9 +6,9 @@ from django.conf import settings
7 6
 from django.utils.importlib import import_module
8 7
 import mock
9 8
 
10
-from oscar.apps.address.models import Country
11 9
 from oscar.test.testcases import WebTestCase
12 10
 from oscar.test import factories
11
+from . import CheckoutMixin
13 12
 
14 13
 # Python 3 compat
15 14
 try:
@@ -25,43 +24,6 @@ def reload_url_conf():
25 24
     import_module(settings.ROOT_URLCONF)
26 25
 
27 26
 
28
-class CheckoutMixin(object):
29
-
30
-    def create_digital_product(self):
31
-        product = factories.create_product(price=D('12.00'), num_in_stock=None)
32
-        product.product_class.requires_shipping = False
33
-        product.product_class.track_stock = False
34
-        product.product_class.save()
35
-        return product
36
-
37
-    def add_product_to_basket(self, product=None):
38
-        if product is None:
39
-            product = factories.create_product(price=D('12.00'),
40
-                                               num_in_stock=10)
41
-        detail_page = self.get(product.get_absolute_url())
42
-        form = detail_page.forms['add_to_basket_form']
43
-        form.submit()
44
-
45
-    def enter_guest_details(self, email='guest@example.com'):
46
-        index_page = self.get(reverse('checkout:index'))
47
-        index_page.form['username'] = email
48
-        index_page.form.submit()
49
-
50
-    def enter_shipping_address(self):
51
-        Country.objects.get_or_create(
52
-            iso_3166_1_a2='GB', is_shipping_country=True)
53
-        address_page = self.get(reverse('checkout:shipping-address'))
54
-        form = address_page.forms['new_shipping_address']
55
-        form['first_name'] = 'John'
56
-        form['last_name'] = 'Doe'
57
-        form['line1'] = '1 Egg Road'
58
-        form['line4'] = 'Shell City'
59
-        form['postcode'] = 'N12 9RT'
60
-        form.submit()
61
-
62
-    def enter_shipping_method(self):
63
-        self.get(reverse('checkout:shipping-method'))
64
-
65 27
 @override_settings(OSCAR_ALLOW_ANON_CHECKOUT=True)
66 28
 class TestIndexView(CheckoutMixin, WebTestCase):
67 29
     is_anonymous = True

Loading…
Cancel
Save