import random from functools import reduce import allure import pytest from assertpy import assert_that from app.src.api.constants import APPLE, SPOTIFY from app.src.api.facade import ApiClient from app.src.helpers.api_data_provider import ApiDataProvider api = ApiClient() api.authorize() data_provider = ApiDataProvider(api) queries = ["top", "all", "hits", "th", "now", "new"] query = random.choice(queries) playlists_apple = [("apple", i["id"]) for i in api.gate.get_playlists_search(query=query, vendor="apple", limit=10, ignore_response_attaching=True)] playlists_amazon = [("amazon", i["id"]) for i in api.gate.get_playlists_search(query=query, vendor="amazon", limit=10, ignore_response_attaching=True)] def get_all_history(authorized_api, vendor, isrc, market, limit=200): result = [authorized_api.gate.get_history_by_track(isrc, vendor, market=market, limit=limit)] for offset in range(limit, result[0].count, limit): result.append(authorized_api.gate.get_history_by_track(isrc, vendor, market=market, limit=limit, offset=offset)) return reduce(lambda a, b: a + b.items, result, []) def get_top_5_playlists(isrc, start_date, end_date): return api.apollo.get_spotify_playlists_data_go( isrc=isrc, streams_market="_gl", start_date=start_date, end_date=end_date, streams_type="priority", keep_zero_streams=False, offset=0, limit=5, order_by=["-current_streams"])["body"] apple_tracks = [ "USSM12103949", "USSM11912587", "USSM19801941", "AUZS21100040", "QZES71982312", "QM6P41952433", "USSM19400325", "USSM10804556", ] @allure.testcase("AG-8597") @allure.description("Playlist info section vs. Past Playlists") @pytest.mark.parametrize( "vendor,market,isrc_idx", [ *[(APPLE, market, idx) for idx in apple_tracks for market in ["us", "ca", "gb"]], *[(SPOTIFY, "_gl", idx) for idx in range(20)], ], ) def test_playlist_info_past_playlists(authorized_api, vendor, market, sony_tracks_isrcs, data_provider, isrc_idx): sony_track_isrc = isrc_idx if isinstance(isrc_idx, str) else sony_tracks_isrcs[isrc_idx] all_history = get_all_history(authorized_api, vendor, sony_track_isrc, market if vendor == APPLE else None) all_ids = [playlist.id for playlist in all_history] recent_adds = authorized_api.gate.get_playlists_by_track( sony_track_isrc, vendor, limit=5, market=market, recent_adds_only="true", order_by=["-added_date", "current_position"], ) start_date, end_date = data_provider.get_track_start_end_dates(sony_track_isrc, 7) top_5 = authorized_api.gate.get_playlists_by_track( sony_track_isrc, vendor, market=market, limit=5, order_by="-current_streams", start_date=start_date, end_date=end_date, ) recent_drops = authorized_api.gate.get_history_by_track(sony_track_isrc, vendor, limit=5, recent_removals_only="true", order_by=["removed_date", "id"], market=market) if top_5.items: assert_that(all_ids).does_not_contain(*[t.id for t in top_5.items]) if recent_adds.items: assert_that(all_ids).does_not_contain(*[r.id for r in recent_adds.items]) if recent_drops.items: assert_that(all_ids).contains(*[r.id for r in recent_drops.items]) @allure.testcase("AG-10903", "AG-11495") @allure.description("Verify that there is tracklist for each market from market selector") @pytest.mark.parametrize(["vendor", "playlist_id"], playlists_apple + playlists_amazon) def test_tracklist_exists_for_each_market_from_market_selector(vendor, playlist_id): markets = [i["code"] for i in api.gate.get_markets_for_playlist(vendor=vendor, playlist_id=playlist_id)["body"]] for market in markets: if vendor == "amazon": updated_playlist_id = playlist_id[:-2] + market playlist_id = api.gate.get_playlists_amazon(f"id={updated_playlist_id}")["body"][0]["id"] tracklist = api.apollo.get_amazon_music_playlist_tracklist(playlist_id, market, "current_position", 100)["body"]["items"] elif vendor == "apple": tracklist = api.apollo.get_v1_apple_music_playlist_tracklist(playlist_id, market, "current_position", 100)["body"]["items"] assert_that(len(tracklist)).is_greater_than(0) @allure.testcase("AG-11665") @allure.description("Logic of the displaying top 5 playlists") def test_display_logic_top_5_playlists_carousel(): top_data_spotify = api.apollo.get_charts_top("spotify", "global", fields=["is_sony"])["body"]["tracks"] track_data_sme = next(i for i in top_data_spotify if i["distributed_by"] == "sme") isrc = track_data_sme["isrc"] start_date, end_date = data_provider.get_track_start_end_dates(isrc, 6) top_5_playlists = get_top_5_playlists(isrc, start_date, end_date) assert_that(top_5_playlists["streams_type"]).is_equal_to("track") top_5_playlists_currents_streams = [i["current_streams"] for i in top_5_playlists["items"]] assert_that(top_5_playlists_currents_streams).is_equal_to(sorted(top_5_playlists_currents_streams, reverse=True)) tracks_data_none = [i for i in top_data_spotify if i["distributed_by"] is None] for track_data_none in tracks_data_none: isrc = track_data_none["isrc"] start_date, end_date = data_provider.get_track_start_end_dates(isrc, 6) top_5_playlists = get_top_5_playlists(isrc, start_date, end_date) if top_5_playlists["streams_type"] != "playlist": continue top_5_playlists_currents_streams = [i["current_streams"] for i in top_5_playlists["items"]] assert_that(top_5_playlists_currents_streams).is_equal_to(sorted(top_5_playlists_currents_streams, reverse=True)) break