from typing import Any, Coroutine import pytest import pytest_asyncio from fastapi.testclient import TestClient from sqlalchemy.sql import text from syrupy.assertion import SnapshotAssertion from delivery_metadata.api.app import app from delivery_metadata.clients.art_relations import get_track_artists from delivery_metadata.exceptions import NoArtistForTrack @pytest_asyncio.fixture async def create_track_artist_tables(test_client: TestClient) -> None: async with app.state.art_relations_connector.db_session( transaction=True, turn_off_foreign_key_checks=True ) as session: await session.execute(text("TRUNCATE TABLE track_artist")) await session.execute(text("TRUNCATE TABLE track")) await session.execute( text(""" INSERT INTO track_artist ( id, track_id, type, name, artist_info_id ) VALUES ( :id, :track_id, :type, :name, :artist_info_id ) """), [ { "id": 10001, "track_id": 12345, "type": "performer", "name": "Very Big Star", "artist_info_id": 56789, }, { "id": 10004, "track_id": 12345, "type": "featuring", "name": "Smaller Star", "artist_info_id": 56788, }, { "id": 10006, "track_id": 12347, "type": "performer", "name": "Very Big Star", "artist_info_id": 56789, }, { "id": 1000678, "track_id": 12347, "type": "performer", "name": "Very Big Star 2", "artist_info_id": 56787, }, { "id": 10008, "track_id": 12348, "type": "producer", "name": "Big Time Producer", "artist_info_id": 56786, }, { "id": 100045, "track_id": 12348, "type": "performer", "name": "Very Big Star", "artist_info_id": 56789, }, { "id": 10009, "track_id": 12349, "type": "writer", "name": "Genius Writer", "artist_info_id": 56785, }, { "id": 1000333, "track_id": 12349, "type": "performer", "name": "Very Big Star", "artist_info_id": 56789, }, { "id": 100066, "track_id": 123410, "type": "performer", "name": "Very Big Star", "artist_info_id": 56789, }, { "id": 100067, "track_id": 123410, "type": "producer", "name": "Very Big Star", "artist_info_id": 567790, }, { "id": 10003, "track_id": 123410, "type": "remixer", "name": "Some European Remixer", "artist_info_id": 56784, }, { "id": 10005, "track_id": 12345, "type": "feature_to_primary", "name": "Smaller Star", "artist_info_id": 56783, }, { "id": 100010, "track_id": 123412, "type": "engineer", "name": "Stars Recording Co", "artist_info_id": 56782, }, { "id": 10001666, "track_id": 123412, "type": "performer", "name": "Very Big Star", "artist_info_id": 56789, }, { "id": 10001663, "track_id": 123412, "type": "featuring", "name": "Smaller Star", "artist_info_id": 56788, }, { "id": 100016342, "track_id": 123413, "type": "performer", "name": "Very Big Star", "artist_info_id": 56789, }, { "id": 100016234, "track_id": 123413, "type": "featuring", "name": "Smaller Star", "artist_info_id": 56788, }, { "id": 100016235, "track_id": 123413, "type": "remixer", "name": "", "artist_info_id": 56790, }, { "id": 100016236, "track_id": 123413, "type": "feature_to_primary", "name": "Missing featuring role", "artist_info_id": 567883, }, { "id": 100016237, "track_id": 123413, "type": "feature_to_primary", "name": "Double featured", "artist_info_id": 567884, }, { "id": 100016238, "track_id": 123413, "type": "feature_to_primary", "name": "Double featured", "artist_info_id": 567884, }, ], ) await session.execute( text(""" INSERT INTO track ( id, upc, isrc, cd, track_id, track_name, track_type ) VALUES ( :id, :upc, :isrc, :cd, :track_id, :track_name, :track_type ) """), [ { "id": 12345, "upc": 75679660923, "isrc": "USAT22403171", "cd": 1, "track_id": 1, "track_name": "Volume 1 Track 1", "track_type": "music", }, { "id": 12347, "upc": 75679660923, "isrc": "USAT22403172", "cd": 1, "track_id": 2, "track_name": "Volume 1 Track 2", "track_type": "music", }, { "id": 123410, "upc": 75679660923, "isrc": "USAT22403175", "cd": 1, "track_id": 3, "track_name": "Volume 1 Track 3", "track_type": "music", }, { "id": 12348, "upc": 75679660923, "isrc": "USAT22403173", "cd": 2, "track_id": 1, "track_name": "Volume 2 Track 1", "track_type": "music", }, { "id": 12349, "upc": 75679660923, "isrc": "USAT22403174", "cd": 2, "track_id": 2, "track_name": "Volume 2 Track 2", "track_type": "music", }, { "id": 123412, "upc": 75679660923, "isrc": "USAT22403176", "cd": 2, "track_id": 3, "track_name": "Volume 2 Track 3", "track_type": "music", }, { "id": 15678, "upc": 12345678, "isrc": "asdf12347", "cd": 1, "track_id": 3, "track_name": "Volume 1 Track 3", "track_type": "music", }, { "id": 14567, "upc": 12345678, "isrc": "asdf12349", "cd": 1, "track_id": 5, "track_name": "Volume 1 Track 5", "track_type": "music", }, { "id": 19876, "upc": 12345678, "isrc": "asdf123410", "cd": 1, "track_id": 6, "track_name": "Volume 1 Track 6", "track_type": "music", }, { "id": 19845, "upc": 123456799, "isrc": "asdf123411", "cd": 1, "track_id": 7, "track_name": "Volume 1 Track 7", "track_type": "music", }, { "id": 123413, "upc": 75679660923, "isrc": "USAT22403177", "cd": 1, "track_id": 4, "track_name": "Volume 1 Track 4", "track_type": "video", }, ], ) @pytest_asyncio.fixture async def create_missing_artist_track( test_client: TestClient, create_track_artist_tables: Coroutine[Any, Any, None] ) -> None: async with app.state.art_relations_connector.db_session( transaction=True, turn_off_foreign_key_checks=True ) as session: await session.execute(text("TRUNCATE TABLE track")) await session.execute( text(""" INSERT INTO track ( id, upc, isrc, cd, track_id, track_name, track_type ) VALUES ( :id, :upc, :isrc, :cd, :track_id, :track_name, :track_type ) """), [ { "id": 54321, "upc": 75679660924, "isrc": "USAT22403171", "cd": 1, "track_id": 1, "track_name": "Volume 1 Track 1", "track_type": "music", }, ], ) @pytest.mark.asyncio async def test_get_track_artists( create_track_artist_tables: Coroutine[Any, Any, None], snapshot: SnapshotAssertion, ) -> None: result = await get_track_artists(75679660923) assert result == snapshot @pytest.mark.asyncio async def test_get_track_no_artist( create_missing_artist_track: Coroutine[Any, Any, None], ) -> None: with pytest.raises(NoArtistForTrack): await get_track_artists(75679660924)