"""Tracks router tests.""" import pytest from fastapi.testclient import TestClient from pytest_mock import MockerFixture @pytest.fixture def track_participations() -> dict: return { "track": {"tuid": 101}, "participations": [ { "contributor": {"uuid": "550e8400-e29b-41d4-a716-446655440000"}, "participated_as": "performer", "track": {"tuid": 101}, "track_artist_id": 1001, }, { "contributor": {"uuid": "aaaaaaaa-bbbb-4ccc-8ddd-eeeeeeeeeeee"}, "participated_as": "featuring", "track": {"tuid": 101}, "track_artist_id": 1002, }, ], "display_artists": [ { "contributor": {"uuid": "11111111-2222-4333-8444-555555555555"}, "role": "primary", }, { "contributor": {"uuid": "66666666-7777-4888-8999-aaaaaaaaaaaa"}, "role": "featuring", }, ], } class TestLoadTrackParticipations: def test_returns_track_participations( self, mocker: MockerFixture, test_client: TestClient, track_participations: dict, ) -> None: mock = mocker.patch( "contributor.api.routers.tracks.track_logic.get_track_participations_by_track_ids", return_value=[track_participations], ) response = test_client.post( "/tracks/dataloader", json={"tracks": [{"tuid": 101}]} ) mock.assert_called_once_with( mocker.ANY, track_ids=[101], profiles=mocker.ANY, ) assert response.status_code == 200 assert response.json() == [track_participations] @pytest.fixture def single_track_participations() -> dict: return { "track": {"tuid": 101}, "participations": [ { "contributor": {"uuid": "550e8400-e29b-41d4-a716-446655440000"}, "participated_as": "performer", "track": {"tuid": 101}, "track_artist_id": 1001, } ], "display_artists": [ { "contributor": {"uuid": "11111111-2222-4333-8444-555555555555"}, "role": "primary", } ], } class TestGetTrackParticipationsForTrack: def test_returns_track_participations( self, mocker: MockerFixture, test_client: TestClient, single_track_participations: dict, ) -> None: mock = mocker.patch( "contributor.api.routers.tracks.track_logic.get_track_participations_for_track", return_value=single_track_participations, ) response = test_client.get("/tracks/101") mock.assert_called_once_with( mocker.ANY, track_id=101, profiles=mocker.ANY, ) assert response.status_code == 200 assert response.json() == single_track_participations def test_returns_404_when_track_not_found( self, mocker: MockerFixture, test_client: TestClient, ) -> None: mocker.patch( "contributor.api.routers.tracks.track_logic.get_track_participations_for_track", return_value=None, ) response = test_client.get("/tracks/101") assert response.status_code == 404 def test_returns_multiple_track_participations( self, mocker: MockerFixture, test_client: TestClient, track_participations: dict, ) -> None: second_track = { "track": {"tuid": 202}, "participations": [ { "contributor": {"uuid": "bbbbbbbb-cccc-41dd-8fff-ffffffffffff"}, "participated_as": "remixer", "track": {"tuid": 202}, "track_artist_id": 2001, } ], "display_artists": [], } mocker.patch( "contributor.api.routers.tracks.track_logic.get_track_participations_by_track_ids", return_value=[track_participations, second_track], ) response = test_client.post( "/tracks/dataloader", json={"tracks": [{"tuid": 101}, {"tuid": 202}]}, ) assert response.status_code == 200 assert response.json() == [track_participations, second_track] def test_returns_empty_list_when_none_found( self, mocker: MockerFixture, test_client: TestClient, ) -> None: mocker.patch( "contributor.api.routers.tracks.track_logic.get_track_participations_by_track_ids", return_value=[], ) response = test_client.post( "/tracks/dataloader", json={"tracks": [{"tuid": 999}]}, ) assert response.status_code == 200 assert response.json() == []