Преглед изворни кода

Rework customer functional tests

* Tests now split into more coherent modules
* Added IDs to forms to help WebTest
* Some refactoring along the way
master
David Winterbottom пре 13 година
родитељ
комит
f0457323f7

+ 30
- 16
oscar/apps/customer/app.py Прегледај датотеку

@@ -1,11 +1,11 @@
1 1
 from django.conf.urls.defaults import patterns, url
2 2
 from django.contrib.auth.decorators import login_required
3 3
 
4
-from oscar.apps.customer.views import AccountSummaryView, OrderHistoryView, \
5
-    OrderDetailView, OrderLineView, AddressListView, AddressCreateView, \
6
-    AddressUpdateView, AddressDeleteView, EmailHistoryView, EmailDetailView, \
7
-    AccountAuthView, AnonymousOrderDetailView, ChangePasswordView, ProfileUpdateView, \
8
-    AccountRegistrationView, LogoutView
4
+from oscar.apps.customer.views import (AccountSummaryView, OrderHistoryView,
5
+    OrderDetailView, OrderLineView, AddressListView, AddressCreateView,
6
+    AddressUpdateView, AddressDeleteView, EmailHistoryView, EmailDetailView,
7
+    AccountAuthView, AnonymousOrderDetailView, ChangePasswordView,
8
+    ProfileUpdateView, AccountRegistrationView, LogoutView)
9 9
 from oscar.core.application import Application
10 10
 
11 11
 
@@ -30,7 +30,8 @@ class CustomerApplication(Application):
30 30
 
31 31
     def get_urls(self):
32 32
         urlpatterns = patterns('',
33
-            url(r'^$', login_required(self.summary_view.as_view()), name='summary'),
33
+            url(r'^$', login_required(self.summary_view.as_view()),
34
+                name='summary'),
34 35
             url(r'^login/$', self.login_view.as_view(), name='login'),
35 36
             url(r'^logout/$', self.logout_view.as_view(), name='logout'),
36 37
             url(r'^register/$', self.register_view.as_view(), name='register'),
@@ -38,24 +39,37 @@ class CustomerApplication(Application):
38 39
                 name='change-password'),
39 40
 
40 41
             # Profile
41
-            url(r'^profile/$', login_required(self.profile_update_view.as_view()), name='profile-update'),
42
-            url(r'^orders/$', login_required(self.order_history_view.as_view()), name='order-list'),
42
+            url(r'^profile/$',
43
+                login_required(self.profile_update_view.as_view()),
44
+                name='profile-update'),
45
+            url(r'^orders/$',
46
+                login_required(self.order_history_view.as_view()),
47
+                name='order-list'),
43 48
             url(r'^order-status/(?P<order_number>[\w-]*)/(?P<hash>\w+)/$',
44 49
                 self.anon_order_detail_view.as_view(), name='anon-order'),
