from random import randint from http import HTTPStatus as http_status from typing import Iterable, Callable import pytest from server.client.clients.apollo_api import ApolloApiClient from server.client.clients.vendor_api import VendorApiClient from tests.api.isrc.helpers import main_track_isrc, create_random_list_str, related_track_isrc, track_id @pytest.mark.parametrize( "market", ( "us", None, ), ) async def test_isrc_relation_get(auth, client, mocker, market): def isrc_to_id_relation_dict_from(isrc_data: Iterable, f_value_to_create: Callable, f_key_to_expand: Callable): length = len(isrc_data) apollo_isrc_to_id = {k: f_value_to_create(i) for k, i in zip(isrc_data, range(length + 1))} spotify_isrc_to_id = [{"id": f_value_to_create(i), "external_ids": {"isrc": f_key_to_expand(i)}} for i in range(0, length + randint(1, 4))] apple_isrc_to_id = {} return apollo_isrc_to_id, spotify_isrc_to_id, apple_isrc_to_id apollo_v1_isrc_relation_response = \ {main_track_isrc(i).upper(): create_random_list_str(related_track_isrc, 4) for i in range(randint(3, 6))} apollo_isrc_to_track_id, spotify_isrc_to_track_id, apple_isrc_to_track_id = \ isrc_to_id_relation_dict_from(apollo_v1_isrc_relation_response.keys(), track_id, main_track_isrc) isrc_to_id = {} if not market: expected_response = [{"main": {"isrc": k, "track_id": isrc_to_id.get(k)}, "related": v} for k, v in apollo_v1_isrc_relation_response.items()] else: isrc_set = set(apollo_v1_isrc_relation_response) results = {key.upper(): value for key, value in apollo_isrc_to_track_id.items()} spotify_id_data = { t["external_ids"]["isrc"].upper(): t["id"] for t in spotify_isrc_to_track_id if t["external_ids"]["isrc"] and t["id"] } results.update(spotify_id_data) apple_isrc_data = { t["external_ids"]["isrc"].upper(): t["id"] for t in apple_isrc_to_track_id.get("data", {}) if t["external_ids"]["isrc"] and t["id"] } results.update(apple_isrc_data) results_isrc_set = set(results.keys()) for isrc in isrc_set: if isrc not in results_isrc_set: upper_isrc = isrc.upper() if upper_isrc in results_isrc_set: results[isrc] = results.pop(upper_isrc) expected_response = [{"main": {"isrc": k, "track_id": results.get(k)}, "related": v} for k, v in apollo_v1_isrc_relation_response.items()] async def vendor_send(url: str, *args, **kwargs): if url == "api/spotify/v1/tracks": return {"tracks": spotify_isrc_to_track_id} if url == "api/apple/v1/tracks": return {"data": []} async def apollo_send(url: str, *args, **kwargs): if url == "api/v1/isrc-relation/": return apollo_v1_isrc_relation_response if url == "api/isrc-to-id-relation/": return apollo_isrc_to_track_id if url == "api/check-market/": return True mocker.patch.object(ApolloApiClient, "_send_request", side_effect=apollo_send) mocker.patch.object(VendorApiClient, "_send_request", side_effect=vendor_send) params = {"market": market} if market else {} response = await client.get("/api/isrc-relation/", params=params, headers=auth) assert response.status == http_status.OK response_json = await response.json() assert response_json == expected_response @pytest.mark.parametrize( ("market", "isrc"), ( (None, main_track_isrc(0)), ), ) async def test_isrc_relation_by_isrc(auth, client, mocker, market, isrc): isrc_to_id = {} apollo_v1_isrc_relation_response = {f"{isrc}": [related_track_isrc(i) for i in range(randint(1, 4))]} async def apollo_send(url: str, *args, **kwargs): if url == f"api/v1/isrc-relation/{isrc}": return apollo_v1_isrc_relation_response expected_response = [{"main": {"isrc": None, "track_id": None}, "related": None}] if not market: expected_response = [{"main": {"isrc": k, "track_id": isrc_to_id.get(k)}, "related": v} for k, v in apollo_v1_isrc_relation_response.items()][0] mocker.patch.object(ApolloApiClient, "_send_request", side_effect=apollo_send) params = {"market": market} if market else {} response = await client.get(f"/api/isrc-relation/{isrc}", params=params, headers=auth) assert response.status == http_status.OK response_json = await response.json() assert response_json == expected_response