Passed
Push — main ( 52660c...ae658f )
by Jochen
04:31
created

services/shop/article/test_article_availability.py (1 issue)

1
"""
2
:Copyright: 2006-2021 Jochen Kupperschmidt
3
:License: Revised BSD (see `LICENSE` file for details)
4
"""
5
6
from datetime import datetime
7
from decimal import Decimal
8
from typing import Optional
9
10
from freezegun import freeze_time
11
import pytest
12
13
from byceps.database import generate_uuid
14
from byceps.services.shop.article.transfer.models import (
15
    Article,
16
    ArticleID,
17
    ArticleNumber,
18
    ArticleType,
19
)
20
from byceps.services.shop.article.service import is_article_available_now
21
from byceps.services.shop.shop.transfer.models import ShopID
22
23
24
@pytest.mark.parametrize(
25
    'now, expected',
26
    [
27
        (datetime(2014,  4,  8, 12,  0,  0), False),
28
        (datetime(2014,  9, 15, 17, 59, 59), False),
29
        (datetime(2014,  9, 15, 18,  0,  0), True ),
30
        (datetime(2014,  9, 19, 15,  0,  0), True ),
31
        (datetime(2014,  9, 23, 17, 59, 59), True ),
32
        (datetime(2014,  9, 23, 18,  0,  0), False),
33
        (datetime(2014, 11,  4, 12,  0,  0), False),
34
    ],
35
)
36
def test_is_available_with_start_and_end(now, expected):
37
    article = create_article(
38
        datetime(2014, 9, 15, 18, 0, 0),
39
        datetime(2014, 9, 23, 18, 0, 0),
40
    )
41
42
    with freeze_time(now):
43
        assert is_article_available_now(article) == expected
44
45
46 View Code Duplication
@pytest.mark.parametrize(
47
    'now, expected',
48
    [
49
        (datetime(2014,  4,  8, 12,  0,  0), False),
50
        (datetime(2014,  9, 15, 17, 59, 59), False),
51
        (datetime(2014,  9, 15, 18,  0,  0), True ),
52
        (datetime(2014,  9, 19, 15,  0,  0), True ),
53
        (datetime(2014,  9, 23, 17, 59, 59), True ),
54
        (datetime(2014,  9, 23, 18,  0,  0), True ),
55
        (datetime(2014, 11,  4, 12,  0,  0), True ),
56
    ],
57
)
58
def test_is_available_with_start_and_without_end(now, expected):
59
    article = create_article(
60
        datetime(2014, 9, 15, 18, 0, 0),
61
        None,
62
    )
63
64
    with freeze_time(now):
65
        assert is_article_available_now(article) == expected
66
67
68 View Code Duplication
@pytest.mark.parametrize(
69
    'now, expected',
70
    [
71
        (datetime(2014,  4,  8, 12,  0,  0), True ),
72
        (datetime(2014,  9, 15, 17, 59, 59), True ),
73
        (datetime(2014,  9, 15, 18,  0,  0), True ),
74
        (datetime(2014,  9, 19, 15,  0,  0), True ),
75
        (datetime(2014,  9, 23, 17, 59, 59), True ),
76
        (datetime(2014,  9, 23, 18,  0,  0), False),
77
        (datetime(2014, 11,  4, 12,  0,  0), False),
78
    ],
79
)
80
def test_is_available_without_start_and_with_end(now, expected):
81
    article = create_article(
82
        None,
83
        datetime(2014, 9, 23, 18, 0, 0),
84
    )
85
86
    with freeze_time(now):
87
        assert is_article_available_now(article) == expected
88
89
90
@pytest.mark.parametrize(
91
    'now, expected',
92
    [
93
        (datetime(2014,  4,  8, 12,  0,  0), True ),
94
        (datetime(2014,  9, 15, 17, 59, 59), True ),
95
        (datetime(2014,  9, 15, 18,  0,  0), True ),
96
        (datetime(2014,  9, 19, 15,  0,  0), True ),
97
        (datetime(2014,  9, 23, 17, 59, 59), True ),
98
        (datetime(2014,  9, 23, 18,  0,  0), True ),
99
        (datetime(2014, 11,  4, 12,  0,  0), True ),
100
    ],
101
)
102
def test_is_available_without_start_and_without_end(now, expected):
103
    article = create_article(
104
        None,
105
        None,
106
    )
107
108
    with freeze_time(now):
109
        assert is_article_available_now(article) == expected
110
111
112 View Code Duplication
def create_article(
1 ignored issue
show
This code seems to be duplicated in your project.
Loading history...
113
    available_from: Optional[datetime], available_until: Optional[datetime]
114
) -> Article:
115
    return Article(
116
        id=ArticleID(generate_uuid()),
117
        shop_id=ShopID('any-shop'),
118
        item_number=ArticleNumber('article-123'),
119
        type_=ArticleType.other,
120
        description='Cool thing',
121
        price=Decimal('1.99'),
122
        tax_rate=Decimal('0.19'),
123
        available_from=available_from,
124
        available_until=available_until,
125
        total_quantity=1,
126
        quantity=1,
127
        max_quantity_per_order=1,
128
        not_directly_orderable=False,
129
        separate_order_required=False,
130
        processing_required=False,
131
    )
132