45
-            url(r'^orders/(?P<order_number>[\w-]*)/$', login_required(self.order_detail_view.as_view()),
50
+            url(r'^orders/(?P<order_number>[\w-]*)/$',
51
+                login_required(self.order_detail_view.as_view()),
46 52
                 name='order'),
47 53
             url(r'^orders/(?P<order_number>[\w-]*)/(?P<line_id>\d+)$',
48
-                login_required(self.order_line_view.as_view()), name='order-line'),
49
-            url(r'^addresses/$', login_required(self.address_list_view.as_view()),
54
+                login_required(self.order_line_view.as_view()),
55
+                name='order-line'),
56
+            url(r'^addresses/$',
57
+                login_required(self.address_list_view.as_view()),
50 58
                 name='address-list'),
51
-            url(r'^addresses/add/$', login_required(self.address_create_view.as_view()),
59
+            url(r'^addresses/add/$',
60
+                login_required(self.address_create_view.as_view()),
52 61
                 name='address-create'),
53
-            url(r'^addresses/(?P<pk>\d+)/$', login_required(self.address_update_view.as_view()),
62
+            url(r'^addresses/(?P<pk>\d+)/$',
63
+                login_required(self.address_update_view.as_view()),
54 64
                 name='address-detail'),
55
-            url(r'^addresses/(?P<pk>\d+)/delete/$', login_required(self.address_delete_view.as_view()),
65
+            url(r'^addresses/(?P<pk>\d+)/delete/$',
66
+                login_required(self.address_delete_view.as_view()),
56 67
                 name='address-delete'),
57
-            url(r'^emails/$', login_required(self.email_list_view.as_view()), name='email-list'),
58
-            url(r'^emails/(?P<email_id>\d+)/$', login_required(self.email_detail_view.as_view()),
68
+            url(r'^emails/$',
69
+                login_required(self.email_list_view.as_view()),
70
+                name='email-list'),
71
+            url(r'^emails/(?P<email_id>\d+)/$',
72
+                login_required(self.email_detail_view.as_view()),
59 73
                 name='email-detail'),
60 74
             )
61 75
         return self.post_process_urls(urlpatterns)

+ 5
- 5
oscar/apps/customer/history_helpers.py Прегледај датотеку

@@ -12,9 +12,9 @@ MAX_PRODUCTS = settings.OSCAR_RECENTLY_VIEWED_PRODUCTS
12 12
 # Helpers
13 13
 
14 14
 def get_recently_viewed_product_ids(request):
15
-    u"""
16
-    Returns the list of ids of the last products browsed by the user
17
-    
15
+    """
16
+    Returns IDs of the last products browsed by the user
17
+
18 18
     Limited to the max number defined in settings.py
19 19
     under OSCAR_RECENTLY_VIEWED_PRODUCTS.
20 20
     """
@@ -38,7 +38,7 @@ def _update_recently_viewed_products(product, request, response):
38 38
     product_ids.append(product.id)
39 39
     if (len(product_ids) > MAX_PRODUCTS):
40 40
         product_ids = product_ids[len(product_ids)-MAX_PRODUCTS:]
41
-    response.set_cookie('oscar_recently_viewed_products', 
41
+    response.set_cookie('oscar_recently_viewed_products',
42 42
                         _get_json_string_from_list(product_ids),
43 43
                         httponly=True)
44 44
 
@@ -57,7 +57,7 @@ def _get_json_string_from_list(list):
57 57
 def receive_product_view(sender, product, user, request, response, **kwargs):
58 58
     """
59 59
     Receiver to handle viewing single product pages
60
-    
60
+
61 61
     Requires the request and response objects due to dependence on cookies
62 62
     """
63 63
     return _update_recently_viewed_products(product, request, response)

+ 4
- 1
oscar/apps/customer/models.py Прегледај датотеку

@@ -6,4 +6,7 @@ class Email(AbstractEmail):
6 6
 
7 7
 
8 8
 class CommunicationEventType(AbstractCommunicationEventType):
9
-    pass
9
+    pass
10
+
11
+
12
+from oscar.apps.customer.history_helpers import *

+ 3
- 4
oscar/templates/oscar/customer/change-password.html Прегледај датотеку

@@ -17,25 +17,24 @@
17 17
 </ul>
18 18
 {% endblock %}
19 19
 
20
-
21 20
 {% block title %}
22 21
 {% trans 'Change password' %} | {{ block.super }}
23 22
 {% endblock %}
24 23
 
25 24
 {% block header %}
26 25
 <div class="page-header">
27
-    <h2>{% trans 'Change password' %}</h2>
26
+    <h1>{% trans 'Change password' %}</h1>
28 27
 </div>
29 28
 {% endblock header %}
30 29
 
31 30
 
32 31
 {% block content %}
33 32
 
34
-<form action="." method="post">
33
+<form id="change_password_form" action="." method="post">
35 34
     {% csrf_token %}
36 35
     {% include 'partials/form_fields.html' with form=form %}
37 36
     <div class="form-actions">
38
-        <button type="submit" class="btn btn-primary">{% trans 'Update password' %}</button>
37
+        <button type="submit" class="btn btn-large btn-primary">{% trans 'Update password' %}</button>
39 38
         {% trans 'or' %} <a href="{% url customer:summary %}">{% trans 'cancel' %}</a>.
40 39
     </div>
41 40
 </form>

+ 1
- 1
oscar/templates/oscar/customer/order-history.html Прегледај датотеку

@@ -51,7 +51,7 @@
51 51
         <td>{{ order.date_placed }}</td>
52 52
         <td>
53 53
             <a class="btn btn-info" href="{% url customer:order order.number %}">{% trans 'View' %}</a>
54
-            <form action="{% url customer:order order.number %}" method="post">
54
+			<form id="order_form_{{ order.id }}" action="{% url customer:order order.number %}" method="post">
55 55
                 {% csrf_token %}
56 56
                 <input type="hidden" name="order_id" value="{{ order.id }}" />
57 57
                 <input type="hidden" name="action" value="reorder" />

+ 1
- 2
oscar/templates/oscar/customer/order.html Прегледај датотеку

@@ -30,7 +30,6 @@
30 30
 </div>
31 31
 {% endblock header %}
32 32
 
33
-
34 33
 {% block content %}
35 34
 
36 35
 <div class="tabbable dashboard">
@@ -100,7 +99,7 @@
100 99
                     <td>{{ line.line_price_before_discounts_excl_tax|currency }}</td>
101 100
                     <td>{{ line.line_price_before_discounts_incl_tax|currency }}</td>
102 101
                     <td>
103
-                        <form action="{% url customer:order-line order.number line.id %}" method="POST">
102
+						<form id="line_form_{{ line.id }}" action="{% url customer:order-line order.number line.id %}" method="POST">
104 103
                             {% csrf_token %}
105 104
                             <input type="hidden" name="action" value="reorder" />
106 105
                             <button class="btn btn-success" type="submit">{% trans 'Re-order' %}</button>

+ 7
- 11
oscar/templates/oscar/customer/profile-form.html Прегледај датотеку

@@ -15,7 +15,6 @@
15 15
 </ul>
16 16
 {% endblock %}
17 17
 
18
-
19 18
 {% block title %}
20 19
 {% trans 'Edit profile' %} | {{ block.super }}
21 20
 {% endblock %}
@@ -26,16 +25,13 @@
26 25
 </div>
27 26
 {% endblock header %}
28 27
 
29
-
30 28
 {% block content %}
31
-
32
-<form action="." method="post">
33
-    {% csrf_token %}
34
-    {% include 'partials/form_fields.html' with form=form %}
35
-    <div class="form-actions">
36
-        <button type="submit" class="btn btn-primary">{% trans 'Save' %}</button>
37
-        {% trans 'or' %} <a href="{% url customer:summary %}">{% trans 'cancel' %}</a>.
38
-    </div>
29
+<form id="profile_form" action="." method="post">
30
+	{% csrf_token %}
31
+	{% include 'partials/form_fields.html' with form=form %}
32
+	<div class="form-actions">
33
+		<button type="submit" class="btn btn-primary btn-large">{% trans 'Save' %}</button>
34
+		{% trans 'or' %} <a href="{% url customer:summary %}">{% trans 'cancel' %}</a>.
35
+	</div>
39 36
 </form>
40
-
41 37
 {% endblock content %}

+ 2
- 2
oscar/test/helpers.py Прегледај датотеку

@@ -78,8 +78,8 @@ def create_order(number=None, basket=None, user=None, shipping_address=None, shi
78 78
             billing_address=billing_address,
79 79
             total_incl_tax=total_incl_tax,
80 80
             total_excl_tax=total_excl_tax,
81
-            **kwargs
82
-            )
81
+            **kwargs)
82
+    basket.set_as_submitted()
83 83
     return order
84 84
 
85 85
 

+ 28
- 4
tests/functional/customer/auth_tests.py Прегледај датотеку

@@ -1,19 +1,20 @@
1 1
 import re
2 2
 
3 3
 from django.contrib.auth import models
4
-from django.core.urlresolvers import reverse
4
+from django.contrib.auth.models import User
5 5
 from django.core import mail
6
-
6
+from django.core.urlresolvers import reverse
7 7
 from django_webtest import WebTest
8 8
 
9
+from oscar.test import WebTestCase
10
+
9 11
 
10 12
 class TestAUserWhoseForgottenHerPassword(WebTest):
11 13
 
12 14
     def test_can_reset_her_password(self):
13 15
         username, email, password = 'lucy', 'lucy@example.com', 'password'
14 16
         models.User.objects.create_user(
15
-            username, email, password
16
-        )
17
+            username, email, password)
17 18
 
18 19
         # Fill in password reset form
19 20
         page = self.app.get(reverse('password-reset'))
@@ -47,3 +48,26 @@ class TestAUserWhoseForgottenHerPassword(WebTest):
47 48
         form['login-password'] = 'monkey'
48 49
         response = form.submit('login_submit')
49 50
         self.assertEqual(302, response.status_code)
51
+
52
+
53
+class TestAnAnonymousUser(WebTestCase):
54
+
55
+    def test_can_login(self):
56
+        email, password = 'd@d.com', 'mypassword'
57
+        User.objects.create_user('_', email, password)
58
+
59
+        url = reverse('customer:login')
60
+        form = self.app.get(url).forms['login_form']
61
+        form['login-username'] = email
62
+        form['login-password'] = password
63
+        response = form.submit('login_submit')
64
+        self.assertRedirectsTo(response, 'customer:summary')
65
+
66
+    def test_can_register(self):
67
+        url = reverse('customer:register')
68
+        form = self.app.get(url).forms['register_form']
69
+        form['registration-email'] = 'terry@boom.com'
70
+        form['registration-password1'] = 'hedgehog'
71
+        form['registration-password2'] = 'hedgehog'
72
+        response = form.submit()
73
+        self.assertRedirectsTo(response, 'customer:summary')

+ 53
- 0
tests/functional/customer/history_tests.py Прегледај датотеку

@@ -0,0 +1,53 @@
1
+import re
2
+
3
+from django.contrib.auth import models
4
+from django.test.client import Client
5
+from django.contrib.auth.models import User
6
+from django.core import mail
7
+from django.core.urlresolvers import reverse
8
+from django.test import TestCase
9
+from django_webtest import WebTest
10
+
11
+from oscar.test.helpers import create_product
12
+from oscar.test import WebTestCase
13
+from oscar.apps.customer.history_helpers import get_recently_viewed_product_ids
14
+from django.http import HttpRequest
15
+
16
+
17
+class HistoryHelpersTest(TestCase):
18
+
19
+    def setUp(self):
20
+        self.client = Client()
21
+        self.product = create_product()
22
+
23
+    def test_viewing_product_creates_cookie(self):
24
+        response = self.client.get(self.product.get_absolute_url())
25
+        self.assertTrue('oscar_recently_viewed_products' in response.cookies)
26
+
27
+    def test_id_gets_added_to_cookie(self):
28
+        response = self.client.get(self.product.get_absolute_url())
29
+        request = HttpRequest()
30
+        request.COOKIES['oscar_recently_viewed_products'] = response.cookies['oscar_recently_viewed_products'].value
31
+        self.assertTrue(self.product.id in get_recently_viewed_product_ids(request))
32
+
33
+
34
+class TestAUserWhoLogsOut(TestCase):
35
+    username = 'customer'
36
+    password = 'cheeseshop'
37
+    email = 'customer@example.com'
38
+
39
+    def setUp(self):
40
+        self.client = Client()
41
+        self.product = create_product()
42
+        User.objects.create_user(username=self.username,
43
+                                 email=self.email, password=self.password)
44
+        self.client.login(username=self.username, password=self.password)
45
+
46
+    def test_has_their_cookies_deleted_on_logout(self):
47
+        response = self.client.get(self.product.get_absolute_url())
48
+        self.assertTrue('oscar_recently_viewed_products' in response.cookies)
49
+
50
+        response = self.client.get(reverse('customer:logout'))
51
+        self.assertTrue(('oscar_recently_viewed_products' not in response.cookies)
52
+                        or not
53
+                        self.client.cookies['oscar_recently_viewed_products'].coded_value)

+ 31
- 0
tests/functional/customer/order_status_tests.py Прегледај датотеку

@@ -0,0 +1,31 @@
1
+import httplib
2
+
3
+from django.core.urlresolvers import reverse
4
+
5
+from oscar.test.helpers import create_order
6
+from oscar.test import WebTestCase
7
+
8
+
9
+class TestAnAnonymousUser(WebTestCase):
10
+
11
+    def test_gets_a_404_when_requesting_an_unknown_order(self):
12
+        path = reverse('customer:anon-order', kwargs={'order_number': 1000,
13
+                                                      'hash': '1231231232'})
14
+        response = self.app.get(path, status="*")
15
+        self.assertEqual(httplib.NOT_FOUND, response.status_code)
16
+
17
+    def test_can_see_order_status(self):
18
+        order = create_order()
19
+        path = reverse('customer:anon-order',
20
+                       kwargs={'order_number': order.number,
21
+                               'hash': order.verification_hash()})
22
+        response = self.app.get(path)
23
+        self.assertEqual(httplib.OK, response.status_code)
24
+
25
+    def test_gets_404_when_using_incorrect_hash(self):
26
+        order = create_order()
27
+        path = reverse('customer:anon-order',
28
+                       kwargs={'order_number': order.number,
29
+                               'hash': 'bad'})
30
+        response = self.app.get(path, status="*")
31
+        self.assertEqual(httplib.NOT_FOUND, response.status_code)

+ 142
- 0
tests/functional/customer/profile_tests.py Прегледај датотеку

@@ -0,0 +1,142 @@
1
+import httplib
2
+from mock import patch
3
+from decimal import Decimal as D
4
+
5
+from django.contrib.auth.models import User
6
+from django.core.urlresolvers import reverse
7
+from django.test import TestCase
8
+from django.test.client import Client
9
+
10
+from oscar.test.helpers import create_product, create_order
11
+from oscar.test import ClientTestCase, WebTestCase
12
+from oscar.apps.basket.models import Basket
13
+
14
+
15
+class TestASignedInUser(WebTestCase):
16
+    email = 'customer@example.com'
17
+    password = 'cheeseshop'
18
+
19
+    def setUp(self):
20
+        self.user = User.objects.create_user('_', self.email, self.password)
21
+        self.order = create_order(user=self.user)
22
+
23
+    def tearDown(self):
24
+        Basket.objects.all().delete()
25
+
26
+    def test_can_view_their_profile(self):
27
+        response = self.app.get(reverse('customer:summary'),
28
+                                user=self.user)
29
+        self.assertEqual(200, response.status_code)
30
+        self.assertTrue(self.email in response.content)
31
+
32
+    def test_can_update_their_email_address_and_name(self):
33
+        profile_form_page = self.app.get(reverse('customer:profile-update'),
34
+                                user=self.user)
35
+        self.assertEqual(200, profile_form_page.status_code)
36
+        form = profile_form_page.forms['profile_form']
37
+        form['email'] = 'new@example.com'
38
+        form['first_name'] = 'Barry'
39
+        form['last_name'] = 'Chuckle'
40
+        response = form.submit()
41
+        self.assertRedirects(response, reverse('customer:summary'))
42
+
43
+        user = User.objects.get(id=self.user.id)
44
+        self.assertEqual('new@example.com', user.email)
45
+        self.assertEqual('Barry', user.first_name)
46
+        self.assertEqual('Chuckle', user.last_name)
47
+
48
+    def test_can_change_their_password(self):
49
+        password_form_page = self.app.get(reverse('customer:change-password'),
50
+                                          user=self.user)
51
+        self.assertEqual(200, password_form_page.status_code)
52
+        form = password_form_page.forms['change_password_form']
53
+        form['old_password'] = self.password
54
+        form['new_password1'] = 'bubblesgopop'
55
+        form['new_password2'] = 'bubblesgopop'
56
+        response = form.submit()
57
+        self.assertRedirects(response, reverse('customer:summary'))
58
+
59
+    def test_can_reorder_a_previous_order(self):
60
+        order_history_page = self.app.get(reverse('customer:order-list'),
61
+                                          user=self.user)
62
+        form = order_history_page.forms['order_form_%d' % self.order.id]
63
+        form.submit()
64
+
65
+        basket = Basket.open.get(owner=self.user)
66
+        self.assertEqual(1, basket.all_lines().count())
67
+
68
+    def test_can_reorder_a_previous_order_line(self):
69
+        order_history_page = self.app.get(
70
+            reverse('customer:order',
71
+                    kwargs={'order_number': self.order.number}),
72
+            user=self.user)
73
+        line = self.order.lines.all()[0]
74
+        form = order_history_page.forms['line_form_%d' % line.id]
75
+        form.submit()
76
+
77
+        basket = Basket.open.get(owner=self.user)
78
+        self.assertEqual(1, basket.all_lines().count())
79
+
80
+    def test_cannot_reorder_an_out_of_stock_product(self):
81
+        product = self.order.lines.all()[0].product
82
+        product.stockrecord.num_in_stock = 0
83
+        product.stockrecord.save()
84
+
85
+        order_history_page = self.app.get(reverse('customer:order-list'),
86
+                                          user=self.user)
87
+        form = order_history_page.forms['order_form_%d' % self.order.id]
88
+        form.submit()
89
+
90
+        basket = Basket.open.get(owner=self.user)
91
+        self.assertEqual(0, basket.all_lines().count())
92
+
93
+
94
+class TestReorderingOrderLines(ClientTestCase):
95
+    # TODO - rework this as a webtest
96
+
97
+    @patch('django.conf.settings.OSCAR_MAX_BASKET_QUANTITY_THRESHOLD', 1)
98
+    def test_cannot_reorder_when_basket_maximum_exceeded(self):
99
+        order = create_order(user=self.user)
100
+        line = order.lines.all()[0]
101
+
102
+        Basket.objects.all().delete()
103
+        #add a product
104
+        product = create_product(price=D('12.00'))
105
+        self.client.post(reverse('basket:add'), {'product_id': product.id,
106
+                                                 'quantity': 1})
107
+
108
+
109
+        basket = Basket.objects.all()[0]
110
+        self.assertEquals(len(basket.all_lines()), 1)
111
+
112
+        #try to reorder a product
113
+        self.client.post(reverse('customer:order',
114
+                                            args=(order.number,)),
115
+                                    {'order_id': order.pk,
116
+                                     'action': 'reorder'})
117
+
118
+        self.assertEqual(len(basket.all_lines()), 1)
119
+        self.assertNotEqual(line.product.pk, product.pk)
120
+
121
+    @patch('django.conf.settings.OSCAR_MAX_BASKET_QUANTITY_THRESHOLD', 1)
122
+    def test_cannot_reorder_line_when_basket_maximum_exceeded(self):
123
+        order = create_order(user=self.user)
124
+        line = order.lines.all()[0]
125
+
126
+        Basket.objects.all().delete()
127
+        #add a product
128
+        product = create_product(price=D('12.00'))
129
+        self.client.post(reverse('basket:add'), {'product_id': product.id,
130
+                                                 'quantity': 1})
131
+
132
+        basket = Basket.objects.all()[0]
133
+        self.assertEquals(len(basket.all_lines()), 1)
134
+
135
+        self.client.post(reverse('customer:order-line',
136
+                                            args=(order.number, line.pk)),
137
+                                    {'action': 'reorder'})
138
+
139
+        self.assertEquals(len(basket.all_lines()), 1)
140
+        self.assertNotEqual(line.product.pk, product.pk)
141
+
142
+

+ 0
- 260
tests/functional/customer_tests.py Прегледај датотеку

@@ -1,260 +0,0 @@
1
-import httplib
2
-from mock import patch
3
-from decimal import Decimal as D
4
-
5
-from django.contrib.auth.models import User
6
-from django.core.urlresolvers import reverse
7
-from django.http import HttpRequest
8
-from django.test import TestCase
9
-from django.test.client import Client
10
-
11
-from oscar.apps.customer.history_helpers import get_recently_viewed_product_ids
12
-from oscar.test.helpers import create_product, create_order
13
-from oscar.test import ClientTestCase, WebTestCase
14
-from oscar.apps.basket.models import Basket
15
-
16
-
17
-class HistoryHelpersTest(TestCase):
18
-
19
-    def setUp(self):
20
-        self.client = Client()
21
-        self.product = create_product()
22
-
23
-    def test_viewing_product_creates_cookie(self):
24
-        response = self.client.get(self.product.get_absolute_url())
25
-        self.assertTrue('oscar_recently_viewed_products' in response.cookies)
26
-
27
-    def test_id_gets_added_to_cookie(self):
28
-        response = self.client.get(self.product.get_absolute_url())
29
-        request = HttpRequest()
30
-        request.COOKIES['oscar_recently_viewed_products'] = response.cookies['oscar_recently_viewed_products'].value
31
-        self.assertTrue(self.product.id in get_recently_viewed_product_ids(request))
32
-
33
-
34
-class AnonOrderDetail(TestCase):
35
-
36
-    def setUp(self):
37
-        self.client = Client()
38
-
39
-    def test_404_received_for_unknown_order(self):
40
-        response = self.client.get(reverse('customer:anon-order', kwargs={'order_number': 1000,
41
-            'hash': '1231231232'}))
42
-        self.assertEqual(httplib.NOT_FOUND, response.status_code)
43
-
44
-    def test_200_received_for_order_with_correct_hash(self):
45
-        order = create_order()
46
-        response = self.client.get(reverse('customer:anon-order', kwargs={'order_number': order.number,
47
-            'hash': order.verification_hash()}))
48
-        self.assertEqual(httplib.OK, response.status_code)
49
-
50
-    def test_404_received_for_order_with_incorrect_hash(self):
51
-        order = create_order()
52
-        response = self.client.get(reverse('customer:anon-order', kwargs={'order_number': order.number,
53
-            'hash': 'bad'}))
54
-        self.assertEqual(httplib.NOT_FOUND, response.status_code)
55
-
56
-
57
-class EditProfileTests(TestCase):
58
-    username = 'customer'
59
-    password = 'cheeseshop'
60
-    email = 'customer@example.com'
61
-
62
-    def setUp(self):
63
-        User.objects.create_user(username=self.username,
64
-                                 email=self.email, password=self.password)
65
-        is_successful = self.client.login(username=self.username,
66
-                                          password=self.password)
67
-        if not is_successful:
68
-            self.fail("Unable to login as %s" % self.username)
69
-
70
-    def tearDown(self):
71
-        User.objects.all().delete()
72
-
73
-    def test_update_profile_page_for_smoke(self):
74
-        url = reverse('customer:profile-update')
75
-        response = self.client.get(url)
76
-        self.assertEqual(200, response.status_code)
77
-        self.assertTrue('form' in response.context)
78
-
79
-
80
-class AuthTestCase(TestCase):
81
-    username = 'customer'
82
-    password = 'cheeseshop'
83
-    email = 'customer@example.com'
84
-
85
-    def setUp(self):
86
-        self.client = Client()
87
-        self.product = create_product()
88
-        User.objects.create_user(username=self.username,
89
-                                 email=self.email, password=self.password)
90
-        self.client.login(username=self.username, password=self.password)
91
-
92
-    def test_cookies_deleted_on_logout(self):
93
-        response = self.client.get(self.product.get_absolute_url())
94
-        self.assertTrue('oscar_recently_viewed_products' in response.cookies)
95
-
96
-        response = self.client.get(reverse('customer:logout'))
97
-        self.assertTrue(('oscar_recently_viewed_products' not in response.cookies)
98
-                        or not
99
-                        self.client.cookies['oscar_recently_viewed_products'].coded_value)
100
-
101
-
102
-class AuthStaffRedirectTests(TestCase):
103
-    username = 'staff'
104
-    password = 'cheeseshop'
105
-    email = 'staff@example.com'
106
-
107
-    def test_staff_member_login_for_dashboard(self):
108
-        """
109
-        Test if a staff member that is not yet logged in and trying to access the
110
-        dashboard is redirected to the Oscar login page (instead of the ``admin``
111
-        login page). Also test that the redirect after successful login will
112
-        be the originally requested page.
113
-        """
114
-        self.client = Client()
115
-        user = User.objects.create_user(username=self.username,
116
-                                    email=self.email, password=self.password)
117
-        user.is_staff = True
118
-        user.save()
119
-
120
-        response = self.client.get(reverse('dashboard:index'), follow=True)
121
-        self.assertContains(response, "login-username", status_code=200)
122
-        self.assertEquals(response.context['next'], reverse('dashboard:index'))
123
-
124
-
125
-class ReorderTests(ClientTestCase):
126
-
127
-    def test_can_reorder(self):
128
-        order = create_order(user=self.user)
129
-        Basket.objects.all().delete()
130
-
131
-        self.client.post(reverse('customer:order',
132
-                                            args=(order.number,)),
133
-                                    {'order_id': order.pk,
134
-                                     'action': 'reorder'})
135
-
136
-        basket = Basket.objects.all()[0]
137
-        self.assertEquals(len(basket.all_lines()), 1)
138
-
139
-    def test_can_reorder_line(self):
140
-        order = create_order(user=self.user)
141
-        line = order.lines.all()[0]
142
-        Basket.objects.all().delete()
143
-
144
-        self.client.post(reverse('customer:order-line',
145
-                                            args=(order.number, line.pk)),
146
-                                    {'action': 'reorder'})
147
-
148
-        basket = Basket.objects.all()[0]
149
-        self.assertEquals(len(basket.all_lines()), 1)
150
-
151
-    def test_cannot_reorder_out_of_stock_product(self):
152
-        order = create_order(user=self.user)
153
-
154
-        product = order.lines.all()[0].product
155
-        product.stockrecord.num_in_stock = 0
156
-        product.stockrecord.save()
157
-
158
-        Basket.objects.all().delete()
159
-
160
-        self.client.post(reverse('customer:order',
161
-                                            args=(order.number,)),
162
-                                    {'order_id': order.pk,
163
-                                     'action': 'reorder'})
164
-
165
-        basket = Basket.objects.all()[0]
166
-        self.assertEquals(len(basket.all_lines()), 0)
167
-
168
-    def test_cannot_reorder_out_of_stock_line(self):
169
-        order = create_order(user=self.user)
170
-        line = order.lines.all()[0]
171
-
172
-        product = line.product
173
-        product.stockrecord.num_in_stock = 0
174
-        product.stockrecord.save()
175
-
176
-        Basket.objects.all().delete()
177
-
178
-        self.client.post(reverse('customer:order-line',
179
-                                            args=(order.number, line.pk)),
180
-                                    {'action': 'reorder'})
181
-
182
-        basket = Basket.objects.all()[0]
183
-        self.assertEquals(len(basket.all_lines()), 0)
184
-
185
-    @patch('django.conf.settings.OSCAR_MAX_BASKET_QUANTITY_THRESHOLD', 1)
186
-    def test_cannot_reorder_when_basket_maximum_exceeded(self):
187
-        order = create_order(user=self.user)
188
-        line = order.lines.all()[0]
189
-
190
-        Basket.objects.all().delete()
191
-        #add a product
192
-        product = create_product(price=D('12.00'))
193
-        self.client.post(reverse('basket:add'), {'product_id': product.id,
194
-                                                 'quantity': 1})
195
-
196
-
197
-        basket = Basket.objects.all()[0]
198
-        self.assertEquals(len(basket.all_lines()), 1)
199
-
200
-        #try to reorder a product
201
-        self.client.post(reverse('customer:order',
202
-                                            args=(order.number,)),
203
-                                    {'order_id': order.pk,
204
-                                     'action': 'reorder'})
205
-
206
-        self.assertEqual(len(basket.all_lines()), 1)
207
-        self.assertNotEqual(line.product.pk, product.pk)
208
-
209
-    @patch('django.conf.settings.OSCAR_MAX_BASKET_QUANTITY_THRESHOLD', 1)
210
-    def test_cannot_reorder_line_when_basket_maximum_exceeded(self):
211
-        order = create_order(user=self.user)
212
-        line = order.lines.all()[0]
213
-
214
-        Basket.objects.all().delete()
215
-        #add a product
216
-        product = create_product(price=D('12.00'))
217
-        self.client.post(reverse('basket:add'), {'product_id': product.id,
218
-                                                 'quantity': 1})
219
-
220
-        basket = Basket.objects.all()[0]
221
-        self.assertEquals(len(basket.all_lines()), 1)
222
-
223
-        self.client.post(reverse('customer:order-line',
224
-                                            args=(order.number, line.pk)),
225
-                                    {'action': 'reorder'})
226
-
227
-        self.assertEquals(len(basket.all_lines()), 1)
228
-        self.assertNotEqual(line.product.pk, product.pk)
229
-
230
-
231
-class TestAnAnonymousUser(WebTestCase):
232
-
233
-    def test_can_login(self):
234
-        email, password = 'd@d.com', 'mypassword'
235
-        User.objects.create_user('_', email, password)
236
-
237
-        url = reverse('customer:login')
238
-        form = self.app.get(url).forms['login_form']
239
-        form['login-username'] = email
240
-        form['login-password'] = password
241
-        response = form.submit('login_submit')
242
-        self.assertRedirectsTo(response, 'customer:summary')
243
-
244
-    def test_can_register(self):
245
-        url = reverse('customer:register')
246
-        form = self.app.get(url).forms['register_form']
247
-        form['registration-email'] = 'terry@boom.com'
248
-        form['registration-password1'] = 'hedgehog'
249
-        form['registration-password2'] = 'hedgehog'
250
-        response = form.submit()
251
-        self.assertRedirectsTo(response, 'customer:summary')
252
-
253
-
254
-class TestASignedInUser(WebTestCase):
255
-
256
-    def test_can_view_their_profile(self):
257
-        email, password = 'd@d.com', 'mypassword'
258
-        user = User.objects.create_user('_', email, password)
259
-        url = reverse('customer:summary')
260
-        self.app.get(url, user=user)

tests/functional/dashboard_tests.py → tests/functional/dashboard/dashboard_tests.py Прегледај датотеку


Loading…
Откажи
Сачувај