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()