Passed
Push — main ( 0cab68...b2ce89 )
by Jochen
06:38
created

test_create_tickets_with_same_code_fails()   A

Complexity

Conditions 3

Size

Total Lines 16
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 14
nop 9
dl 0
loc 16
rs 9.7
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-2022 Jochen Kupperschmidt
3
:License: Revised BSD (see `LICENSE` file for details)
4
"""
5
6
from unittest.mock import patch
7
8
from flask import Flask
9
import pytest
10
from pytest import raises
11
12
from byceps.events.ticketing import TicketsSold
13
from byceps.services.shop.article.transfer.models import Article
14
from byceps.services.shop.order import action_registry_service
15
from byceps.services.shop.order import log_service as order_log_service
16
from byceps.services.shop.order.transfer.order import Order, Orderer
17
from byceps.services.shop.shop.transfer.models import Shop
18
from byceps.services.shop.storefront.transfer.models import Storefront
19
from byceps.services.ticketing import ticket_service
20
from byceps.services.ticketing.ticket_creation_service import (
21
    TicketCreationFailed,
22
)
23
from byceps.services.ticketing.transfer.models import TicketCategory
24
from byceps.services.user.transfer.models import User
25
26
from .helpers import get_tickets_for_order, mark_order_as_paid, place_order
27
28
29
@pytest.fixture
30
def article(make_article, shop: Shop) -> Article:
31
    return make_article(shop.id)
32
33
34
@pytest.fixture(scope='module')
35
def ticket_quantity() -> int:
36
    return 4
37
38
39
@pytest.fixture
40
def order(
41
    article: Article, ticket_quantity, storefront: Storefront, orderer: Orderer
42
) -> Order:
43
    articles_with_quantity = [(article, ticket_quantity)]
44
    return place_order(storefront.id, orderer, articles_with_quantity)
45
46
47
@pytest.fixture
48
def order_action(article: Article, ticket_category: TicketCategory) -> None:
49
    action_registry_service.register_tickets_creation(
50
        article.item_number, ticket_category.id
51
    )
52
53
54 View Code Duplication
@patch('byceps.signals.ticketing.tickets_sold.send')
55
def test_create_tickets(
56
    tickets_sold_signal_send_mock,
57
    admin_app: Flask,
58
    article: Article,
59
    ticket_category: TicketCategory,
60
    ticket_quantity: int,
61
    admin_user: User,
62
    orderer_user: User,
63
    orderer: Orderer,
64
    order: Order,
65
    order_action,
66
) -> None:
67
    tickets_before_paid = get_tickets_for_order(order)
68
    assert len(tickets_before_paid) == 0
69
70
    shop_order_paid_event = mark_order_as_paid(order.id, admin_user.id)
71
72
    tickets_after_paid = get_tickets_for_order(order)
73
    assert len(tickets_after_paid) == ticket_quantity
74
75
    for ticket in tickets_after_paid:
76
        assert ticket.owned_by_id == orderer.user_id
77
        assert ticket.used_by_id == orderer.user_id
78
79
    log_entries = order_log_service.get_entries_for_order(order.id)
80
    ticket_created_log_entries = [
81
        entry for entry in log_entries if entry.event_type == 'ticket-created'
82
    ]
83
    assert len(ticket_created_log_entries) == ticket_quantity
84
85
    tickets_sold_event = TicketsSold(
86
        occurred_at=shop_order_paid_event.occurred_at,
87
        initiator_id=admin_user.id,
88
        initiator_screen_name=admin_user.screen_name,
89
        party_id=ticket_category.party_id,
90
        owner_id=orderer_user.id,
91
        owner_screen_name=orderer_user.screen_name,
92
        quantity=ticket_quantity,
93
    )
94
    tickets_sold_signal_send_mock.assert_called_once_with(
95
        None, event=tickets_sold_event
96
    )
97
98
99
@patch('byceps.services.ticketing.ticket_code_service._generate_ticket_code')
100
def test_create_tickets_with_same_code_fails(
101
    generate_ticket_code_mock,
102
    admin_app: Flask,
103
    article: Article,
104
    ticket_category: TicketCategory,
105
    ticket_quantity: int,
106
    admin_user: User,
107
    orderer: Orderer,
108
    order: Order,
109
    order_action,
110
) -> None:
111
    generate_ticket_code_mock.side_effect = lambda: 'EQUAL'
112
113
    with raises(TicketCreationFailed):
114
        mark_order_as_paid(order.id, admin_user.id)
115
116
117 View Code Duplication
@patch('byceps.services.ticketing.ticket_code_service._generate_ticket_code')
1 ignored issue
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
118
def test_create_tickets_with_temporarily_equal_code_and_retry_succeeds(
119
    generate_ticket_code_mock,
120
    admin_app: Flask,
121
    article: Article,
122
    ticket_category: TicketCategory,
123
    ticket_quantity: int,
124
    admin_user: User,
125
    orderer: Orderer,
126
    order: Order,
127
    order_action,
128
) -> None:
129
    code_generation_retries = 4  # Depends on implemented default value.
130
    necessary_outer_retries = 5  # Depends on argument to `retry` decorator.
131
    codes = ['EQUAL'] * code_generation_retries * necessary_outer_retries
132
    codes += ['TICK1', 'TICK2', 'TICK3', 'TICK4']
133
    codes_iter = iter(codes)
134
    generate_ticket_code_mock.side_effect = lambda: next(codes_iter)
135
136
    tickets_before_paid = get_tickets_for_order(order)
137
    assert len(tickets_before_paid) == 0
138
139
    mark_order_as_paid(order.id, admin_user.id)
140
141
    tickets_after_paid = get_tickets_for_order(order)
142
    assert len(tickets_after_paid) == ticket_quantity
143