from http import HTTPStatus from typing import Any import pytest from pytest_mock import MockerFixture from server.client.clients.apollo_api import ApolloApiClient from server.client.clients.dsp_api import DspApiClient from server.client.clients.vendor_api import VendorApiClient from tests.api.playlists.v0.responses.previous import get_random_list_int_track_ids, \ PlaylistsApplePreviousTopResponseFabricator @pytest.mark.parametrize( "params,dsp", ( ({"tracks": get_random_list_int_track_ids(5)}, "apple"), ({"tracks": get_random_list_int_track_ids(5)}, "spotify"), ), ) async def test_get_playlists_apple_previous_top( params: dict[str, Any], dsp: str, mocker: MockerFixture, auth: dict, client ): # We need all further steps to generate expected and dependant responses fake_responses = PlaylistsApplePreviousTopResponseFabricator() fake_tracks = fake_responses.get_tracks(params["tracks"]) fake_tracks_response = {track["id"]: track for track in fake_tracks} fake_tracks_isrc = {track["isrc"]: track["id"] for track in fake_tracks} fake_tracks_first_stream_dates = fake_responses.get_tracks_first_stream_dates(fake_tracks_isrc.keys()) fake_playlists_top_weekly = fake_responses.get_fake_playlists() fake_playlists_ids = [pl["playlist_id"] for pl in fake_playlists_top_weekly] fake_previous_top_dates, pl_ids = fake_responses.get_fake_previous_top_dates( fake_playlists_ids, list(fake_tracks_isrc.keys()) ) fake_previous_streams_weekly = fake_responses.get_fake_playlist_streams_weekly(pl_ids) fake_latest_streams_date = fake_responses.get_fake_latest_date(dsp) fake_playlist_images = fake_responses.get_fake_images(pl_ids) if dsp == "apple" else \ fake_responses.get_spotify_playlist_images(pl_ids) tracks_mapped, track_first_dates, playlists_top_weekly, history_data, streams_data, playlist_images_data = \ fake_responses.get_deepcopy( fake_tracks_response, fake_tracks_first_stream_dates, fake_playlists_top_weekly, fake_previous_top_dates, fake_previous_streams_weekly, fake_playlist_images ) response_to_check = fake_responses.get_fake_response_to_check( dsp, tracks_mapped, track_first_dates, playlists_top_weekly, history_data, streams_data, playlist_images_data ) async def apollo_send(url: str, *args, **kwargs): if url == "api/tracks/": return fake_tracks_response elif url == f"api/playlists/{dsp}/previous/top/dates/": return fake_previous_top_dates return async def dsp_send(url: str, *args, **kwargs): if url == "api/consumer_analytics/tracks-first-stream-dates": return fake_tracks_first_stream_dates elif url == "api/delphi/data-health/completeness": return fake_latest_streams_date elif url == "api/delphi/public/playlists": return {"items": fake_playlists_top_weekly} elif url == "api/delphi/streams": return fake_previous_streams_weekly async def vendor_send(url: str, *args, **kwargs): if url == f"api/{dsp}/v1/playlists-images": return fake_playlist_images apollo_send_mock = mocker.patch.object(ApolloApiClient, "_send_request", side_effect=apollo_send) dsp_send_mock = mocker.patch.object(DspApiClient, "_send_request", side_effect=dsp_send) vendor_send_mock = mocker.patch.object(VendorApiClient, "_send_request", side_effect=vendor_send) response = await client.get(f"/api/playlists/{dsp}/previous/top/", headers=auth, params=params) assert response.status == HTTPStatus.OK, response.text response = await response.json() assert apollo_send_mock.call_count == 2 assert dsp_send_mock.call_count == 4 if dsp == "apple": assert vendor_send_mock.call_count == 1 assert response == response_to_check