"""Shared fixtures for handler tests.""" import pytest from owsresponse import response from account import ( api, handlers, # noqa - registers routes ) from account.constants import error, header from account.utils import pagination from tests.unit import db_operations @pytest.fixture def fixture_client(): """Create an api test client fixture.""" return api.app.test_client() @pytest.fixture def fixture_ok_response(): """Create a response.Response fixture for generic ok.""" return response.Response(error.SUCCESS_CODE) @pytest.fixture def fixture_error_response(): """Create a response.Response fixture for generic error.""" return response.create_error_response(code='error_code', message='error_message') @pytest.fixture def fixture_error_not_found_response(): """Create a response.Response fixture for generic error.""" return response.create_not_found_response(message='error_message') @pytest.fixture def fixture_subaccount(): """Create a response.Response fixture for subaccount data.""" return response.Response( { 'subaccount_id': 1, 'vendor_id': 1, 'subaccount_name': 'Subaccount 1', 'description': 'Subaccount Description 1', 'date_deleted': None, } ) @pytest.fixture def fixture_vendors(): """Create a response.Response fixture for vendors data.""" return response.Response({'vendors': [{'uuid': 'uuid1'}, {'uuid': 'uuid2'}]}) @pytest.fixture def fixture_full_vendor(): """Fixture for vendor.""" return response.Response({'vendor_id': 2, 'name': 'Vendor 2'}) @pytest.fixture def fixture_identity_vendor(): """Fixture for vendor identity.""" return response.Response( {'account_id': 2, 'account_type': 'vendor', 'account_name': 'FatCat Records'} ) @pytest.fixture def fixture_identity_subaccount(): """Fixture for subaccount.""" return response.Response( { 'account_id': 1, 'account_type': 'subaccount', 'account_name': 'FatCat Records, Subaccount', } ) @pytest.fixture def db_fixture(): """Set up the subaccount table.""" db_operations.create_tables() db_operations.seed_subaccount_table() @pytest.fixture def fixture_subaccount_list(fixture_subaccount): """Create a response.Response fixture for list of subaccounts.""" return response.Response( dict( items=[fixture_subaccount.message], pagination=dict(page_offset=0, page_limit=50, count=5), ) ) @pytest.fixture def fixture_vendor(): """Fixture for vendor.""" return 'my_vendor' @pytest.fixture def fixture_pagination(): """Create Pagination named tuple.""" return pagination.Pagination(1, 100) @pytest.fixture def fixture_grass_account(fixture_vendor): """Create GrassAccount named tuple.""" return ('type', fixture_vendor) @pytest.fixture def fixture_grass_vendor_account(fixture_vendor): """Create GrassAccount named tuple describing vendor.""" return ('vendor', fixture_vendor) @pytest.fixture def fixture_grass_subaccount_account(fixture_subaccount): """Create GrassAccount named tuple describing subaccount.""" return ('subaccount', fixture_subaccount) @pytest.fixture def fixture_grass_account_none(): """Create GrassAccount named tuple.""" return (None, None) @pytest.fixture def fixture_orchard_user_id(): """Fixture for Orchard user id success.""" return 'oa:100' @pytest.fixture def fixture_orchard_user_id_not_found(): """Fixture for Orchard user id not found.""" return 'oa:1000000000' @pytest.fixture def fixture_user_details(): """User Details response.""" return response.Response( { 'first_name': 'Adam', 'email': 'adameve@email.com', 'account': {'vendor_id': 0, 'subaccount_id': 0}, 'type': 'oa', 'last_name': 'Eve', 'user_id': 'oa:100', } ) @pytest.fixture def fixture_oa_user_header(fixture_orchard_user_id): """Return headers for an OA Orchard-User-Id""" return {'Orchard-User-Id': fixture_orchard_user_id} @pytest.fixture def headers(): """Return valid headers with content type and correlation id.""" return {header.CORRELATION_ID: 'abc-123', 'Content-Type': 'application/json'} @pytest.fixture def valid_headers_for_vendor(): """Fixture for valid vendor headers.""" return { 'Grass-Account-Type': 'vendor', 'Grass-Account-Id': '1', 'Grass-Account-Name': 'Vendor 1', 'Orchard-Profile-Type': 'LabelProfile', 'Orchard-Profile-Id': 1, 'Orchard-Identity-Id': 1, } @pytest.fixture def invalid_headers_for_vendor(headers): """Fixture for invalid vendor headers (missing Grass-Account-Type).""" headers['Grass-Account-Id'] = '1' return headers @pytest.fixture def fixture_subaccount_data_to_activate(): """Fixture for subaccount data to activate.""" return {'active': True} @pytest.fixture def fixture_valid_vendor(): """Fixture for a valid vendor.""" return response.Response( { 'vendor_id': 1, 'is_distributor': 'Y', 'name': 'Funky Vendor', 'country_id': 1, 'owner': 'odd', } ) @pytest.fixture def fixture_valid_update_vendor(): """Fixture for a valid vendor update response.""" return response.Response({'name': 'Blacktop 2', 'updated_at': '2021-01-01T00:00:00'}) @pytest.fixture def fixture_valid_update_vendor_with_last_updated_by(): """Fixture for a valid vendor update response with last updated by.""" return response.Response( {'name': 'Blacktop 2', 'updated_at': '2021-01-01T00:00:00', 'last_modified_by': 1111} ) @pytest.fixture def minimum_vendor_attrs(): """Fixture for minimum vendor attributes.""" return { 'name': 'Vendor Name', 'owner': 'theorchard', 'company_brand': 'theorchard', 'service_tier_uuid': '5f2bd4fc-df94-4f35-97d3-ef23f8573279', 'payment_currency': 'USD', } @pytest.fixture def fixture_subaccount_document(): """Fixture for subaccount document.""" return {'label_id': 1, 'account_type': 'subaccount', 'account_name': 'Test Subaccount'} @pytest.fixture def fixture_vendor_document(): """Fixture for vendor document.""" return {'label_id': 1, 'account_type': 'vendor', 'account_name': 'Test Vendor'} @pytest.fixture def fixture_vendor_currency_codes_response(): """Fixture for vendor currency codes response.""" return {'currency_codes': ['USD', 'EUR', 'GBP']} @pytest.fixture def app_context(): """Flask app context fixture.""" with api.app.app_context(): yield @pytest.fixture( params=[ response.Response(message='enabled'), response.Response(message='disabled'), ] ) def feature_enabled_response(request): """Fixture for feature enabled/disabled responses.""" return request.param def fast_patch(monkeypatch, options): """Helper for monkeypatching. Args: monkeypatch (pytest.monkeypatch.monkeypatch): monkeypatch object options (dict): describing the module, attributes, return values Usage: fast_patch(monkeypatch, { module1: dict(attribute1=value1, attribute2=value2), module2: dict(attribute3=value3, attribute4=value4), }) """ from unittest.mock import MagicMock for module, attributes in options.items(): for attribute, fixture in attributes.items(): monkeypatch.setattr(module, attribute, MagicMock(return_value=fixture))