import pytest from copy import deepcopy from server.artist.models import ( ArtistSpotifyTracks, ArtistSpotifyAlbums, ArtistTiktokVideos, ArtistYoutubeVideos, ArtistSoundCloudTracks, ArtistExternalLinks, ArtistSearchData, ) from tests.constants import ( ARTIST_SEARCH_EXPECTED_RETURN_DATA_FOLLOWERS_VIEWS_CHARTS, ARTIST_SEARCH_EXPECTED_RETURN_DATA_LIKES_SUBSCRIBES_POPULARITY_COMMENTS_CHARTS, ARTIST_SEARCH_QUERY_BODY_FOLLOWERS_VIEWS_FOLLOWERS_FOLLOWERS, ARTIST_SEARCH_EXPECTED_RETURN_DATA_TIKTOK, ARTIST_SEARCH_EXPECTED_RETURN_DATA_YOUTUBE, ARTIST_SEARCH_EXPECTED_RETURN_DATA_SPOTIFY, ARTIST_SEARCH_EXPECTED_RETURN_DATA_SOUNDCLOUD, ARTIST_1110120_SEARCH_RESULT_EXPECTED_DATA, ARTIST_CHART_TYPE_MAPPER, TIKTOK_SEARCH_BODY, YOUTUBE_SEARCH_BODY, SPOTIFY_SEARCH_BODY, SOUNDCLOD_SEARCH_BODY, ARTIST_SEARCH_BY_NAME_BODY, ARTIST_SEARCH_BY_NAME_BODY_FULL_MATCH, ARTIST_SEARCH_BY_NAME_BODY_NON_EXIST_NAME, ARTIST_SEARCH_BY_NAME_BODY_UNKNOWN_FIELD, ARTIST_SEARCH_1110120_738253_FILTERED, ARTIST_SEARCH_1141830_FILTERED, ARTIST_SEARCH_1110120_FILTERED, ARTIST_SEARCH_1141830_738253_FILTERED, ARTIST_SEARCH_738253_FILTERED, ARTIST_SEARCH_1551_1110120_738253_FILTERED, ARTIST_SEARCH_ALL_FILTERED, ARTIST_SEARCH_TIKTOK_FILTERED, SEARCH_BY_NAME_BODY_LONG_NAME_VALUE, SEARCH_ES_DATA_TO_INSERT, SEARCH_PG_DATA_TO_INSERT, ARTISTS_93560_SPOTIFY_TRACKS_DATA_TO_INSERT, ARTIST_93560_SPOTIFY_TRACKS_EXPECTED_DATA, ARTIST_168960_SPOTIFY_ALBUMS_DATA_TO_INSERT, ARTIST_168960_SPOTIFY_ALBUMS_EXPECTED_DATA, ARTIST_3340920_VIDEOS_TIKTOK_DATA_TO_INSERT, ARTIST_3340920_VIDEOS_TIKTOK_EXPECTED_DATA, ARTIST_424290_VIDEOS_YOUTUBE_DATA_TO_INSERT, ARTIST_424290_VIDEOS_YOUTUBE_EXPECTED_DATA, ARTIST_52710_TRACKS_SOUNDCLOUD_DATA_TO_INSERT, ARTIST_52710_TRACKS_SOUNDCLOUD_EXPECTED_DATA, ARTIST_169620_EXTERNAL_LINKS_DATA_TO_INSERT, ARTIST_169620_EXTERNAL_LINKS_EXPECTED_DATA, ARTIST_SEARCH_BY_NAME_EXPECTED_DATA, ARTIST_SEARCH_BY_NAME_EXPECTED_DATA_FULL_MATCH, UNKNOWN_FIELDS_EXPECTED_DATA, NAME_LENGTH_ERROR_EXPECTED_DATA, HEADER_GROUP, STREAMING_SERVICES_GROUP, SOCIAL_MEDIA_GROUP, ARTIST_GENRES_SEARCH_BODY, ARTIST_COUNTRIES_SEARCH_BODY, ARTIST_GENRES_COUNTRIES_SEARCH_BODY, ARTIST_SEARCH_EXPECTED_RETURN_DATA_GENRES, ARTIST_SEARCH_EXPECTED_RETURN_DATA_COUNTRIES, ARTIST_SEARCH_EXPECTED_RETURN_DATA_GENRES_COUNTRIES, ) ARTIST_SEARCH_QUERY_BODY_LIKES_SUBSCRIBES_POPULARITY_COMMENTS = deepcopy( ARTIST_SEARCH_QUERY_BODY_FOLLOWERS_VIEWS_FOLLOWERS_FOLLOWERS ) ARTIST_SEARCH_QUERY_BODY_LIKES_SUBSCRIBES_POPULARITY_COMMENTS["tiktok"]["chart_type"] = "LIKES" ARTIST_SEARCH_QUERY_BODY_LIKES_SUBSCRIBES_POPULARITY_COMMENTS["youtube"]["chart_type"] = "SUBSCRIBERS" ARTIST_SEARCH_QUERY_BODY_LIKES_SUBSCRIBES_POPULARITY_COMMENTS["spotify"]["chart_type"] = "POPULARITY" ARTIST_SEARCH_QUERY_BODY_LIKES_SUBSCRIBES_POPULARITY_COMMENTS["soundcloud"]["chart_type"] = "COMMENTS" ARTIST_SEARCH_QUERY_BODY_FOLLOWERS_VIEWS_FOLLOWERS_FOLLOWERS_COUNT = deepcopy( ARTIST_SEARCH_QUERY_BODY_FOLLOWERS_VIEWS_FOLLOWERS_FOLLOWERS ) ARTIST_SEARCH_QUERY_BODY_FOLLOWERS_VIEWS_FOLLOWERS_FOLLOWERS_COUNT.pop("limit") ARTIST_SEARCH_QUERY_BODY_FOLLOWERS_VIEWS_FOLLOWERS_FOLLOWERS_COUNT.pop("offset") class TestArtist: @pytest.mark.parametrize( "expected_return_data, query_body, elastic_client, aggregates_postgres_client", [ ( ARTIST_SEARCH_EXPECTED_RETURN_DATA_FOLLOWERS_VIEWS_CHARTS, ARTIST_SEARCH_QUERY_BODY_FOLLOWERS_VIEWS_FOLLOWERS_FOLLOWERS, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( ARTIST_SEARCH_EXPECTED_RETURN_DATA_LIKES_SUBSCRIBES_POPULARITY_COMMENTS_CHARTS, ARTIST_SEARCH_QUERY_BODY_LIKES_SUBSCRIBES_POPULARITY_COMMENTS, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( ARTIST_SEARCH_EXPECTED_RETURN_DATA_TIKTOK, TIKTOK_SEARCH_BODY, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( ARTIST_SEARCH_EXPECTED_RETURN_DATA_YOUTUBE, YOUTUBE_SEARCH_BODY, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( ARTIST_SEARCH_EXPECTED_RETURN_DATA_SPOTIFY, SPOTIFY_SEARCH_BODY, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( ARTIST_SEARCH_EXPECTED_RETURN_DATA_SOUNDCLOUD, SOUNDCLOD_SEARCH_BODY, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( ARTIST_SEARCH_EXPECTED_RETURN_DATA_GENRES, ARTIST_GENRES_SEARCH_BODY, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( ARTIST_SEARCH_EXPECTED_RETURN_DATA_COUNTRIES, ARTIST_COUNTRIES_SEARCH_BODY, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( ARTIST_SEARCH_EXPECTED_RETURN_DATA_GENRES_COUNTRIES, ARTIST_GENRES_COUNTRIES_SEARCH_BODY, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ], indirect=["elastic_client", "aggregates_postgres_client"], ) async def test_discovery( self, expected_return_data, query_body, elastic_client, aggregates_postgres_client, app_client, auth_header ): response = await app_client.post("/api/artist/discovery", headers=auth_header, json=query_body) response = await response.json() assert response == expected_return_data @pytest.mark.parametrize( "url, query_body, expected_status, expected_return_data, elastic_client, aggregates_postgres_client", [ ( "/api/artist/discovery", {"tiktok": {"min_followers": 100}}, 200, ARTIST_SEARCH_1110120_738253_FILTERED, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery", {"tiktok": {"max_followers": 100}}, 200, ARTIST_SEARCH_1141830_FILTERED, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery", {"tiktok": {"min_videos": 100}}, 200, ARTIST_SEARCH_1110120_FILTERED, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery", {"tiktok": {"max_videos": 10}}, 200, ARTIST_SEARCH_1141830_FILTERED, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery", {"tiktok": {"min_avg_duration": 30}}, 200, ARTIST_SEARCH_1141830_738253_FILTERED, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery", {"tiktok": {"max_avg_duration": 45}}, 200, ARTIST_SEARCH_1110120_738253_FILTERED, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery", {"tiktok": {"min_mentions": 30}}, 200, ARTIST_SEARCH_1110120_738253_FILTERED, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery", {"tiktok": {"max_mentions": 30}}, 200, ARTIST_SEARCH_1141830_FILTERED, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery", {"tiktok": {"min_likes": 1000}}, 200, ARTIST_SEARCH_1110120_738253_FILTERED, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery", {"tiktok": {"max_likes": 100000}}, 200, ARTIST_SEARCH_1141830_FILTERED, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery", {"tiktok": {"max_followers": 100, "max_videos": 10}}, 200, ARTIST_SEARCH_1141830_FILTERED, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery", {"youtube": {"min_views": 5000000, "max_views": 100000000, "chart_type": "SUBSCRIBERS"}}, 200, ARTIST_SEARCH_1110120_738253_FILTERED, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery", {"spotify": {"min_listeners": 500000}}, 200, ARTIST_SEARCH_738253_FILTERED, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery", {"spotify": {"min_popularity": 40, "max_popularity": 80}}, 200, ARTIST_SEARCH_738253_FILTERED, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery", {"soundcloud": {"max_followers": 100000}}, 200, ARTIST_SEARCH_1551_1110120_738253_FILTERED, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery", { "tiktok": {"min_videos": 10}, "soundcloud": {"min_followers": 1000}, "spotify": {"min_popularity": 20}, }, 200, ARTIST_SEARCH_1110120_738253_FILTERED, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery", {}, 200, ARTIST_SEARCH_ALL_FILTERED, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery", {"tiktok": {}}, 200, ARTIST_SEARCH_TIKTOK_FILTERED, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery/total_count", {"tiktok": {"min_followers": 100}}, 200, {"total_count": len(ARTIST_SEARCH_1110120_738253_FILTERED)}, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery/total_count", {"tiktok": {"max_followers": 100}}, 200, {"total_count": len(ARTIST_SEARCH_1141830_FILTERED)}, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery/total_count", {"tiktok": {"min_videos": 100}}, 200, {"total_count": len(ARTIST_SEARCH_1110120_FILTERED)}, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery/total_count", {"tiktok": {"max_videos": 10}}, 200, {"total_count": len(ARTIST_SEARCH_1141830_FILTERED)}, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery/total_count", {"spotify": {"min_popularity": 40, "max_popularity": 80}}, 200, {"total_count": len(ARTIST_SEARCH_738253_FILTERED)}, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery/total_count", {"soundcloud": {"max_followers": 100000}}, 200, {"total_count": len(ARTIST_SEARCH_1551_1110120_738253_FILTERED)}, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery/total_count", { "tiktok": {"min_videos": 10}, "soundcloud": {"min_followers": 1000}, "spotify": {"min_popularity": 20}, }, 200, {"total_count": len(ARTIST_SEARCH_1110120_738253_FILTERED)}, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery/total_count", ARTIST_GENRES_SEARCH_BODY, 200, {"total_count": len(ARTIST_SEARCH_EXPECTED_RETURN_DATA_GENRES)}, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery/total_count", ARTIST_COUNTRIES_SEARCH_BODY, 200, {"total_count": len(ARTIST_SEARCH_EXPECTED_RETURN_DATA_COUNTRIES)}, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery/total_count", ARTIST_GENRES_COUNTRIES_SEARCH_BODY, 200, {"total_count": len(ARTIST_SEARCH_EXPECTED_RETURN_DATA_GENRES_COUNTRIES)}, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery/total_count", {}, 200, {"total_count": len(ARTIST_SEARCH_ALL_FILTERED)}, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery/total_count", {"tiktok": {}}, 200, {"total_count": len(ARTIST_SEARCH_TIKTOK_FILTERED)}, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ], indirect=["elastic_client", "aggregates_postgres_client"], ) async def test_discovery_not_all_search_param( self, url, query_body, expected_status, expected_return_data, elastic_client, aggregates_postgres_client, app_client, auth_header, ): response = await app_client.post(url, headers=auth_header, json=query_body) assert expected_status == response.status response = await response.json() assert expected_return_data == response @pytest.mark.parametrize( "url, query_body, expected_status, elastic_client, aggregates_postgres_client", [ ( "/api/artist/discovery", TIKTOK_SEARCH_BODY, 422, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery", YOUTUBE_SEARCH_BODY, 422, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery/total_count", TIKTOK_SEARCH_BODY, 422, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery/total_count", YOUTUBE_SEARCH_BODY, 422, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery", SPOTIFY_SEARCH_BODY, 422, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery/total_count", SPOTIFY_SEARCH_BODY, 422, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery", SOUNDCLOD_SEARCH_BODY, 422, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( "/api/artist/discovery/total_count", SOUNDCLOD_SEARCH_BODY, 422, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ], indirect=["elastic_client", "aggregates_postgres_client"], ) async def test_discovery_check_query_body( self, url, query_body, expected_status, elastic_client, aggregates_postgres_client, app_client, auth_header ): query_body = query_body.copy() expected_return_data = {} for key in query_body: for item in query_body[key]: query_body[key][item] = "test_string" if item == "chart_type": expected_return_data[item] = ARTIST_CHART_TYPE_MAPPER[key] continue expected_return_data[item] = ["Not a valid integer."] response = await app_client.post(url, headers=auth_header, json=query_body) assert expected_return_data == await response.json() assert expected_status == response.status @pytest.mark.parametrize( "expected_return_data, expected_status, id, elastic_client, aggregates_postgres_client", [ ( ARTIST_1110120_SEARCH_RESULT_EXPECTED_DATA, 200, 1110120, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ( None, 404, 1111111111, # non-exist id (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), (ArtistSearchData, deepcopy(SEARCH_PG_DATA_TO_INSERT)), ), ], indirect=["elastic_client", "aggregates_postgres_client"], ) async def test_discovery_artist_result( self, expected_return_data, expected_status, id, elastic_client, aggregates_postgres_client, app_client, auth_header, ): response = await app_client.get(f"/api/artist/{id}/discovery_result", headers=auth_header) assert expected_return_data == await response.json() assert expected_status == response.status @pytest.mark.parametrize( "expected_data, id, aggregates_postgres_client", [ ( ARTIST_93560_SPOTIFY_TRACKS_EXPECTED_DATA, 93560, (ArtistSpotifyTracks, deepcopy(ARTISTS_93560_SPOTIFY_TRACKS_DATA_TO_INSERT)), ), ( [], 111111111, # non-exist id (ArtistSpotifyTracks, deepcopy(ARTISTS_93560_SPOTIFY_TRACKS_DATA_TO_INSERT)), ), ], indirect=["aggregates_postgres_client"], ) async def test_tracks_spotify(self, expected_data, id, aggregates_postgres_client, app_client, auth_header): response = await app_client.get(f"/api/v2/artist/{id}/tracks/spotify", headers=auth_header) assert expected_data == await response.json() @pytest.mark.parametrize( "expected_data, id, aggregates_postgres_client", [ ( ARTIST_168960_SPOTIFY_ALBUMS_EXPECTED_DATA, 168960, (ArtistSpotifyAlbums, deepcopy(ARTIST_168960_SPOTIFY_ALBUMS_DATA_TO_INSERT)), ), ( [], 111111111, # non-exist id (ArtistSpotifyAlbums, deepcopy(ARTIST_168960_SPOTIFY_ALBUMS_DATA_TO_INSERT)), ), ], indirect=["aggregates_postgres_client"], ) async def test_albums_spotify(self, expected_data, id, aggregates_postgres_client, app_client, auth_header): response = await app_client.get(f"/api/v2/artist/{id}/albums/spotify", headers=auth_header) assert expected_data == await response.json() @pytest.mark.parametrize( "expected_data, id, aggregates_postgres_client", [ ( ARTIST_3340920_VIDEOS_TIKTOK_EXPECTED_DATA, 3340920, (ArtistTiktokVideos, deepcopy(ARTIST_3340920_VIDEOS_TIKTOK_DATA_TO_INSERT)), ), ( [], 111111111, # non-exist id (ArtistTiktokVideos, deepcopy(ARTIST_3340920_VIDEOS_TIKTOK_DATA_TO_INSERT)), ), ], indirect=["aggregates_postgres_client"], ) async def test_videos_tiktok(self, expected_data, id, aggregates_postgres_client, app_client, auth_header): response = await app_client.get(f"/api/v2/artist/{id}/videos/tiktok", headers=auth_header) assert expected_data == await response.json() @pytest.mark.parametrize( "expected_data, id, aggregates_postgres_client", [ ( ARTIST_424290_VIDEOS_YOUTUBE_EXPECTED_DATA, 424290, (ArtistYoutubeVideos, deepcopy(ARTIST_424290_VIDEOS_YOUTUBE_DATA_TO_INSERT)), ), ( [], 111111111, # non-exist id (ArtistYoutubeVideos, deepcopy(ARTIST_424290_VIDEOS_YOUTUBE_DATA_TO_INSERT)), ), ], indirect=["aggregates_postgres_client"], ) async def test_videos_youtube(self, expected_data, id, aggregates_postgres_client, app_client, auth_header): response = await app_client.get(f"/api/v2/artist/{id}/videos/youtube", headers=auth_header) assert expected_data == await response.json() @pytest.mark.parametrize( "expected_data, id, aggregates_postgres_client", [ ( ARTIST_52710_TRACKS_SOUNDCLOUD_EXPECTED_DATA, 52710, (ArtistSoundCloudTracks, deepcopy(ARTIST_52710_TRACKS_SOUNDCLOUD_DATA_TO_INSERT)), ), ( [], 111111111, # non-exist id (ArtistSoundCloudTracks, deepcopy(ARTIST_52710_TRACKS_SOUNDCLOUD_DATA_TO_INSERT)), ), ], indirect=["aggregates_postgres_client"], ) async def test_tracks_soundcloud(self, expected_data, id, aggregates_postgres_client, app_client, auth_header): response = await app_client.get(f"/api/v2/artist/{id}/tracks/soundcloud", headers=auth_header) assert expected_data == await response.json() @pytest.mark.parametrize( "expected_data, id, aggregates_postgres_client", [ ( ARTIST_169620_EXTERNAL_LINKS_EXPECTED_DATA, 169620, (ArtistExternalLinks, deepcopy(ARTIST_169620_EXTERNAL_LINKS_DATA_TO_INSERT)), ), ( None, 111111111, # non-exist id (ArtistExternalLinks, deepcopy(ARTIST_169620_EXTERNAL_LINKS_DATA_TO_INSERT)), ), ], indirect=["aggregates_postgres_client"], ) async def test_external_links(self, expected_data, id, aggregates_postgres_client, app_client, auth_header): response = await app_client.get(f"/api/v4/artist/{id}/external_links", headers=auth_header) assert expected_data == await response.json() @pytest.mark.parametrize( "expected_data, id, aggregates_postgres_client", [ ( ARTIST_169620_EXTERNAL_LINKS_EXPECTED_DATA, 169620, (ArtistExternalLinks, deepcopy(ARTIST_169620_EXTERNAL_LINKS_DATA_TO_INSERT)), ), ], indirect=["aggregates_postgres_client"], ) async def test_external_links_check_grouping( self, expected_data, id, aggregates_postgres_client, app_client, auth_header ): response = await app_client.get(f"/api/v4/artist/{id}/external_links", headers=auth_header) result = await response.json() assert expected_data == result header_group = [] social_media_group = [] streaming_services_group = [] for group, items in result.items(): if group == "header": for item in items: header_group.append(item["name"]) elif group == "social_media": for item in items: social_media_group.append(item["name"]) elif group == "streaming_services": for item in items: streaming_services_group.append(item["name"]) assert True is all(item in HEADER_GROUP for item in header_group) assert True is all(item in SOCIAL_MEDIA_GROUP for item in social_media_group) assert True is all(item in STREAMING_SERVICES_GROUP for item in streaming_services_group) @pytest.mark.parametrize( "expected_data, id, aggregates_postgres_client", [ ( ARTIST_169620_EXTERNAL_LINKS_EXPECTED_DATA, 169620, (ArtistExternalLinks, deepcopy(ARTIST_169620_EXTERNAL_LINKS_DATA_TO_INSERT)), ), ], indirect=["aggregates_postgres_client"], ) async def test_external_links_check_header_order( self, expected_data, id, aggregates_postgres_client, app_client, auth_header ): response = await app_client.get(f"/api/v4/artist/{id}/external_links", headers=auth_header) result = await response.json() assert expected_data == result header_group = [items["name"] for items in result["header"]] assert HEADER_GROUP == header_group @pytest.mark.parametrize( "expected_return_data, query_body, elastic_client", [ ( ARTIST_SEARCH_BY_NAME_EXPECTED_DATA, ARTIST_SEARCH_BY_NAME_BODY, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), ), ( ARTIST_SEARCH_BY_NAME_EXPECTED_DATA_FULL_MATCH, ARTIST_SEARCH_BY_NAME_BODY_FULL_MATCH, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), ), ( [], ARTIST_SEARCH_BY_NAME_BODY_NON_EXIST_NAME, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), ), ( UNKNOWN_FIELDS_EXPECTED_DATA, ARTIST_SEARCH_BY_NAME_BODY_UNKNOWN_FIELD, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), ), ( NAME_LENGTH_ERROR_EXPECTED_DATA, SEARCH_BY_NAME_BODY_LONG_NAME_VALUE, (("artist_search", deepcopy(SEARCH_ES_DATA_TO_INSERT)),), ), ], indirect=["elastic_client"], ) async def test_search_by_name(self, expected_return_data, query_body, elastic_client, app_client, auth_header): response = await app_client.get("/api/artist/search_by_name", headers=auth_header, params=query_body) assert expected_return_data == await response.json()