import datetime import json from apollo_push_client import PushClient from sme_logger import get_logger from apollo_main_db.push_notifications.models import PushMessage, TopicEnum from spotify_playlists_additions_notifications.config import Config from spotify_playlists_additions_notifications.handler import get_added_tracks_query, process_added_tracks from spotify_playlists_additions_notifications.utils import get_blacklisted_ids from tests import factories def get_formatted_today_yesterday(): today = datetime.date.today() yesterday = today - datetime.timedelta(days=1) return today.strftime("%Y-%m-%d"), yesterday.strftime("%Y-%m-%d") def test_added_tracks_for_existing_playlist(db_session): """Here we have 2 TOP playlists for today, get_added_tracks should return only new tracks for each playlist, which is added today and wasn't yesterday """ today, yesterday = get_formatted_today_yesterday() playlist_1 = factories.SpotifyPlaylistFactory.create( id='playlist_1', uri='playlist_1') playlist_2 = factories.SpotifyPlaylistFactory.create( id='playlist_2', uri='playlist_2') factories.SpotifyWeeklyTopPlaylistFactory.create( playlist_id=playlist_1.id, country='us', date=yesterday) factories.SpotifyWeeklyTopPlaylistFactory.create( playlist_id=playlist_2.id, country='us', date=yesterday) track_1 = factories.SpotifyTrack2Factory.create(name='track_1') track_2 = factories.SpotifyTrack2Factory.create(name='track_2') track_3 = factories.SpotifyTrack2Factory.create(name='track_3') artist = factories.SpotifyArtistFactory.create() factories.SpotifyTrackArtistFactory.create( track_id=track_1.id, artist_id=artist.id, order=0) factories.SpotifyTrackArtistFactory.create( track_id=track_2.id, artist_id=artist.id, order=0) factories.SpotifyTrackArtistFactory.create( track_id=track_3.id, artist_id=artist.id, order=0) factories.SpotifyPlaylistTrackListHistory2Factory.create( playlist_id=playlist_1.id, track_id=track_1.id, date=today ) factories.SpotifyPlaylistTrackListHistory2Factory.create( playlist_id=playlist_2.id, track_id=track_1.id, date=today ) factories.SpotifyPlaylistTrackListHistory2Factory.create( playlist_id=playlist_2.id, track_id=track_1.id, date=yesterday ) factories.SpotifyPlaylistTrackListHistory2Factory.create( playlist_id=playlist_1.id, track_id=track_2.id, date=yesterday ) factories.SpotifyPlaylistTrackListHistory2Factory.create( playlist_id=playlist_1.id, track_id=track_2.id, date=today ) factories.SpotifyPlaylistTrackListHistory2Factory.create( playlist_id=playlist_2.id, track_id=track_3.id, date=today ) added_tracks = get_added_tracks_query(db_session, today, yesterday, 'us').all() result = [(i.playlist_id, i.track_id,) for i in added_tracks] assert (playlist_1.id, track_1.id) in result assert (playlist_2.id, track_3.id) in result def test_added_tracks_for_new_playlist(db_session): """Here we have 1 NEW TOP playlist for today, get_added_tracks should return tracks only for new playlist, even though tracks were in that playlist yesterday. """ today, yesterday = get_formatted_today_yesterday() playlist_1 = factories.SpotifyPlaylistFactory.create( id='playlist_1', uri='playlist_1') playlist_2 = factories.SpotifyPlaylistFactory.create( id='playlist_2', uri='playlist_2') factories.SpotifyWeeklyTopPlaylistFactory.create( playlist_id=playlist_1.id, country='us', date=today) factories.SpotifyWeeklyTopPlaylistFactory.create( playlist_id=playlist_2.id, country='us', date=yesterday) track_1 = factories.SpotifyTrack2Factory.create(name='track_1') track_2 = factories.SpotifyTrack2Factory.create(name='track_2') track_3 = factories.SpotifyTrack2Factory.create(name='track_3') artist = factories.SpotifyArtistFactory.create() factories.SpotifyTrackArtistFactory.create( track_id=track_1.id, artist_id=artist.id, order=0) factories.SpotifyTrackArtistFactory.create( track_id=track_2.id, artist_id=artist.id, order=0) factories.SpotifyTrackArtistFactory.create( track_id=track_3.id, artist_id=artist.id, order=0) factories.SpotifyPlaylistTrackListHistory2Factory.create( playlist_id=playlist_1.id, track_id=track_1.id, date=today ) factories.SpotifyPlaylistTrackListHistory2Factory.create( playlist_id=playlist_1.id, track_id=track_2.id, date=today ) factories.SpotifyPlaylistTrackListHistory2Factory.create( playlist_id=playlist_1.id, track_id=track_2.id, date=yesterday ) factories.SpotifyPlaylistTrackListHistory2Factory.create( playlist_id=playlist_2.id, track_id=track_3.id, date=today ) added_tracks = get_added_tracks_query(db_session, today, yesterday, 'us').all() result = [(i.playlist_id, i.track_id,) for i in added_tracks] assert (playlist_1.id, track_1.id) in result assert (playlist_1.id, track_2.id) in result assert (playlist_2.id, track_3.id) not in result def test_process_added_tracks(db_session, mocked_sqs, redis_client): today, yesterday = get_formatted_today_yesterday() market = factories.ApolloMarketFactory.create(code='us') playlist_1 = factories.SpotifyPlaylistFactory.create(id='playlist_1', uri='playlist_1', country_code="au") playlist_2 = factories.SpotifyPlaylistFactory.create(id='playlist_2', uri='playlist_2') factories.SpotifyWeeklyTopPlaylistFactory.create(playlist_id=playlist_1.id, country='us', date=yesterday) factories.SpotifyWeeklyTopPlaylistFactory.create(playlist_id=playlist_2.id, country='us', date=yesterday) track_1 = factories.SpotifyTrack2Factory.create(name='track_1') track_2 = factories.SpotifyTrack2Factory.create(name='track_2') track_3 = factories.SpotifyTrack2Factory.create(name='track_3') track_4 = factories.SpotifyTrack2Factory.create(name='track_4') artist = factories.SpotifyArtistFactory.create() factories.SpotifyTrackArtistFactory.create(track_id=track_1.id, artist_id=artist.id, order=0) factories.SpotifyTrackArtistFactory.create(track_id=track_2.id, artist_id=artist.id, order=0) factories.SpotifyTrackArtistFactory.create(track_id=track_3.id, artist_id=artist.id, order=0) factories.SpotifyTrackArtistFactory.create(track_id=track_4.id, artist_id=artist.id, order=0) factories.SpotifyPlaylistTrackListHistory2Factory.create( playlist_id=playlist_1.id, track_id=track_1.id, date=today ) factories.SpotifyPlaylistTrackListHistory2Factory.create( playlist_id=playlist_1.id, track_id=track_2.id, date=today ) factories.SpotifyPlaylistTrackListHistory2Factory.create( playlist_id=playlist_2.id, track_id=track_3.id, date=today ) factories.SpotifyPlaylistTrackListHistory2Factory.create( playlist_id=playlist_2.id, track_id=track_3.id, date=today ) # mark track as starred user_id = 'user_id' factories.UserMarketFactory.create(user_id=user_id, market_id=market.id) factories.StarredContentFactory.create(user_id=user_id, isrc=track_1.isrc, uri=track_1.id) factories.StarredContentFactory.create(user_id=user_id, isrc=track_3.isrc, uri=track_3.id) factories.StarredContentFactory.create(user_id=user_id, isrc=track_1.isrc, uri='foo') factories.UserDeviceFactory.create_batch(size=2, user_id=user_id, is_active=False) factories.UserDeviceFactory.create_batch(size=3, user_id=user_id, is_active=True) factories.PlaylistBlacklistFactory.create(vendor="spotify", playlist_id=playlist_2.id) logger = get_logger('test') push_client = PushClient( logger_client=logger, sqs_client=mocked_sqs, db_session=db_session, config=Config() ) blacklist = get_blacklisted_ids(db_session, redis_client) process_added_tracks( market.code, today, yesterday, push_client, redis_client, db_session, logger, blacklist ) push_messages = db_session.query(PushMessage).all() assert len(push_messages) == 1 push = push_messages[0] assert push.track_id == track_1.id assert push.topic == TopicEnum.PLAYLIST_ADDITIONS push_data = json.loads(push.data) assert push_data['country_code'] == market.code