Passed
Push — master ( f658ea...afdd84 )
by Jochen
02:42
created

ShopOrderTestCase.test_order()   A

Complexity

Conditions 3

Size

Total Lines 48
Code Lines 36

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 36
nop 3
dl 0
loc 48
rs 9.016
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 = f'article_{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 = f'http://example.com/shop/orders/{order.id}'
102
103
        assert_response_headers(response, order_detail_page_url)
104
105
        with http_client(self.app, user_id=self.orderer.id) as client:
106
            assert_order_detail_page_works(
107
                client, order_detail_page_url, order.order_number
108
            )
109
110
    @patch('byceps.blueprints.shop.order.signals.order_placed.send')
111
    @patch('byceps.blueprints.shop.order.views.order_email_service')
112
    def test_order_single(self, order_email_service_mock, order_placed_mock):
113
        article_before = self.get_article()
114
        assert article_before.quantity == 5
115
116
        url = f'/shop/order_single/{self.article_id!s}'
117
        form_data = {
118
            'first_names': 'Hiro',
119
            'last_name': 'Protagonist',
120
            'country': 'State of Mind',
121
            'zip_code': '31337',
122
            'city': 'Atrocity',
123
            'street': 'L33t Street 101',
124
            'quantity': 1,  # TODO: Test with `3` if limitation is removed.
125
        }
126
        with http_client(self.app, user_id=self.orderer.id) as client:
127
            response = client.post(url, data=form_data)
128
129
        article_afterwards = self.get_article()
130
        assert article_afterwards.quantity == 4
131
132
        order = Order.query.filter_by(placed_by=self.orderer).one()
133
        assert_order(order, 'AEC-01-B00005', 1)
134
135
        first_order_item = order.items[0]
136
        assert_order_item(
137
            first_order_item,
138
            self.article_id,
139
            article_before.price,
140
            article_before.tax_rate,
141
            1,
142
        )
143
144
        order_email_service_mock.send_email_for_incoming_order_to_orderer.assert_called_once_with(
145
            order.id
146
        )
147
148
        order_placed_mock.assert_called_once_with(None, order_id=order.id)
149
150
        order_detail_page_url = f'http://example.com/shop/orders/{order.id}'
151
152
        assert_response_headers(response, order_detail_page_url)
153
154
        with http_client(self.app, user_id=self.orderer.id) as client:
155
            assert_order_detail_page_works(
156
                client, order_detail_page_url, order.order_number
157
            )
158
159
    # helpers
160
161
    def get_article(self):
162
        return Article.query.get(self.article_id)
163
164
165
def assert_response_headers(response, order_detail_page_url):
166
    assert response.status_code == 302
167
    assert response.headers.get('Location') == order_detail_page_url
168
169
170
def assert_order(order, order_number, item_quantity):
171
    assert order.order_number == order_number
172
    assert len(order.items) == item_quantity
173
174
175
def assert_order_item(order_item, article_id, unit_price, tax_rate, quantity):
176
    assert order_item.article.id == article_id
177
    assert order_item.unit_price == unit_price
178
    assert order_item.tax_rate == tax_rate
179
    assert order_item.quantity == quantity
180
181
182
def assert_order_detail_page_works(client, order_detail_page_url, order_number):
183
    response = client.get(order_detail_page_url)
184
    assert response.status_code == 200
185
    assert 'AEC-01-B00005' in response.get_data(as_text=True)
186