import time from datetime import datetime import pytest import app.src.tests.insights.playlist_freshness.insights_steps as insights from app.config import UPDATE_TIMEOUT from app.logger import log from app.src.tests.insights.playlist_freshness.snowflake_steps import get_latest_cdc_event_timestamp from app.src.tests.insights.tests_common import DEFAULT_PLAYLISTS @pytest.mark.parametrize("test_playlist", DEFAULT_PLAYLISTS) def test_spotify_playlist_update(spotify, graphql, snowflake, test_playlist): """ https://theorchard.atlassian.net/browse/IN-15801 Check end-to-end spotify playlist update: 1. Make update in Spotify 2. Wait and check fresh data in Insights """ playlist_types = ["USER_GENERATED"] log.info("------> Step1: take 1st ISRC of the playlist in Spotify") tested_isrc_index = 0 tested_isrc = spotify.get_spotify_playlist_isrc(test_playlist)[tested_isrc_index] start_position_spotify = spotify.get_track_position_by_isrc(test_playlist, tested_isrc) assert start_position_spotify == tested_isrc_index + 1 log.info(f"------> Step2: check ISRC has playlist '{test_playlist}' in Insights") isrc_playlists = insights.get_insights_isrc_playlists(tested_isrc, graphql, playlist_types) playlist = insights.find_playlist_in_placements(test_playlist, isrc_playlists) log.debug(playlist) start_position_insights = playlist['currentPosition'] log.info(f"INSIGHTS ISRC position: {tested_isrc} is {start_position_insights}") assert start_position_insights == start_position_spotify, \ f"Start Positions Insights: {start_position_insights}, Spotify: {start_position_spotify}" log.info("Get latest CDC event timestamp") old_cdc_timestamp = get_latest_cdc_event_timestamp(snowflake, test_playlist) log.info("------> Step3: SPOTIFY Change ISRC position") spotify.reorder_playlist_items( playlist_id=test_playlist, range_start=2, insert_before=0, range_length=1 ) new_position_spotify = spotify.get_track_position_by_isrc(test_playlist, tested_isrc) # as we inserted another track before, then this track is shifted down at 1 position: assert new_position_spotify == tested_isrc_index + 2 time_spotify_updated = datetime.now() log.info(f"PLAYLIST is UPDATED in Spotify") log.info(f"------> Step4: INSIGHTS: Wait and check ISRC position is updated") waited_time = 0 default_wait = 100 log.info(f"Wait default time before verification: {default_wait} seconds") time.sleep(default_wait) waited_time += default_wait while waited_time < UPDATE_TIMEOUT: # wait for new CDC event new_cdc_timestamp = get_latest_cdc_event_timestamp(snowflake, test_playlist) if new_cdc_timestamp > old_cdc_timestamp: isrc_playlists = insights.get_insights_isrc_playlists(tested_isrc, graphql, playlist_types) playlist = insights.find_playlist_in_placements(test_playlist, isrc_playlists) new_position_in_insights = playlist['currentPosition'] log.info(f"INSIGHTS ISRC position: {tested_isrc} is {new_position_in_insights}") if new_position_in_insights == new_position_spotify: assert True log.info("Insights ISRC position updated successfully") break sleep_time = 20 time.sleep(sleep_time) waited_time += sleep_time else: assert False, f"Update not detected within {UPDATE_TIMEOUT} seconds. Insights position did not match Spotify position." time_insights_updated = datetime.now() delta = abs(time_insights_updated - time_spotify_updated) mins, secs = divmod(delta.total_seconds(), 60) log.info("\n-------------RESULTS-------------\n" f"SPOTIFY: {time_spotify_updated.strftime('%Y-%m-%d %H:%M:%S')}\n" f"INSIGHTS: {time_insights_updated.strftime('%Y-%m-%d %H:%M:%S')}\n" f"TIME: {int(mins)} min {int(secs)} sec" )