import os from datetime import datetime, timedelta import json from tracker import json_utils, db from tracker.test import test_data from tracker.utils import a_datetime from . import login_to_test_client as _login # Scenarios: # - minPopularity, maxFollowers, preset list, replace with posted set of ids (fine speed wise), # - not really # - def test_defaults_are_10popularity_10daysago_ordered_by_popularity(session): setup_data(session) data = get_chart({}) assert_results(data, ["track5", "track1", "track2"]) def test_minPopularity(session): setup_data(session) data = get_chart({ 'filters': {'minPopularity': 60} }) assert_results(data, ['track5']) data = get_chart({ 'filters': {'minPopularity': 9} }) assert_results(data, ['track5','track1', 'track2', 'track3']) def test_publishedDaysAgo(session): setup_data(session) data = get_chart({ 'filters': {'publishedDaysAgo': 5} }) assert_results(data, ['track5', 'track1']) data = get_chart({ 'filters': {'publishedDaysAgo': 11} }) assert_results(data, ['track4', 'track5', 'track1', 'track2']) # track4 has highest popularity so is first def test_maxFollowers(session): setup_data(session) data = get_chart({ 'filters': {'maxFollowers': 1000} }) assert_results(data, ['track1']) data = get_chart({ 'filters': {'maxFollowers': int(1e6)} }) assert_results(data, ['track5', 'track1', 'track2']) # track5 has highest popularity so is first def assert_results(data, expected): assert 'results' in data, "Returned json had now 'results' key" assert [t["track_spyid"] for t in data["results"]] == expected def get_chart(settings, check200=True): from api import api app = api.app.test_client() _login(app) res = app.post( "/api/charts/SpotifyEmerging", data=json.dumps(settings), content_type="application/json" ) if check200: assert res.status_code == 200, "Chart request failed non 200! \n{}".format(res.get_data(as_text=True)) data = json_utils.loads(res.data) return data def setup_data(session): session.add( db.SpyPlaylist( spyid="playlist1", user="playlist1_owner", name="1 Playlist", include_in_charts=True ) ) session.add( db.SpyPlaylist( spyid="playlist2", user="playlist2_owner", name="2 Playlist", include_in_charts=True ) ) session.add( db.SpyArtist( spyid="artist1", name="1k Followers", data=test_data.make_spy_artist_json(follower_count=1000), ) ) session.add( db.SpyArtist( spyid="artist2", name="10k Followers", data=test_data.make_spy_artist_json(follower_count=10000), ) ) session.add( db.SpyArtist( spyid="artist3", name="1M Followers", data=test_data.make_spy_artist_json(follower_count=int(1e6)), ) ) session.add( db.SpyTrack( spyid="track1", name="Both lists, 50 pop, 5 days ago", primary_artist_spyid="artist1", data=test_data.make_spy_track_json(id="track1", artist_id="artist1", popularity=50), album_data=test_data.make_spy_album_json( release_date=a_datetime("5 days ago").date().isoformat() ), ) ) session.add( db.SpyTrack( spyid="track2", name="List 2, 10 pop, 10 days ago", primary_artist_spyid="artist2", data=test_data.make_spy_track_json(id="track2", artist_id="artist2", popularity=10), album_data=test_data.make_spy_album_json( release_date=a_datetime("10 days ago").date().isoformat() ), ) ) session.add( db.SpyTrack( spyid="track3", name="List 2, 9 pop, 5 days ago", primary_artist_spyid="artist2", data=test_data.make_spy_track_json(id="track3", artist_id="artist2", popularity=9), album_data=test_data.make_spy_album_json( release_date=a_datetime("5 days ago").date().isoformat() ), ) ) session.add( db.SpyTrack( spyid="track4", name="List 2, 60 pop, 11 days ago", primary_artist_spyid="artist2", data=test_data.make_spy_track_json(id="track4", artist_id="artist2", popularity=60), album_data=test_data.make_spy_album_json( release_date=a_datetime("11 days ago").date().isoformat() ), ) ) session.add( db.SpyTrack( spyid="track5", name="List 2, 60 pop, 5 days ago, 1M followers", primary_artist_spyid="artist3", data=test_data.make_spy_track_json(id="track5", artist_id="artist3", popularity=60), album_data=test_data.make_spy_album_json( release_date=a_datetime("5 days ago").date().isoformat() ), ) ) session.add( db.SpyPlaylistTrack( playlist_spyid="playlist1", track_spyid="track1", added_at=datetime.today(), first_seen=datetime.today(), last_seen=datetime.today(), first_position=1, last_position=1, ) ) for trackid in ["track1", "track2", "track3", "track4", "track5"]: session.add( db.SpyPlaylistTrack( playlist_spyid="playlist2", track_spyid=trackid, added_at=datetime.today(), first_seen=datetime.today(), last_seen=datetime.today(), first_position=1, last_position=1, ) ) session.add(db.UsersSpyPlaylists(username="joel", spyid="playlist1")) # for i in range(10): # session.add(db.SpyTrackPopularity( # track_spyid='track1', # as_of=datetime.today() - timedelta(days=i), # value=50, # )) # session.add(db.SpyTrackPopularity( # track_spyid='track2', # as_of=datetime.today() - timedelta(days=i), # value=25, # )) session.commit() session.execute("refresh materialized view spy_track_olap") session.commit()