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

article()   A

Complexity

Conditions 1

Size

Total Lines 3
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
nop 2
dl 0
loc 3
rs 10
c 0
b 0
f 0
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