Completed
Push — main ( c0c994...7dc7dc )
by Jochen
03:36
created

test_create_tickets_with_temporarily_equal_code_and_retry_succeeds()   A

Complexity

Conditions 3

Size

Total Lines 30
Code Lines 24

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 24
nop 9
dl 0
loc 30
rs 9.304
c 0
b 0
f 0

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
"""
2
:Copyright: 2006-2020 Jochen Kupperschmidt
3
:License: Modified BSD, see LICENSE for details.
4
"""
5
6
from unittest.mock import patch
7
8
import pytest
9
from pytest import raises
10
11
from byceps.services.shop.order import action_service, action_registry_service
12
from byceps.services.shop.order import event_service as order_event_service
13
from byceps.services.shop.order import service as order_service
14
from byceps.services.ticketing import ticket_service
15
from byceps.services.ticketing.ticket_creation_service import (
16
    TicketCreationFailed,
17
)
18
19
from .helpers import get_tickets_for_order, mark_order_as_paid, place_order
20
21
22
@pytest.fixture(scope='module')
23
def ticket_quantity():
24
    return 4
25
26
27
@pytest.fixture
28
def order(article, ticket_quantity, storefront, orderer):
29
    articles_with_quantity = [(article, ticket_quantity)]
30
    order = place_order(storefront.id, orderer, articles_with_quantity)
31
32
    yield order
33
34
    order_service.delete_order(order.id)
35
36
37
@pytest.fixture
38
def order_action(article, ticket_category):
39
    action_registry_service.register_tickets_creation(
40
        article.item_number, ticket_category.id
41
    )
42
43
    yield
44
45
    action_service.delete_actions(article.item_number)
46
47
48 View Code Duplication
def test_create_tickets(
49
    admin_app,
50
    article,
51
    ticket_category,
52
    ticket_quantity,
53
    admin_user,
54
    orderer,
55
    order,
56
    order_action,
57
):
58
    tickets_before_paid = get_tickets_for_order(order)
59
    assert len(tickets_before_paid) == 0
60
61
    mark_order_as_paid(order.id, admin_user.id)
62
63
    tickets_after_paid = get_tickets_for_order(order)
64
    assert len(tickets_after_paid) == ticket_quantity
65
66
    for ticket in tickets_after_paid:
67
        assert ticket.owned_by_id == orderer.user_id
68
        assert ticket.used_by_id == orderer.user_id
69
70
    events = order_event_service.get_events_for_order(order.id)
71
    ticket_created_events = {
72
        event for event in events if event.event_type == 'ticket-created'
73
    }
74
    assert len(ticket_created_events) == ticket_quantity
75
76
    # Clean up.
77
    for ticket in tickets_after_paid:
78
        ticket_service.delete_ticket(ticket.id)
79
80
81
@patch('byceps.services.ticketing.ticket_code_service._generate_ticket_code')
82
def test_create_tickets_with_same_code_fails(
83
    generate_ticket_code_mock,
84
    admin_app,
85
    article,
86
    ticket_category,
87
    ticket_quantity,
88
    admin_user,
89
    orderer,
90
    order,
91
    order_action,
92
):
93
    generate_ticket_code_mock.side_effect = lambda: 'EQUAL'
94
95
    with raises(TicketCreationFailed):
96
        mark_order_as_paid(order.id, admin_user.id)
97
98
99
@patch('byceps.services.ticketing.ticket_code_service._generate_ticket_code')
100
def test_create_tickets_with_temporarily_equal_code_and_retry_succeeds(
101
    generate_ticket_code_mock,
102
    admin_app,
103
    article,
104
    ticket_category,
105
    ticket_quantity,
106
    admin_user,
107
    orderer,
108
    order,
109
    order_action,
110
):
111
    code_generation_retries = 4  # Depends on implemented default value.
112
    necessary_outer_retries = 5  # Depends on argument to `retry` decorator.
113
    codes = ['EQUAL'] * code_generation_retries * necessary_outer_retries
114
    codes += ['TCKT1', 'TCKT2', 'TCKT3', 'TCKT4']
115
    codes_iter = iter(codes)
116
    generate_ticket_code_mock.side_effect = lambda: next(codes_iter)
117
118
    tickets_before_paid = get_tickets_for_order(order)
119
    assert len(tickets_before_paid) == 0
120
121
    mark_order_as_paid(order.id, admin_user.id)
122
123
    tickets_after_paid = get_tickets_for_order(order)
124
    assert len(tickets_after_paid) == ticket_quantity
125
126
    # Clean up.
127
    for ticket in tickets_after_paid:
128
        ticket_service.delete_ticket(ticket.id)
129