import pytest from datetime import date, timedelta from flask import url_for from http import HTTPStatus from tests.legacy.apple_music import factories @pytest.mark.parametrize( "params,status,expected_result", ( ({"market": "us"}, HTTPStatus.OK, [{"id": "pl_0", "name": "pl_0_name"}]), ( {"market": "global"}, HTTPStatus.OK, [ {"id": "pl_0", "name": "pl_0_name"}, {"id": "pl_1", "name": "pl_1_name"}, {"id": "pl_2", "name": "pl_2_name"}, {"id": "pl_3", "name": "pl_3_name"}, {"id": "pl_4", "name": "pl_4_name"}, ], ), ), ) def test_playlists_top_weekly(params, status, expected_result, db_session, user_id, client, patch_auth_user): patch_auth_user(user_id) today = date.today().isoformat() for i, data in enumerate(((today, "us"), (today, "gb"), (today, "au"), (today, "ca"), (today, "global"))): factories.AppleWeeklyTopPlaylistLatestFactory.create(playlist_id=f"pl_{i}", date=data[0], country_code=data[1]) factories.ApplePlaylistFactory.create(id=f"pl_{i}", name=f"pl_{i}_name") response = client.get(url_for("playlists_apple.get_playlists_top_weekly", **params)) assert response.status_code == status if status == HTTPStatus.OK: assert response.json == expected_result @pytest.mark.parametrize( "body,status,expected_result", ( ({}, HTTPStatus.BAD_REQUEST, {}), ( { "tracks_isrc": {"isrc_2": (date.today() - timedelta(days=10)).isoformat()}, "playlist_ids": ["pl_1", "pl_2"], "market": "us", }, HTTPStatus.OK, [ { "entry_date": (date.today() - timedelta(days=5)).isoformat(), "exit_date": (date.today() - timedelta(days=2)).isoformat(), "isrc": "isrc_2", "playlist_id": "pl_2", } ], ), ( { "tracks_isrc": {"isrc_2": (date.today() - timedelta(days=10)).isoformat()}, "market": "us", }, HTTPStatus.OK, [ { "entry_date": (date.today() - timedelta(days=5)).isoformat(), "exit_date": (date.today() - timedelta(days=2)).isoformat(), "isrc": "isrc_2", "playlist_id": "pl_2", } ], ), ( { "tracks_isrc": {"isrc_1": (date.today() - timedelta(days=7)).isoformat()}, "market": "de", }, HTTPStatus.OK, [ { "entry_date": (date.today() - timedelta(days=5)).isoformat(), "exit_date": (date.today() - timedelta(days=3)).isoformat(), "isrc": "isrc_1", "playlist_id": "pl_2", } ], ), ), ) def test_playlists_previous_top_dates(body, status, expected_result, db_session, user_id, client, patch_auth_user): patch_auth_user(user_id) today = date.today() for index, (playlist, isrc, storefront, entry_date, exit_date) in enumerate( ( (1, 1, "us", (today - timedelta(days=10)), today), (1, 2, "uk", (today - timedelta(days=10)), today), (1, 3, "de", (today - timedelta(days=20)), (today - timedelta(days=5))), (2, 1, "de", (today - timedelta(days=5)), (today - timedelta(days=3))), (2, 2, "us", (today - timedelta(days=5)), (today - timedelta(days=2))), (2, 3, "uk", (today - timedelta(days=10)), (today - timedelta(days=1))), ), 1, ): factories.AppleMusicWeeklyTopPlaylistTrackSummaryFactory.create( playlist_id=f"pl_{playlist}", isrc=f"isrc_{isrc}", storefront=storefront, entry_date=entry_date.isoformat(), exit_date=exit_date.isoformat(), ) factories.AppleWeeklyTopPlaylistLatestFactory.create( id=index, playlist_id=f"pl_{playlist}", country_code=storefront ) response = client.post(url_for("playlists_apple.get_playlists_previous_top_dates"), json=body) assert response.status_code == status, response.text if status == HTTPStatus.OK: assert response.json == expected_result @pytest.mark.parametrize( "params,status,expected_result", ( ({}, HTTPStatus.BAD_REQUEST, {}), ({"playlist_ids": ["pl_not_existed"], "market": "fake"}, HTTPStatus.OK, []), ( {"playlist_ids": ["pl_1", "pl_3"], "market": "us"}, HTTPStatus.OK, [{"playlist_id": "pl_3", "streams_latest": 4566}], ), ( {"playlist_ids": ["pl_0", "pl_1", "pl_2", "pl_3", "pl_4", "pl_5", "pl_6"], "market": "us"}, HTTPStatus.OK, [{"playlist_id": "pl_0", "streams_latest": 10200}, {"playlist_id": "pl_3", "streams_latest": 4566}], ), ( {"playlist_ids": ["pl_0", "pl_1", "pl_2", "pl_3", "pl_4", "pl_5", "pl_6"], "market": "global"}, HTTPStatus.OK, [{"playlist_id": "pl_6", "streams_latest": 15000}], ), ), ) def test_playlists_streams_weekly(params, status, expected_result, db_session, user_id, client, patch_auth_user): patch_auth_user(user_id) [ factories.AppleMusicContainerStreamSummaryFactory.create( container_id=f"pl_{number}", country_code=data[0], streams_7_days=data[1] ) for number, data in enumerate( (("us", 10200), ("gb", 2401), ("au", 353), ("us", 4566), ("ca", 53412), ("au", 5644), ("global", 15000)) ) ] response = client.get(url_for("playlists_apple.get_playlists_streams_weekly", **params)) assert response.status_code == status if status == HTTPStatus.OK: assert response.json == expected_result