import json import pytest from datetime import date, timedelta from apollo_push_client import PushClient from sme_logger import get_logger from apollo_main_db.push_notifications.models import PushMessage, TopicEnum, VendorEnum from apple_playlists_additions_notifications.config import Config from apple_playlists_additions_notifications.constants import APPLE_MUSIC_SERVICE from apple_playlists_additions_notifications.handler import get_added_tracks_query, process_added_tracks from apple_playlists_additions_notifications.utils import get_blacklisted_ids from tests import factories 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 = date.today().strftime('%Y-%m-%d') yesterday = (date.today() - timedelta(days=1)).strftime('%Y-%m-%d') two_days_ago = (date.today() - timedelta(days=2)).strftime('%Y-%m-%d') playlist_1 = factories.ApplePlaylistFactory.create(name='Playlist 1') playlist_2 = factories.ApplePlaylistFactory.create(name='Playlist 2') factories.AppleWeeklyTopPlaylistFactory.create( playlist_id=playlist_1.id, country_code='us', date=yesterday) factories.AppleWeeklyTopPlaylistFactory.create( playlist_id=playlist_2.id, country_code='us', date=two_days_ago) song_1, song_2, song_3 = factories.AppleSongFactory.create_batch( size=3, storefront='us') factories.ApplePlaylistTrackListHistoryFactory.create( playlist_id=playlist_1.id, storefront='us', song_id=song_1.id, date=today ) # song_2 will be in added tracks because playlist_1 wasn't top before factories.ApplePlaylistTrackListHistoryFactory.create( playlist_id=playlist_1.id, storefront='us', song_id=song_2.id, date=today ) # playlist_2 is not in top for today, so it won't be in added_tracks factories.ApplePlaylistTrackListHistoryFactory.create( playlist_id=playlist_2.id, storefront='us', song_id=song_3.id, date=today ) added_tracks = get_added_tracks_query(db_session, today, yesterday, 'us').all() result = [(i.playlist_id, i.song_id,) for i in added_tracks] assert (playlist_1.id, song_1.id) in result assert (playlist_1.id, song_2.id) in result assert (playlist_2.id, song_3.id) not in result @pytest.mark.parametrize( "market_code,market_id,msg_num", (("us", 4, 2), ("global", 14, 2), ("gb", 3, 0)) ) def test_process_added_tracks(db_session, mocked_sqs, redis_client, market_code, market_id, msg_num): today = date.today().strftime('%Y-%m-%d') yesterday = (date.today() - timedelta(days=1)).strftime('%Y-%m-%d') market_us = factories.ApolloMarketFactory.create(code="us", id=4) factories.ApolloMarketFactory.create(code="global", id=14) market_gb = factories.ApolloMarketFactory.create(code="gb", id=5) buzz_user = factories.BuzzUserFactory(user_name="123456", country_code="gb", music_service=APPLE_MUSIC_SERVICE) playlist_1 = factories.ApplePlaylistFactory.create(name='Playlist 1', curator_id=buzz_user.user_name) playlist_2 = factories.ApplePlaylistFactory.create(name='Playlist 2') playlist_3 = factories.ApplePlaylistFactory.create(name='Playlist 3', curator_id=buzz_user.user_name) for playlist in [playlist_1, playlist_2, playlist_3]: factories.AppleWeeklyTopPlaylistFactory.create( playlist_id=playlist.id, country_code=market_us.code, date=yesterday ) songs_us = factories.AppleSongFactory.create_batch( size=3, storefront=market_us.code) for song in songs_us: for _market in [market_gb, market_us]: factories.ApplePlaylistTrackListHistoryFactory.create( playlist_id=playlist_1.id, storefront=_market.code, song_id=song.id, date=today ) factories.ApplePlaylistTrackListHistoryFactory.create( playlist_id=playlist_2.id, storefront=_market.code, song_id=song.id, date=today ) # mark track as starred user_id = 'user_id' starred_track = songs_us[0] factories.UserMarketFactory.create(user_id=user_id, market_id=market_id) factories.StarredContentFactory.create(user_id=user_id, isrc=starred_track.isrc, uri=starred_track.id) factories.StarredContentFactory.create(user_id=user_id, isrc=starred_track.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="apple", playlist_id=playlist_3.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) == msg_num if not push_messages: return for push in push_messages: data = json.loads(push.data) assert 'country_code' in data assert data['country_code'] == "_gl" if market_code == "global" else market_code starred_push = push_messages[0] assert starred_push.track_id == str(starred_track.id) assert starred_push.topic == TopicEnum.PLAYLIST_ADDITIONS assert starred_push.vendor == VendorEnum.APPLE