from typing import List import pytest from unittest.mock import AsyncMock from server.client.clients.apollo_api import ApolloApiClient from server.client.clients.vendor_api import VendorApiClient from server.utils.is_sony import check_tracks_is_sony def get_ids(*indexes, count: int = 5) -> List[str]: if not indexes: indexes = range(1, count + 1) return [f"tr_{i}" for i in indexes] def get_tracks(count: int = 3, missing_album: int = 2) -> List[dict]: return [ {"id": f"tr_{i}", **({} if missing_album == i else {"album": {"id": f"al_{i}"}})} for i in range(1, count + 1) ] def get_albums(count: int = 3, missing_upc: int = 2) -> List[dict]: return [ {"id": f"al_{i}", **({} if missing_upc == i else {"external_ids": {"upc": f"u_{i}"}})} for i in range(1, count + 1) ] def get_upcs(*indexes) -> List[str]: return [f"u_{i}" for i in indexes] @pytest.mark.parametrize( "id_list,track_list,album_list,upc_list,with_upc,expected_result,vendor_called,apollo_called", ( (get_ids(), get_tracks(), get_albums(), get_upcs(1, 3), False, get_ids(1, 3), 2, 1), (get_ids(), get_tracks(count=1, missing_album=1), [], [], False, [], 1, 0), (get_ids(), get_tracks(count=1), get_albums(count=1, missing_upc=1), [], False, [], 2, 0), (get_ids(), get_tracks(), get_albums(), get_upcs(1), False, get_ids(1), 2, 1), ([], [], [], [], False, [], 0, 0), (get_ids(), get_tracks(), get_albums(), get_upcs(1, 3), True, (get_ids(1, 3), {f"tr_{i}": f"u_{i}" for i in (1, 3)}), 2, 1) ), ) @pytest.mark.noapp async def test_check_tracks_is_sony( id_list, track_list, album_list, upc_list, with_upc, expected_result, vendor_called, apollo_called, mocker, session ): async def vendor_send(url: str, *args, **kwargs): if url == "api/spotify/v1/tracks": return {"tracks": track_list} return {"albums": album_list} vendor_mock = mocker.patch.object(VendorApiClient, "_send_request", side_effect=vendor_send) apollo_send = AsyncMock(return_value=upc_list) apollo_mock = mocker.patch.object(ApolloApiClient, "_send_request", side_effect=apollo_send) result = await check_tracks_is_sony(id_list, "_gl", with_upc=with_upc) assert result == expected_result assert vendor_mock.call_count == vendor_called assert apollo_mock.call_count == apollo_called