Completed
Push — main ( 4a33dd...b7acb4 )
by Jochen
03:55
created

tests.conftest.make_admin()   A

Complexity

Conditions 4

Size

Total Lines 31
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 21
nop 1
dl 0
loc 31
rs 9.376
c 0
b 0
f 0
1
"""
2
:Copyright: 2006-2020 Jochen Kupperschmidt
3
:License: Modified BSD, see LICENSE for details.
4
"""
5
6
from pathlib import Path
7
from secrets import token_hex
8
from tempfile import TemporaryDirectory
9
from typing import Optional, Set
10
11
import pytest
12
13
from byceps.services.authorization import service as authorization_service
14
from byceps.services.board import board_service
15
from byceps.services.brand import service as brand_service
16
from byceps.services.email import service as email_service
17
from byceps.services.party import service as party_service
18
from byceps.services.site import service as site_service
19
from byceps.services.user import (
20
    command_service as user_command_service,
21
    service as user_service,
22
)
23
24
from tests.base import create_admin_app, create_site_app
25
from tests.database import set_up_database, tear_down_database
26
from tests.helpers import (
27
    create_brand,
28
    create_party,
29
    create_permissions,
30
    create_role_with_permissions_assigned,
31
    create_site,
32
    create_user,
33
    create_user_with_detail,
34
    DEFAULT_EMAIL_CONFIG_ID,
35
)
36
37
38
CONFIG_PATH_DATA_KEY = 'PATH_DATA'
39
40
41
@pytest.fixture(scope='session')
42
def make_admin_app(data_path):
43
    """Provide the admin web application."""
44
45
    def _wrapper(**config_overrides):
46
        if CONFIG_PATH_DATA_KEY not in config_overrides:
47
            config_overrides[CONFIG_PATH_DATA_KEY] = data_path
48
        return create_admin_app(config_overrides)
49
50
    return _wrapper
51
52
53
@pytest.fixture(scope='session')
54
def admin_app(make_admin_app):
55
    """Provide the admin web application."""
56
    app = make_admin_app()
57
    with app.app_context():
58
        set_up_database()
59
        yield app
60
        tear_down_database()
61
62
63
@pytest.fixture(scope='session')
64
def admin_client(admin_app):
65
    """Provide a test HTTP client against the admin web application."""
66
    return admin_app.test_client()
67
68
69
@pytest.fixture(scope='session')
70
def make_site_app(admin_app, data_path):
71
    """Provide a site web application."""
72
73
    def _wrapper(**config_overrides):
74
        if CONFIG_PATH_DATA_KEY not in config_overrides:
75
            config_overrides[CONFIG_PATH_DATA_KEY] = data_path
76
        return create_site_app(config_overrides)
77
78
    return _wrapper
79
80
81
@pytest.fixture(scope='session')
82
def site_app(make_site_app):
83
    """Provide a site web application."""
84
    app = make_site_app()
85
    with app.app_context():
86
        yield app
87
88
89
@pytest.fixture(scope='session')
90
def data_path():
91
    with TemporaryDirectory() as d:
92
        yield Path(d)
93
94
95
@pytest.fixture(scope='session')
96
def make_user(admin_app):
97
    user_ids = set()
98
99
    def _wrapper(*args, **kwargs):
100
        user = create_user(*args, **kwargs)
101
        user_ids.add(user.id)
102
        user_dto = user_service._db_entity_to_user(user)
103
        return user_dto
104
105
    yield _wrapper
106
107
    for user_id in user_ids:
108
        user_command_service.delete_account(user_id, user_id, 'clean up')
109
110
111
@pytest.fixture(scope='module')
112
def make_user_with_detail(admin_app):
113
    user_ids = set()
114
115
    def _wrapper(*args, **kwargs):
116
        user = create_user_with_detail(*args, **kwargs)
117
        user_ids.add(user.id)
118
        user_dto = user_service._db_entity_to_user_with_detail(user)
119
        return user_dto
120
121
    yield _wrapper
122
123
    for user_id in user_ids:
124
        user_command_service.delete_account(user_id, user_id, 'clean up')
125
126
127
@pytest.fixture(scope='session')
128
def make_admin(make_user):
129
    user_ids = set()
130
    created_permission_ids = set()
131
    created_role_ids = set()
132
133
    def _wrapper(screen_name: str, permission_ids: Set[str]):
134
        admin = make_user(screen_name)
135
        user_ids.add(admin.id)
136
137
        # Create permissions and role.
138
        role_id = f'admin_{token_hex(3)}'
139
        create_permissions(permission_ids)
140
        create_role_with_permissions_assigned(role_id, permission_ids)
141
        authorization_service.assign_role_to_user(role_id, admin.id)
142
        created_role_ids.add(role_id)
143
144
        return admin
145
146
    yield _wrapper
147
148
    # Remove permissions and role again.
149
150
    for user_id in user_ids:
151
        authorization_service.deassign_all_roles_from_user(user_id)
152
153
    for role_id in created_role_ids:
154
        authorization_service.delete_role(role_id)
155
156
    for permission_id in created_permission_ids:
157
        authorization_service.delete_permission(permission_id)
158
159
160
@pytest.fixture(scope='session')
161
def admin_user(make_user):
162
    return make_user('Admin')
163
164
165
@pytest.fixture(scope='session')
166
def user(make_user):
167
    return make_user('User')
168
169
170
@pytest.fixture(scope='session')
171
def uninitialized_user(make_user):
172
    return make_user('UninitializedUser', initialized=False)
173
174
175
@pytest.fixture(scope='session')
176
def suspended_user(make_user):
177
    return make_user('SuspendedUser', suspended=True)
178
179
180
@pytest.fixture(scope='session')
181
def deleted_user(make_user):
182
    return make_user('DeletedUser', deleted=True)
183
184
185
@pytest.fixture(scope='session')
186
def make_email_config(admin_app):
187
    def _wrapper(
188
        config_id: str,
189
        sender_address: str,
190
        *,
191
        sender_name: Optional[str] = None,
192
        contact_address: Optional[str] = None,
193
    ):
194
        email_service.set_config(
195
            config_id,
196
            sender_address,
197
            sender_name=sender_name,
198
            contact_address=contact_address,
199
        )
200
201
        return email_service.get_config(config_id)
202
203
    return _wrapper
204
205
206
@pytest.fixture(scope='session')
207
def email_config(make_email_config):
208
    return make_email_config(
209
        DEFAULT_EMAIL_CONFIG_ID, sender_address='[email protected]'
210
    )
211
212
213
@pytest.fixture(scope='session')
214
def site(email_config, party, board):
215
    site = create_site(
216
        'acmecon-2014-website',
217
        party.brand_id,
218
        title='ACMECon 2014 website',
219
        server_name='www.acmecon.test',
220
        party_id=party.id,
221
        board_id=board.id,
222
    )
223
    yield site
224
    site_service.delete_site(site.id)
225
226
227
@pytest.fixture(scope='session')
228
def brand(admin_app):
229
    brand = create_brand()
230
    yield brand
231
    brand_service.delete_brand(brand.id)
232
233
234
@pytest.fixture(scope='session')
235
def party(brand):
236
    party = create_party(brand.id)
237
    yield party
238
    party_service.delete_party(party.id)
239
240
241
@pytest.fixture(scope='session')
242
def board(brand):
243
    board_id = brand.id
244
    board = board_service.create_board(brand.id, board_id)
245
    yield board
246
    board_service.delete_board(board.id)
247