Passed
Push — master ( 634080...f658ea )
by Jochen
02:33
created

ShopOrderTestCase.test_order()   B

Complexity

Conditions 3

Size

Total Lines 50
Code Lines 37

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 37
nop 3
dl 0
loc 50
rs 8.9919
c 0
b 0
f 0
1
"""
2
:Copyright: 2006-2019 Jochen Kupperschmidt
3
:License: Modified BSD, see LICENSE for details.
4
"""
5
6
from unittest.mock import patch
7
8
from byceps.services.shop.article.models.article import Article
9
from byceps.services.shop.order.models.order import Order
10
11
from testfixtures.shop_article import create_article
12
13
from tests.helpers import (
14
    create_brand,
15
    create_email_config,
16
    create_party,
17
    create_site,
18
    create_user,
19
    http_client,
20
    login_user,
21
)
22
from tests.services.shop.base import ShopTestBase
23
24
25
class ShopOrderTestCase(ShopTestBase):
26
27
    def setUp(self):
28
        super().setUp()
29
30
        create_email_config()
31
32
        self.setup_orderer()
33
34
        self.shop = self.create_shop()
35
        self.setup_order_number_prefix_and_sequence()
36
        self.create_shop_fragment(
37
            self.shop.id, 'payment_instructions', 'Send all ur moneyz!'
38
        )
39
        self.setup_article()
40
41
        brand = create_brand()
42
        party = create_party(brand.id, shop_id=self.shop.id)
43
        create_site(party_id=party.id)
44
45
    def setup_order_number_prefix_and_sequence(self):
46
        self.create_order_number_sequence(self.shop.id, 'AEC-01-B', value=4)
47
48
    def setup_orderer(self):
49
        self.orderer = create_user()
50
        login_user(self.orderer.id)
51
52
    def setup_article(self):
53
        article = create_article(self.shop.id, quantity=5)
54
55
        self.db.session.add(article)
56
        self.db.session.commit()
57
58
        self.article_id = article.id
59
60
    @patch('byceps.blueprints.shop.order.signals.order_placed.send')
61
    @patch('byceps.blueprints.shop.order.views.order_email_service')
62
    def test_order(self, order_email_service_mock, order_placed_mock):
63
        article_before = self.get_article()
64
        assert article_before.quantity == 5
65
66
        url = '/shop/order'
67
        article_quantity_key = 'article_{}'.format(self.article_id)
68
        form_data = {
69
            'first_names': 'Hiro',
70
            'last_name': 'Protagonist',
71
            'country': 'State of Mind',
72
            'zip_code': '31337',
73
            'city': 'Atrocity',
74
            'street': 'L33t Street 101',
75
            article_quantity_key: 3,
76
        }
77
        with http_client(self.app, user_id=self.orderer.id) as client:
78
            response = client.post(url, data=form_data)
79
80
        article_afterwards = self.get_article()
81
        assert article_afterwards.quantity == 2
82
83
        order = Order.query.filter_by(placed_by=self.orderer).one()
84
        assert_order(order, 'AEC-01-B00005', 1)
85
86
        first_order_item = order.items[0]
87
        assert_order_item(
88
            first_order_item,
89
            self.article_id,
90
            article_before.price,
91
            article_before.tax_rate,
92
            3,
93
        )
94
95
        order_email_service_mock.send_email_for_incoming_order_to_orderer.assert_called_once_with(
96
            order.id
97
        )
98
99
        order_placed_mock.assert_called_once_with(None, order_id=order.id)
100
101
        order_detail_page_url = 'http://example.com/shop/orders/{}'.format(
102
            order.id
103
        )
104
105
        assert_response_headers(response, order_detail_page_url)
106
107
        with http_client(self.app, user_id=self.orderer.id) as client:
108
            assert_order_detail_page_works(
109
                client, order_detail_page_url, order.order_number
110
            )
111
112
    @patch('byceps.blueprints.shop.order.signals.order_placed.send')
113
    @patch('byceps.blueprints.shop.order.views.order_email_service')
114
    def test_order_single(self, order_email_service_mock, order_placed_mock):
115
        article_before = self.get_article()
116
        assert article_before.quantity == 5
117
118
        url = '/shop/order_single/{}'.format(str(self.article_id))
119
        form_data = {
120
            'first_names': 'Hiro',
121
            'last_name': 'Protagonist',
122
            'country': 'State of Mind',
123
            'zip_code': '31337',
124
            'city': 'Atrocity',
125
            'street': 'L33t Street 101',
126
            'quantity': 1,  # TODO: Test with `3` if limitation is removed.
127
        }
128
        with http_client(self.app, user_id=self.orderer.id) as client:
129
            response = client.post(url, data=form_data)
130
131
        article_afterwards = self.get_article()
132
        assert article_afterwards.quantity == 4
133
134
        order = Order.query.filter_by(placed_by=self.orderer).one()
135
        assert_order(order, 'AEC-01-B00005', 1)
136
137
        first_order_item = order.items[0]
138
        assert_order_item(
139
            first_order_item,
140
            self.article_id,
141
            article_before.price,
142
            article_before.tax_rate,
143
            1,
144
        )
145
146
        order_email_service_mock.send_email_for_incoming_order_to_orderer.assert_called_once_with(
147
            order.id
148
        )
149
150
        order_placed_mock.assert_called_once_with(None, order_id=order.id)
151
152
        order_detail_page_url = 'http://example.com/shop/orders/{}'.format(
153
            order.id
154
        )
155
156
        assert_response_headers(response, order_detail_page_url)
157
158
        with http_client(self.app, user_id=self.orderer.id) as client:
159
            assert_order_detail_page_works(
160
                client, order_detail_page_url, order.order_number
161
            )
162
163
    # helpers
164
165
    def get_article(self):
166
        return Article.query.get(self.article_id)
167
168
169
def assert_response_headers(response, order_detail_page_url):
170
    assert response.status_code == 302
171
    assert response.headers.get('Location') == order_detail_page_url
172
173
174
def assert_order(order, order_number, item_quantity):
175
    assert order.order_number == order_number
176
    assert len(order.items) == item_quantity
177
178
179
def assert_order_item(order_item, article_id, unit_price, tax_rate, quantity):
180
    assert order_item.article.id == article_id
181
    assert order_item.unit_price == unit_price
182
    assert order_item.tax_rate == tax_rate
183
    assert order_item.quantity == quantity
184
185
186
def assert_order_detail_page_works(client, order_detail_page_url, order_number):
187
    response = client.get(order_detail_page_url)
188
    assert response.status_code == 200
189
    assert 'AEC-01-B00005' in response.get_data(as_text=True)
190