import copy from http import HTTPStatus import pytest from apollo_utils.core.constants.dsp import DSP from apollo_utils.core.utils.multikeysort import multikeysort from apollo_utils.core.utils.singleton import SingleValue from server.cache.base import get_cache from server.client.clients.dsp_api import DspApiClient from tests.api.playlists.v1.responses.generate_delphi_response import get_delphi_playlists_api_response from tests.api.playlists.v1.responses.get_expected_response import \ get_v3_playlists_dsp_by_track_history_expected_response response_copy = SingleValue() def set_response_copy_variable_global(f): async def wrapped(*args, **kwargs): global response_copy result = await f(*args, **kwargs) response_copy = copy.deepcopy(result) return result return wrapped @pytest.mark.parametrize( "dsp,params,status_code", ( ( DSP.SPOTIFY, {}, HTTPStatus.BAD_REQUEST ), ( DSP.SPOTIFY, {"market": "us"}, HTTPStatus.BAD_REQUEST ), ( DSP.SPOTIFY, {"isrc": "USSM12200609", "market": "us"}, HTTPStatus.OK ), ( DSP.APPLE, {"isrc": "USSM12200608", "market": "us"}, HTTPStatus.OK ), ( DSP.APPLE, {"isrc": "USSM12200608"}, HTTPStatus.OK ), ), ) async def test_get_v3_playlists_dsp_by_track_history( mocker, client, auth, dsp: DSP, params: dict, status_code: HTTPStatus ): await get_cache().clear() @set_response_copy_variable_global async def async_dsp_mock(url, *args, **kwargs): return get_delphi_playlists_api_response(url=url, items_count=10, **kwargs) mocker.patch.object(DspApiClient, "send_request", side_effect=async_dsp_mock) response = await client.get(f"/api/v3/playlists/{dsp.value}/by-track/history/", params=params, headers=auth) assert response.status == status_code if response.status == HTTPStatus.OK: order_by = ["removed_date", "id"] expected_response = get_v3_playlists_dsp_by_track_history_expected_response( dsp=dsp, items=response_copy["items"], isrc=params["isrc"], sort_by=order_by, limit=params.get("limit", 500)) response_json = await response.json() response_json["items"] = multikeysort(response_json["items"], order_by) assert response_json == expected_response