"""Tests for contributor projects Neo4j queries.""" from unittest.mock import MagicMock import pytest from contributor.queries.neo4j.projects import ( get_by_label_participant_uuid, get_contributors_by_project_ids, ) @pytest.fixture def label_participant_uuid(): return "550e8400-e29b-41d4-a716-446655440000" @pytest.fixture def projects_record(label_participant_uuid): record = MagicMock() record.__getitem__ = lambda self, key: { "contributor": {"uuid": label_participant_uuid}, "projects": [ {"project_id": 101}, {"project_id": 202}, ], }[key] record.get = lambda key, default=None: { "contributor": {"uuid": label_participant_uuid}, "projects": [ {"project_id": 101}, {"project_id": 202}, ], }.get(key, default) return record @pytest.fixture def session(projects_record): session = MagicMock() result = MagicMock() result.single.return_value = projects_record session.run.return_value = result return session @pytest.fixture def empty_session(): session = MagicMock() result = MagicMock() result.single.return_value = None session.run.return_value = result return session @pytest.fixture def no_projects_record(label_participant_uuid): record = MagicMock() record.__getitem__ = lambda self, key: { "contributor": {"uuid": label_participant_uuid}, "projects": [{"project_id": None}], }[key] record.get = lambda key, default=None: { "contributor": {"uuid": label_participant_uuid}, "projects": [{"project_id": None}], }.get(key, default) return record class TestGetByLabelParticipantUuid: def test_returns_projects(self, session, label_participant_uuid) -> None: result = get_by_label_participant_uuid( session, uuid=label_participant_uuid, profile_ids=[7123], ) assert result == { "contributor": {"uuid": label_participant_uuid}, "projects": [ {"project_id": 101}, {"project_id": 202}, ], } def test_returns_projects_as_admin(self, session, label_participant_uuid) -> None: result = get_by_label_participant_uuid( session, uuid=label_participant_uuid, profile_ids=[], is_admin=True, ) assert result is not None assert len(result["projects"]) == 2 def test_returns_none_when_not_found(self, empty_session) -> None: assert ( get_by_label_participant_uuid( empty_session, uuid="no-match", profile_ids=[7123] ) is None ) def test_filters_null_projects_from_optional_match( self, no_projects_record, label_participant_uuid ) -> None: session = MagicMock() result = MagicMock() result.single.return_value = no_projects_record session.run.return_value = result projects = get_by_label_participant_uuid( session, uuid=label_participant_uuid, profile_ids=[7123], ) assert projects is not None assert projects["projects"] == [] def test_returns_project_ids_from_query_output( self, label_participant_uuid ) -> None: record = MagicMock() record.__getitem__ = lambda self, key: { "contributor": {"uuid": label_participant_uuid}, "projects": [ {"project_id": 303}, ], }[key] session = MagicMock() result = MagicMock() result.single.return_value = record session.run.return_value = result projects = get_by_label_participant_uuid( session, uuid=label_participant_uuid, profile_ids=[7123], ) assert projects is not None assert projects["projects"] == [{"project_id": 303}] class TestGetContributorsByProjectIdsSingle: def test_returns_contributors(self) -> None: record = MagicMock() record.__getitem__ = lambda self, key: { "project_id": 101, "contributors": [ { "lp": { "id": 42, "uuid": "550e8400-e29b-41d4-a716-446655440000", "name": "Test Artist", "spotifyId": "3TVXtAsR1Inumwj472S9r4", "appleMusicId": None, "spotifyArtistKey": None, "isni": None, "vendorId": 100, "subaccountId": None, "vendorUUID": "aaaa0000-bbbb-4ccc-8ddd-eeeeeeeeeeee", "subaccountUUID": None, "companyBrandUUID": "11110000-2222-4333-8444-555555555555", "parentCompanyUUID": "66660000-7777-4888-8999-aaaaaaaaaaaa", }, "artist_info_ids": [123, 456], "gp": { "id": "b1a2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d", "name": "Test Artist Global", "spotifyId": "4iV5W9uYEdYUVa79Axb7Rh", "appleMusicId": "1234567890", "chartmetricId": "987654", "imageUrl": "https://example.com/artists/test-artist.jpg", }, "label": { "uuid": "cccc0000-dddd-4eee-8fff-aaaaaaaaaaaa", "vendorId": 100, "subaccountId": 0, }, }, { "lp": { "id": 84, "uuid": "123e4567-e89b-41d4-a456-426614174000", "name": "Second Artist", "spotifyId": None, "appleMusicId": None, "spotifyArtistKey": None, "isni": None, "vendorId": 100, "subaccountId": 9, "vendorUUID": "aaaa0000-bbbb-4ccc-8ddd-eeeeeeeeeeee", "subaccountUUID": "77770000-8888-4999-8aaa-bbbbbbbbbbbb", "companyBrandUUID": None, "parentCompanyUUID": None, }, "artist_info_ids": [], "gp": None, "label": { "uuid": "dddd1111-eeee-4fff-8000-bbbbbbbbbbbb", "ownerVendorId": 100, "subaccountId": 9, }, }, ], }[key] session = MagicMock() result = MagicMock() result.__iter__ = lambda self: iter([record]) session.run.return_value = result contributors = get_contributors_by_project_ids( session, project_ids=[101], profile_ids=[7123], ) assert contributors == [ { "project": {"project_id": 101}, "contributors": [ { "id": 42, "uuid": "550e8400-e29b-41d4-a716-446655440000", "name": "Test Artist", "spotify_id": "3TVXtAsR1Inumwj472S9r4", "apple_music_id": None, "spotify_artist_key": None, "isni": None, "company_brand_uuid": "11110000-2222-4333-8444-555555555555", "parent_company_uuid": "66660000-7777-4888-8999-aaaaaaaaaaaa", "artist_info_ids": [123, 456], "global_participant": { "id": "b1a2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d", }, "label": { "uuid": "cccc0000-dddd-4eee-8fff-aaaaaaaaaaaa", "vendor_id": 100, "subaccount_id": 0, }, }, { "id": 84, "uuid": "123e4567-e89b-41d4-a456-426614174000", "name": "Second Artist", "spotify_id": None, "apple_music_id": None, "spotify_artist_key": None, "isni": None, "company_brand_uuid": None, "parent_company_uuid": None, "artist_info_ids": [], "global_participant": None, "label": { "uuid": "dddd1111-eeee-4fff-8000-bbbbbbbbbbbb", "vendor_id": 100, "subaccount_id": 9, }, }, ], } ] def test_filters_null_contributors(self) -> None: record = MagicMock() record.__getitem__ = lambda self, key: { "project_id": 101, "contributors": [ None, {"lp": None, "artist_info_ids": [], "gp": None, "label": None}, ], }[key] session = MagicMock() result = MagicMock() result.__iter__ = lambda self: iter([record]) session.run.return_value = result contributors = get_contributors_by_project_ids( session, project_ids=[101], profile_ids=[7123], ) assert contributors == [{"project": {"project_id": 101}, "contributors": []}] def test_returns_empty_list_when_project_not_found(self) -> None: session = MagicMock() result = MagicMock() result.__iter__ = lambda self: iter([]) session.run.return_value = result projects = get_contributors_by_project_ids( session, project_ids=[999], profile_ids=[7123], ) assert projects == [] class TestGetContributorsByProjectIds: def test_returns_multiple_projects(self) -> None: record1 = MagicMock() record1.__getitem__ = lambda self, key: { "project_id": 101, "contributors": [ { "lp": { "id": 42, "uuid": "550e8400-e29b-41d4-a716-446655440000", "name": "Test Artist", "spotifyId": "3TVXtAsR1Inumwj472S9r4", "appleMusicId": None, "spotifyArtistKey": None, "isni": None, "vendorId": 100, "subaccountId": None, "vendorUUID": "aaaa0000-bbbb-4ccc-8ddd-eeeeeeeeeeee", "subaccountUUID": None, "companyBrandUUID": "11110000-2222-4333-8444-555555555555", "parentCompanyUUID": "66660000-7777-4888-8999-aaaaaaaaaaaa", }, "artist_info_ids": [123], "gp": None, "label": { "uuid": "cccc0000-dddd-4eee-8fff-aaaaaaaaaaaa", "vendorId": 100, "subaccountId": 0, }, } ], }[key] record2 = MagicMock() record2.__getitem__ = lambda self, key: { "project_id": 202, "contributors": [ { "lp": { "id": 84, "uuid": "123e4567-e89b-41d4-a456-426614174000", "name": "Second Artist", "spotifyId": None, "appleMusicId": None, "spotifyArtistKey": None, "isni": None, "vendorId": 100, "subaccountId": 0, "vendorUUID": "aaaa0000-bbbb-4ccc-8ddd-eeeeeeeeeeee", "subaccountUUID": None, "companyBrandUUID": None, "parentCompanyUUID": None, }, "artist_info_ids": [], "gp": None, "label": { "uuid": "dddd1111-eeee-4fff-8000-bbbbbbbbbbbb", "vendorId": 100, "subaccountId": 0, }, } ], }[key] session = MagicMock() result = MagicMock() result.__iter__ = lambda self: iter([record1, record2]) session.run.return_value = result projects = get_contributors_by_project_ids( session, project_ids=[101, 202], profile_ids=[7123], ) assert len(projects) == 2 assert projects[0]["project"] == {"project_id": 101} assert len(projects[0]["contributors"]) == 1 assert projects[1]["project"] == {"project_id": 202} assert len(projects[1]["contributors"]) == 1 def test_returns_empty_list_when_none_found(self) -> None: session = MagicMock() result = MagicMock() result.__iter__ = lambda self: iter([]) session.run.return_value = result projects = get_contributors_by_project_ids( session, project_ids=[999], profile_ids=[7123], ) assert projects == [] def test_filters_null_contributors_in_bulk(self) -> None: record = MagicMock() record.__getitem__ = lambda self, key: { "project_id": 101, "contributors": [ None, {"lp": None, "artist_info_ids": [], "gp": None, "label": None}, ], }[key] session = MagicMock() result = MagicMock() result.__iter__ = lambda self: iter([record]) session.run.return_value = result projects = get_contributors_by_project_ids( session, project_ids=[101], profile_ids=[7123], ) assert len(projects) == 1 assert projects[0]["project"] == {"project_id": 101} assert projects[0]["contributors"] == []