"""Tests for participation role Neo4j queries.""" from unittest.mock import MagicMock from uuid import UUID import pytest from pytest_mock import MockerFixture from contributor.queries.neo4j.participation_roles import ( get_participation_role_by_uuid, get_participation_role_categories, get_participation_roles_by_category_uuid, get_participation_roles_by_category_uuids, get_role_by_uuid, get_role_categories, get_roles_by_category_uuid, get_roles_by_category_uuids, ) def test_get_role_categories_returns_category_objects() -> None: record_one = MagicMock() record_one.__getitem__ = lambda self, key: { "category": { "uuid": "550e8400-e29b-41d4-a716-446655440000", "name": "Original Artist", } }[key] record_two = MagicMock() record_two.__getitem__ = lambda self, key: { "category": { "uuid": "aaaaaaaa-bbbb-4ccc-8ddd-eeeeeeeeeeee", "name": "Other Label Personnel", } }[key] session = MagicMock() result = MagicMock() result.__iter__ = lambda self: iter([record_one, record_two]) session.run.return_value = result categories = get_role_categories(session) session.run.assert_called_once_with(query=get_participation_role_categories) assert categories == [ { "uuid": "550e8400-e29b-41d4-a716-446655440000", "name": "Original Artist", }, { "uuid": "aaaaaaaa-bbbb-4ccc-8ddd-eeeeeeeeeeee", "name": "Other Label Personnel", }, ] def test_get_role_categories_returns_empty_list_when_no_results() -> None: session = MagicMock() result = MagicMock() result.__iter__ = lambda self: iter([]) session.run.return_value = result categories = get_role_categories(session) session.run.assert_called_once_with(query=get_participation_role_categories) assert categories == [] @pytest.fixture def role_uuid() -> UUID: return UUID("1f8c7569-5a91-4c67-afd4-14b736afd4a8") @pytest.fixture def role_data() -> dict: return { "uuid": "1f8c7569-5a91-4c67-afd4-14b736afd4a8", "apple_role_name": "Composer", "category": { "uuid": "550e8400-e29b-41d4-a716-446655440000", "name": "Songwriter", }, "ddex_role_name": "Composer", "name": "Composer", } def test_get_role_by_uuid_returns_role_dict( mocker: MockerFixture, role_uuid: UUID, role_data: dict, ) -> None: record = MagicMock() record.__getitem__ = lambda self, key: role_data if key == "role" else None session = MagicMock() result = MagicMock() result.single.return_value = record session.run.return_value = result role = get_role_by_uuid(session, role_uuid) session.run.assert_called_once_with( query=get_participation_role_by_uuid, parameters={"uuid": str(role_uuid)}, ) assert role == role_data def test_get_role_by_uuid_returns_none_when_not_found( mocker: MockerFixture, role_uuid: UUID, ) -> None: session = MagicMock() result = MagicMock() result.single.return_value = None session.run.return_value = result role = get_role_by_uuid(session, role_uuid) assert role is None def test_get_roles_by_category_uuid_returns_role_dicts( mocker: MockerFixture, role_uuid: UUID, role_data: dict, ) -> None: second_role = { "uuid": "2bb43e8f-ae65-47fc-b590-c510172ecbee", "apple_role_name": "Lyricist", "category": role_data["category"], "ddex_role_name": "Lyricist", "name": "Lyricist", } record_one = MagicMock() record_one.__getitem__ = lambda self, key: role_data if key == "role" else None record_two = MagicMock() record_two.__getitem__ = lambda self, key: second_role if key == "role" else None session = MagicMock() result = MagicMock() result.__iter__ = lambda self: iter([record_one, record_two]) session.run.return_value = result roles = get_roles_by_category_uuid(session, role_uuid) session.run.assert_called_once_with( query=get_participation_roles_by_category_uuid, parameters={"uuid": str(role_uuid)}, ) assert roles == [role_data, second_role] def test_get_roles_by_category_uuid_returns_empty_list_when_not_found( mocker: MockerFixture, role_uuid: UUID, ) -> None: session = MagicMock() result = MagicMock() result.__iter__ = lambda self: iter([]) session.run.return_value = result roles = get_roles_by_category_uuid(session, role_uuid) assert roles == [] def test_get_roles_by_category_uuids_returns_category_roles( mocker: MockerFixture, role_uuid: UUID, role_data: dict, ) -> None: second_role = { "uuid": "2bb43e8f-ae65-47fc-b590-c510172ecbee", "apple_role_name": "Lyricist", "category": role_data["category"], "ddex_role_name": "Lyricist", "name": "Lyricist", } second_category_uuid = "aaaaaaaa-bbbb-4ccc-8ddd-eeeeeeeeeeee" record_one = MagicMock() record_one.__getitem__ = lambda self, key: { "category_roles": { "category_uuid": str(role_uuid), "roles": [role_data, second_role], } }[key] record_two = MagicMock() record_two.__getitem__ = lambda self, key: { "category_roles": { "category_uuid": second_category_uuid, "roles": [], } }[key] session = MagicMock() result = MagicMock() result.__iter__ = lambda self: iter([record_one, record_two]) session.run.return_value = result results = get_roles_by_category_uuids( session, [str(role_uuid), second_category_uuid] ) session.run.assert_called_once_with( query=get_participation_roles_by_category_uuids, parameters={"uuids": [str(role_uuid), second_category_uuid]}, ) assert results == [ { "category_uuid": str(role_uuid), "roles": [role_data, second_role], }, { "category_uuid": second_category_uuid, "roles": [], }, ] def test_get_roles_by_category_uuids_returns_empty_list_when_no_results() -> None: session = MagicMock() result = MagicMock() result.__iter__ = lambda self: iter([]) session.run.return_value = result results = get_roles_by_category_uuids(session, []) assert results == []