import datetime from collections import namedtuple from apollo_notifications.charts.client import AppleChart from apollo_notifications.charts.config import ChartsConfig, ChartsSchemaConfig from apollo_notifications.charts.serializers import PushChartsBaseSchema from apollo_notifications.constants import APPLE_CHART_NAME from tests import factories Song = namedtuple('Song', ['name', 'id', 'artist_name', 'isrc']) class AppleChartsConfig(ChartsConfig): VENDOR: str = "APPLE" TOPIC: str = "test" class AppleChartsSchemaConfig(ChartsSchemaConfig): VENDOR: str = "APPLE" TOPIC: str = "test" MESSAGE_TEMPLATE: str = "🔥 {artist_name} - {track_name} entered " \ "Apple Music Top 100 Chart {country_flag} at position {position}" PUSH_TARGET: str = "test" TITLE: str = "" 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_get_apple_chart_entries(db_session): today, yesterday = get_formatted_today_yesterday() market = 'us' yesterday_chart = factories.AppleMusicChartFactory.create( storefront=market, chart_name=APPLE_CHART_NAME, date=yesterday) today_chart = factories.AppleMusicChartFactory.create( storefront=market, chart_name=APPLE_CHART_NAME, date=today) existing_song = Song(name='song 1', id=1, artist_name='artist 1', isrc='USRC11901801') new_song = Song(name='song 2', id=2, artist_name='artist 2', isrc='USRC11901802') factories.AppleMusicSongFactory.create(id=existing_song.id, isrc=existing_song.isrc) factories.AppleMusicSongFactory.create(id=new_song.id, isrc=new_song.isrc) # create charts entities factories.AppleMusicChartSongEntryFactory.create( chart_id=yesterday_chart.id, position=1, song_id=existing_song.id, artist_name=existing_song.artist_name, name=existing_song.name ) factories.AppleMusicChartSongEntryFactory.create( chart_id=today_chart.id, position=1, song_id=existing_song.id, artist_name=existing_song.artist_name, name=existing_song.name ) factories.AppleMusicChartSongEntryFactory.create( chart_id=today_chart.id, position=2, song_id=new_song.id, artist_name=new_song.artist_name, name=new_song.name ) config = AppleChartsConfig() notifications_client = AppleChart(config) added_tracks = notifications_client.get_diff_tracks_by_dates( market, start_date=today, end_date=yesterday).all() assert len(added_tracks) == 1 assert added_tracks[0].track_id == new_song.id assert added_tracks[0].position == 3 assert added_tracks[0].isrc == new_song.isrc def test_get_apple_charts_exits(db_session): today, yesterday = get_formatted_today_yesterday() market = 'us' yesterday_chart = factories.AppleMusicChartFactory.create( storefront=market, chart_name=APPLE_CHART_NAME, date=yesterday) today_chart = factories.AppleMusicChartFactory.create( storefront=market, chart_name=APPLE_CHART_NAME, date=today) existing_song = Song(name='song 1', id=1, artist_name='artist 1', isrc='USRC11901801') dropped_song = Song(name='song 2', id=2, artist_name='artist 2', isrc='USRC11901802') factories.AppleMusicSongFactory.create(id=existing_song.id, isrc=existing_song.isrc) factories.AppleMusicSongFactory.create(id=dropped_song.id, isrc=dropped_song.isrc) # create charts entities factories.AppleMusicChartSongEntryFactory.create( chart_id=yesterday_chart.id, position=1, song_id=existing_song.id, artist_name=existing_song.artist_name, name=existing_song.name ) factories.AppleMusicChartSongEntryFactory.create( chart_id=yesterday_chart.id, position=2, song_id=dropped_song.id, artist_name=dropped_song.artist_name, name=dropped_song.name ) factories.AppleMusicChartSongEntryFactory.create( chart_id=today_chart.id, position=1, song_id=existing_song.id, artist_name=existing_song.artist_name, name=existing_song.name ) config = AppleChartsConfig() notifications_client = AppleChart(config) dropped_tracks = notifications_client.get_diff_tracks_by_dates( market, start_date=yesterday, end_date=today).all() assert len(dropped_tracks) == 1 assert dropped_tracks[0].track_id == dropped_song.id assert dropped_tracks[0].position == 3 assert dropped_tracks[0].isrc == dropped_song.isrc def get_filtered_query(song, starred_song, market, date, user_id, client, session): factories.AppleMusicSongFactory.create(id=song.id, isrc=song.isrc) factories.AppleMusicSongFactory.create(id=starred_song.id, isrc=starred_song.isrc) market = factories.MarketFactory.create(market_name=market) # create chart and chart entities chart = factories.AppleMusicChartFactory.create( storefront=market.market_name, chart_name=APPLE_CHART_NAME, date=date) factories.AppleMusicChartSongEntryFactory.create( chart_id=chart.id, position=1, song_id=song.id, artist_name=song.artist_name, name=song.name ) factories.AppleMusicChartSongEntryFactory.create( chart_id=chart.id, position=0, song_id=starred_song.id, artist_name=starred_song.artist_name, name=starred_song.name ) # mark track as starred factories.UserMarketFactory.create( user_id=user_id, market_id=market.market_id) factories.StarredContentFactory.create( user_id=user_id, uri=starred_song.id, isrc=starred_song.isrc) 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) tracks_query = client._get_base_query(session, market.market_name, date=date) return client.filter_by_starred_and_active(tracks_query, [user_id]) def test_get_filtered_tracks(db_session): market = "us" user_id = "user_id" song = Song(name='song 1', id=1, artist_name='artist 1', isrc='USRC11901902') starred_song = Song(name='song 2', id=2, artist_name='artist 2', isrc='usrc11901901') today, _ = get_formatted_today_yesterday() config = AppleChartsConfig() notifications_client = AppleChart(config) starred_tracks = get_filtered_query( song, starred_song, market, today, user_id, notifications_client, db_session).all() assert len(starred_tracks) == 1 assert starred_tracks[0].user_id == user_id assert starred_tracks[0].track_id == starred_song.id assert starred_tracks[0].position == 1 assert len(starred_tracks[0].device_tokens.split(',')) == 3 def test_apple_chart_schema(db_session): market = "us" user_id = "user_id" song = Song(name='song 1', id=1, artist_name='artist 1', isrc='USRC11901902') starred_song = Song(name='song 2', id=2, artist_name='artist 2', isrc='usrc11901901') today, _ = get_formatted_today_yesterday() client_config = AppleChartsConfig() schema_config = AppleChartsSchemaConfig() notifications_client = AppleChart(client_config) schema = PushChartsBaseSchema(schema_config, today, market) starred_track = get_filtered_query( song, starred_song, market, today, user_id, notifications_client, db_session).all()[0] data = schema.dump(starred_track) assert data["title"] == schema_config.TITLE assert data["user_id"] == starred_track.user_id assert data["tokens"] == starred_track.device_tokens.split(',') inner_data = data["data"] assert data["id"] == inner_data["id"] assert inner_data["track_name"] == starred_track.track_name assert inner_data["vendor"] == schema_config.VENDOR assert inner_data["artist_name"] == starred_track.artist_name assert inner_data["track_id"] == str(starred_track.track_id) assert inner_data["target"] == schema_config.PUSH_TARGET assert inner_data["country_code"] == market assert inner_data["topic"] == schema_config.TOPIC assert inner_data["position"] == starred_track.position assert inner_data["isrc"] == starred_track.isrc def test_get_dates(db_session): market = 'us' today = datetime.date.today() dates = [today - datetime.timedelta(2), today - datetime.timedelta(4), today - datetime.timedelta(5)] dates_formatted = [d.strftime("%Y-%m-%d") for d in dates] for date in dates_formatted: factories.AppleMusicChartFactory.create( storefront=market, chart_name=APPLE_CHART_NAME, date=date) config = AppleChartsConfig() notifications_client = AppleChart(config) apple_dates = notifications_client.get_dates(market) assert len(apple_dates) == 2 for i, d in enumerate(apple_dates): assert dates_formatted[i] == d