197 lines
6.7 KiB
Python
197 lines
6.7 KiB
Python
import pytest
|
|
import json
|
|
from deepdiff import DeepDiff
|
|
from collections import namedtuple
|
|
from datetime import datetime
|
|
from app import create_app, model
|
|
|
|
UserMock = namedtuple('UserMock', ['user_id', 'first_name', 'last_name', 'email', 'roles', 'join_date', 'date_of_birth', 'phone_number', 'password'])
|
|
|
|
MOCK_USER_1 = UserMock(user_id='test',
|
|
first_name='unit',
|
|
last_name='test',
|
|
email='test@local.com',
|
|
roles=[model.Roles.APPLICANT],
|
|
join_date=datetime.strptime('2021-03-18', '%Y-%m-%d'),
|
|
date_of_birth=datetime.strptime('2003-03-18', '%Y-%m-%d'),
|
|
phone_number='123-456-7890',
|
|
password='test-local')
|
|
|
|
MOCK_ADMIN_USER = UserMock(user_id='test-admin',
|
|
first_name='test',
|
|
last_name='admin',
|
|
email='test@admin.com',
|
|
roles=[model.Roles.ADMIN],
|
|
join_date=datetime.strptime('2021-03-18', '%Y-%m-%d'),
|
|
date_of_birth=datetime.strptime('2003-03-18', '%Y-%m-%d'),
|
|
phone_number='111-111-1111',
|
|
password='test-admin')
|
|
|
|
MOCK_NETWORK_ADMIN_USER = UserMock(user_id='test-network-admin',
|
|
first_name='network',
|
|
last_name='admin',
|
|
email='test@network-admin.com',
|
|
roles=[model.Roles.NETWORK_ADMIN],
|
|
join_date=datetime.strptime('2021-03-18', '%Y-%m-%d'),
|
|
date_of_birth=datetime.strptime('2003-03-18', '%Y-%m-%d'),
|
|
phone_number='222-222-2222',
|
|
password='test-admin')
|
|
|
|
CONFIG_OVERRIDE = {
|
|
'MONGODB_HOST': 'mongomock://localhost',
|
|
'MONGODB_USERNAME': None,
|
|
'MONGODB_PASSWORD': None,
|
|
'TESTING': True,
|
|
'PASSWORD_RESET_EXP_SEC': 1
|
|
}
|
|
|
|
|
|
def _assert(value, invert=False, message=None):
|
|
value = not value if invert else value
|
|
|
|
assert value, message
|
|
|
|
|
|
def assert_true(value, message=None):
|
|
message = message or 'Value is False'
|
|
_assert(value, message=message)
|
|
|
|
|
|
def assert_false(value, message=None):
|
|
message = message or 'Value is True'
|
|
_assert(value, invert=True, message=message)
|
|
|
|
|
|
def assert_in(item, container, message=None):
|
|
message = message or f'Value missing from container (value={item}, container={container}).'
|
|
assert_true(item in container, message=message)
|
|
|
|
|
|
def assert_not_in(item, container, message=None):
|
|
message = message or f'Unexpected value in container (value={item}, container={container}).'
|
|
assert_false(item in container, message=message)
|
|
|
|
|
|
def assert_not_none(value, message=None):
|
|
message = message or 'Value is None'
|
|
assert_false(value is None, message=message)
|
|
|
|
|
|
def assert_none(value, message=None):
|
|
message = message or f'Value is not None (value={value}).'
|
|
assert_true(value is None, message=message)
|
|
|
|
|
|
def assert_equal(item_1, item_2, message=None):
|
|
message = message or f'Items are not equal (item_1={item_1}, item_2={item_2}).'
|
|
assert_true(item_1 == item_2, message=message)
|
|
|
|
|
|
def assert_not_equal(item_1, item_2, message=None):
|
|
message = message or f'Items are equal (item_1={item_1}, item_2={item_2}).'
|
|
assert_false(item_1 == item_2, message=message)
|
|
|
|
|
|
def assert_empty(iterable, message=None):
|
|
message = message or f'Iterable is not empty (iterable={iterable}).'
|
|
assert_equal(len(iterable), 0, message=message)
|
|
|
|
|
|
def _assert_status_code(response, status_code, message=None):
|
|
message = message or f'Response status code is incorrect (response_code={response.status_code}, expected={status_code}).'
|
|
assert_equal(response.status_code, status_code, message=message)
|
|
|
|
|
|
def assert_200(response, message=None):
|
|
_assert_status_code(response, 200, message=message)
|
|
|
|
|
|
def assert_400(response, message=None):
|
|
_assert_status_code(response, 400, message=message)
|
|
|
|
|
|
def assert_404(response, message=None):
|
|
_assert_status_code(response, 404, message=message)
|
|
|
|
|
|
def assert_401(response, message=None):
|
|
_assert_status_code(response, 401, message=message)
|
|
|
|
|
|
def assert_402(response, message=None):
|
|
_assert_status_code(response, 402, message=message)
|
|
|
|
|
|
def assert_405(response, message=None):
|
|
_assert_status_code(response, 405, message=message)
|
|
|
|
|
|
def assert_406(response, message=None):
|
|
_assert_status_code(response, 406, message=message)
|
|
|
|
|
|
def assert_message(response, message, msg=None):
|
|
msg = msg or f'The response message did not match (message="{response.json.get("message")}", expected={message}'
|
|
assert_equal(response.json.get('message'), message, message=msg)
|
|
|
|
|
|
def assert_deep_diff_diffs(item_1, item_2, expected_diff, message=None, **kwargs):
|
|
diffs = DeepDiff(item_1, item_2, **kwargs)
|
|
assert_response_json_equal(diffs.to_dict(), expected_diff, message=message)
|
|
|
|
|
|
def assert_deep_diff_equal(item_1, item_2, message=None, **kwargs):
|
|
if 'ignore_order' not in kwargs:
|
|
kwargs['ignore_order'] = True
|
|
diffs = DeepDiff(item_1, item_2, **kwargs)
|
|
assert_empty(diffs, message)
|
|
|
|
|
|
def assert_response_json_equal(response, expected, message=None, **kwargs):
|
|
if 'ignore_order' not in kwargs:
|
|
kwargs['ignore_order'] = True
|
|
diffs = DeepDiff(response.json, expected, **kwargs)
|
|
message = message or f'Unexpected diffs: {diffs.to_json(indent=2)}'
|
|
assert_empty(diffs, message=message)
|
|
|
|
|
|
def assert_error_type(response, expected_type, message=None):
|
|
error_type = response.json.get('error_type')
|
|
message = message or f'Response error type "{error_type}" is incorrect (expected: {expected_type}).'
|
|
assert_equal(error_type, expected_type, message=message)
|
|
|
|
|
|
def setup_db():
|
|
for mock_user in [MOCK_USER_1, MOCK_ADMIN_USER, MOCK_NETWORK_ADMIN_USER]:
|
|
user = model.User(
|
|
user_id=mock_user.user_id,
|
|
email=mock_user.email,
|
|
first_name=mock_user.first_name,
|
|
last_name=mock_user.last_name,
|
|
join_date=mock_user.join_date,
|
|
date_of_birth=mock_user.date_of_birth,
|
|
phone_number=mock_user.phone_number,
|
|
roles=mock_user.roles,
|
|
active=True
|
|
)
|
|
user.set_password(mock_user.password)
|
|
user.save()
|
|
|
|
|
|
def clean_db():
|
|
for user in model.User.objects().all():
|
|
user.delete()
|
|
|
|
for app in model.Application.objects().all():
|
|
app.delete()
|
|
|
|
|
|
@pytest.fixture
|
|
def client():
|
|
app = create_app(config_override=CONFIG_OVERRIDE)
|
|
setup_db()
|
|
with app.test_client() as test_client:
|
|
with app.app_context():
|
|
yield test_client
|
|
clean_db()
|