"""Common config for unit tests.""" import os from contextlib import contextmanager from unittest import mock from unittest.mock import MagicMock import pytest from neo4j.graph import Graph, Node # Disable ddtrace in unit tests to prevent unfinished span warnings os.environ['DD_TRACE_ENABLED'] = 'false' from permissions import api from permissions.types import ProfileInfo, Tenant, TenantType def get_session_mock(return_data=[]): """GET get a mock for db_session() which returns return_data list.""" enter_mock = MagicMock() session_mock = MagicMock() result_mock = MagicMock() session_mock.__enter__.return_value = enter_mock enter_mock.read_transaction.return_value = return_data enter_mock.write_transaction.return_value = return_data enter_mock.run.return_value = result_mock enter_mock.execute.return_value = result_mock result_mock.single.return_value = return_data and return_data[0] or None result_mock.fetchall.return_value = return_data result_mock.data.return_value = return_data result_mock.__iter__.return_value = return_data return session_mock def get_transactional_session_mock(side_effect=[]): """Mock for session.read_transaction().""" enter_mock = MagicMock() result_mock = MagicMock() result_mock.data.side_effect = side_effect result_mock.single.side_effect = side_effect transaction_mock = MagicMock() transaction_mock.run.return_value = result_mock enter_mock.begin_transaction.return_value = transaction_mock session_mock = MagicMock() session_mock.__enter__.return_value = enter_mock return session_mock @pytest.fixture def fixture_graph() -> Graph: """Return a reusable Graph.""" return Graph() @pytest.fixture def make_graph_node(fixture_graph): """Node generating factory as fixture to create Node objects.""" def _make_node(node_id, labels=(), data={}): data['id'] = node_id obj = Node(fixture_graph, node_id, node_id, labels, data) return obj return _make_node def graph_node(node_id, fixture_graph, labels=(), data={}): """Graph node maker for parameterized tests.""" data['id'] = node_id obj = Node(fixture_graph, node_id) obj._labels.update(labels) obj._update(data) return obj def mock_neo4j_db_session(): """Create a mock database session.""" mock_session = mock.Mock(query=mock.Mock(), close=mock.Mock()) @contextmanager def fake_session_manager(): yield mock_session mock_driver = mock.Mock(session=fake_session_manager) mock.patch('neo4j.GraphDatabase.driver', mock_driver).start() return mock_session @pytest.fixture def context(): """Create an api test client fixture.""" import application context_instance = application.app.app_context() return context_instance mock_neo4j_db_session() @pytest.fixture def fixture_client(): """Create an api test client fixture.""" return api.app.test_client() @pytest.fixture def app_context(): """Create an api test app fixture.""" with api.app.app_context(): yield @pytest.fixture def test_logic_tenants(): """Return a list of tenants data.""" return [ Tenant(tenant_uuid='abc-123', tenant_type=TenantType.ACCOUNT), Tenant(tenant_uuid='def-456', tenant_type=TenantType.SUBACCOUNT), Tenant(tenant_uuid='ghi-789', tenant_type=TenantType.COLLABORATOR), Tenant(tenant_uuid='jkl-012', tenant_type=TenantType.LABEL_PARTICIPANT), Tenant(tenant_uuid='mno-345', tenant_type=TenantType.ACCOUNT), Tenant(tenant_uuid='pqr-678', tenant_type=TenantType.SUBACCOUNT), Tenant(tenant_uuid='stu-901', tenant_type=TenantType.COLLABORATOR), Tenant(tenant_uuid='vwx-234', tenant_type=TenantType.LABEL_PARTICIPANT), ] @pytest.fixture def test_settings_profile(): """Return a test identity uuid.""" return ProfileInfo(profile_id=123, profile_type='SettingsProfile', uuid='user123', roles=[])