from datetime import datetime from tracker import json_utils, db from tracker.test import add_and_flush from tracker.test.test_data import make_twitter_user_json from tracker.utils import a_datetime from . import login_to_test_client as _login def test_soundcloud(session): # two artists add_and_flush( session, # My scout: db.ScUser(scid=1, name="Pigeons & Planes", is_influencer=True), db.UsersScInfluencers(username="test", scid=1), # Not my scout: db.ScUser(scid=2, name="Not My Scout", is_influencer=True), # basic artist follow and track like db.ScUser(scid=10, name="Artist With Liked Track"), db.ScTrack(scid=1000, name="Liked Track", artist_scid=10), db.ScLike(influencer_scid=1, track_scid=1000, seen_at=a_datetime("1 days ago")), db.ScUser(scid=11, name="Followed Artist"), db.ScFollowing( influencer_scid=1, artist_scid=11, seen_at=a_datetime("1 day and 1 second ago"), ), # follow and like by not my scout db.ScUser(scid=20, name="Artist Followed By Not My Scout"), db.ScFollowing( influencer_scid=2, artist_scid=20, seen_at=a_datetime("1 day ago") ), db.ScUser(scid=21, name="Artist With Track Liked By Not My Scout"), db.ScTrack(scid=2000, name="Track Liked By Not My Scout", artist_scid=10), db.ScLike(influencer_scid=2, track_scid=2000, seen_at=a_datetime("1 days ago")), # follow and like by both scouts: db.ScUser(scid=12, name="Artist with Track liked by both scouts"), db.ScTrack(scid=1001, name="Track liked by both scouts", artist_scid=12), db.ScLike( influencer_scid=1, track_scid=1001, seen_at=a_datetime("1 day and 2 seconds ago"), ), db.ScLike( influencer_scid=2, track_scid=1001, seen_at=a_datetime("2 hours ago") ), db.ScUser(scid=13, name="Artist followed by both scouts"), db.ScFollowing( influencer_scid=1, artist_scid=13, seen_at=a_datetime("1 day and 3 seconds ago"), ), db.ScFollowing( influencer_scid=2, artist_scid=13, seen_at=a_datetime("2 hours ago") ), # artist and track not liked or followed. db.ScUser(scid=30, name="Artist no one followed or liked"), db.ScTrack(scid=3000, name="Track no one liked", artist_scid=30), ) session.commit() from api import api app = api.app.test_client() _login(app) rv = app.get("/api/soundcloud_by_day") data = json_utils.loads(rv.data) print(json_utils.dumps(data, indent=2)) assert list(data["influencers"].keys()) == ["1"] returned_artist_names = set([i[1]["name"] for i in data["artists"].items()]) assert returned_artist_names == set([ "Artist With Liked Track", "Followed Artist", "Artist with Track liked by both scouts", "Artist followed by both scouts", ]) def test_twitter(session): # artists session.add( db.TrackedEntity( eid=101, twitter_id="artist1", name="artist1", is_influencer=False, twitter_last_update=None, twitter_data={ "followers_count": 50, "entities": ["https://mixcloud.com/"], }, # for artist filter... ) ) session.add( db.TrackedEntity( eid=102, twitter_id="artist2", name="artist2", is_influencer=False, twitter_last_update=None, twitter_data={ "followers_count": 50, "entities": ["https://mixcloud.com/"], }, # for artist filter... ) ) session.add( db.TrackedEntity( eid=103, twitter_id="artist3", name="artist3", is_influencer=False, twitter_last_update=None, twitter_data={ "followers_count": 50, "entities": ["https://mixcloud.com/"], }, # for artist filter... ) ) session.add( db.TrackedEntity( eid=104, twitter_id="artist4", name="artist4", is_influencer=False, twitter_last_update=None, twitter_data={ "followers_count": 50, "entities": ["https://mixcloud.com/"], }, # for artist filter... ) ) # My influencer session.add( db.TrackedEntity( eid=10, twitter_id="twt1", name="Joel Leslie", is_influencer=True, twitter_last_update=None, ) ) session.add(db.UsersTwInfluencers(username="test", eid=10)) # Other influencer session.add( db.TrackedEntity( eid=11, twitter_id="twt5", name="Others influencer", is_influencer=True, twitter_last_update=None, ) ) session.add(db.UsersTwInfluencers(username="not me", eid=11)) # follows session.add(db.Following(influencer_eid=10, followee_eid=101, datasource="twitter", seen_at=a_datetime('1 day ago'))) session.add(db.Following(influencer_eid=10, followee_eid=103, datasource="twitter", seen_at=a_datetime('1 day ago'))) session.add(db.Following(influencer_eid=11, followee_eid=102, datasource="twitter", seen_at=a_datetime('1 day ago'))) session.add(db.Following(influencer_eid=11, followee_eid=103, datasource="twitter", seen_at=a_datetime('1 day ago'))) # will appear in the 'justArtists' query session.add(db.Following(influencer_eid=10, followee_eid=104, datasource="twitter", seen_at=a_datetime('90 days and 10 seconds ago'))) session.commit() session.execute('refresh materialized view twitter_artist_activity') session.commit() from api import api app = api.app.test_client() _login(app) rv = app.get("/api/twitter_by_day") data = json_utils.loads(rv.data) print(json_utils.dumps(data, indent=2)) returned_influencer_eids = set(data["influencers"].keys()) returned_artist_names = set([i[1]["name"] for i in data["artists"].items()]) assert returned_influencer_eids == set(["10"]) assert returned_artist_names == set(["artist1", "artist3"]) assert len(data["activity"]) == 2 assert data.get('nextUrl'), "First request should have a next url" just_artists_query = app.get(data['nextUrl']) just_artists_data = json_utils.loads(just_artists_query.data) print(json_utils.dumps(just_artists_data, indent=2)) names = set([artist["name"] for artist in just_artists_data.values()]) assert names == set(["artist1", "artist3", 'artist4']), "All artists shuold be returned in the second request" def test_instagram(session): # artists session.add( db.InUser( inid="artist1", is_influencer=False, data_last_updated=datetime(2017, 1, 1), page_data={ 'entry_data': {'ProfilePage':[{ 'user' : { 'external_url': 'http://test.bandcamp.com' }}]} }, ) ) session.add( db.InUser( inid="artist2", is_influencer=False, data_last_updated=datetime(2017, 1, 1), page_data={'entry_data': {'ProfilePage':[{ 'user' : { 'external_url': 'http://test.bandcamp.com' }}]}}, ) ) session.add( db.InUser( inid="artist3", is_influencer=False, data_last_updated=datetime(2017, 1, 1), page_data={'entry_data': {'ProfilePage':[{ 'user' : { 'external_url': 'http://test.bandcamp.com' }}]}}, ) ) # My influencer session.add( db.InUser( inid="my_influencer", is_influencer=True, data_last_updated=datetime(2017, 1, 1), page_data={}, ) ) session.add(db.UsersInInfluencers(inid="my_influencer", username="test")) # Other influencer session.add( db.InUser( inid="other_influencer", is_influencer=True, data_last_updated=datetime(2017, 1, 1), page_data={}, ) ) session.add(db.UsersInInfluencers(inid="other_influencer", username="other_user")) session.flush() # follows session.add(db.InFollow(followed_by_inid="my_influencer", followee_inid="artist1")) session.add(db.InFollow(followed_by_inid="my_influencer", followee_inid="artist3")) session.add( db.InFollow(followed_by_inid="other_influencer", followee_inid="artist2") ) session.add( db.InFollow(followed_by_inid="other_influencer", followee_inid="artist3") ) session.commit() session.execute('refresh materialized view in_artists') session.commit() import pdb; pdb.set_trace() from api import api app = api.app.test_client() _login(app) rv = app.get("/api/instagram_by_day") data = json_utils.loads(rv.data) print(json_utils.dumps(data, indent=2)) returned_influencer_ids = set(data["influencers"].keys()) returned_artist_ids = set(data["artists"].keys()) assert returned_influencer_ids == set(["my_influencer"]) assert returned_artist_ids == set(["artist1", "artist3"]) assert len(data["activity"]) == 2