async def test_get_track(factory: Factory, db: Connection, quart_client): path = Path.cwd() / "track01.flac" with path.open("wb") as f: f.write(b"owo") trk = factory.track(filepath=path, conn=db) _, token = factory.user(conn=db) db.commit() response = await quart_client.authed_get( f"/api/files/tracks/{trk.id}", token=token, ) assert b"owo" == await response.get_data()
def test_create_duplicate_filepath(factory: Factory, db: Connection): trk = factory.track(conn=db) with pytest.raises(Duplicate): track.create( title="Airwaves", filepath=trk.filepath, sha256_initial=b"0" * 32, release_id=trk.release_id, artists=[], duration=9001, track_number="1", disc_number="1", conn=db, )
def test_insert_and_query(factory: Factory, db: Connection): art = factory.artist(name="Aaron West", conn=db) trk = factory.track( title="Our Apartment", artists=[{ "artist_id": art.id, "role": ArtistRole.MAIN }], conn=db, ) cursor = db.execute(""" SELECT rowid FROM music__tracks__fts WHERE music__tracks__fts MATCH '"Aaron" AND "Our Apartment"' ORDER BY rank """) assert cursor.fetchone()[0] == trk.id
def test_del_artist_failure(factory: Factory, db: Connection): art = factory.artist(conn=db) trk = factory.track( artists=[{ "artist_id": art.id, "role": ArtistRole.MAIN }], conn=db, ) # Wrong ID. with pytest.raises(DoesNotExist): track.del_artist(trk, art.id + 1, ArtistRole.MAIN, db) # Wrong role. with pytest.raises(DoesNotExist): track.del_artist(trk, art.id, ArtistRole.REMIXER, db)
def test_update_fields(factory: Factory, db: Connection): trk = factory.track(conn=db) rls = factory.release(conn=db) new_trk = track.update( trk, conn=db, title="New Title", release_id=rls.id, track_number="X Æ", disc_number="A-12", ) assert new_trk.title == "New Title" assert new_trk.release_id == rls.id assert new_trk.track_number == "X Æ" assert new_trk.disc_number == "A-12" assert new_trk == track.from_id(trk.id, db)
def test_top_genres(factory: Factory, db: Connection): ply = factory.playlist(conn=db) releases = [factory.release(conn=db) for _ in range(4)] genres = [ factory.collection(type=CollectionType.GENRE, conn=db) for _ in range(4) ] for i, rls in enumerate(releases): trk = factory.track(release_id=rls.id, conn=db) pentry.create(ply.id, trk.id, db) for grn in genres[:i + 1]: collection.add_release(grn, rls.id, db) tg = playlist.top_genres(ply, db) for i in range(4): assert tg[i]["genre"].id == genres[i].id assert tg[i]["num_matches"] == 4 - i
def test_create_same_initial_sha256_different_full(factory: Factory, db: Connection): filepath, sha256sum = _create_dummy_file_with_hash(factory) trk = factory.track(sha256_initial=sha256sum, conn=db) new_trk = track.create( title="new track", filepath=filepath, sha256_initial=sha256sum, sha256=b"0" * 32, release_id=trk.release_id, artists=[], duration=9001, track_number="1", disc_number="2", conn=db, ) assert new_trk.id != trk.id
def test_del_artist(factory: Factory, db: Connection): art = factory.artist(conn=db) trk = factory.track( artists=[ { "artist_id": art.id, "role": ArtistRole.MAIN }, { "artist_id": art.id, "role": ArtistRole.REMIXER }, ], conn=db, ) track.del_artist(trk, art.id, ArtistRole.REMIXER, db) artists = track.artists(trk, db) assert len(artists) == 1 assert artists[0]["role"] == ArtistRole.MAIN
def test_search_all(factory: Factory, db: Connection): tracks = {factory.track(conn=db) for _ in range(5)} out = track.search(conn=db) assert set(out) == tracks
def test_release(factory: Factory, db: Connection): trk = factory.track(conn=db) assert track.release(trk, db).id == trk.release_id
def test_delete(factory: Factory, db: Connection): trk = factory.track(conn=db) track.delete(trk, db) assert track.from_id(trk.id, db) is None
def test_from_filepath_success(factory: Factory, db: Connection): trk = factory.track(conn=db) new_trk = track.from_filepath(trk.filepath, db) assert new_trk == trk
def test_from_id_success(factory: Factory, db: Connection): trk = factory.track(conn=db) new_trk = track.from_id(trk.id, db) assert new_trk == trk
def test_count_one(factory: Factory, db: Connection): tracks = [factory.track(conn=db) for _ in range(5)] count = track.count(db, search=tracks[0].title) assert count == 1
def test_count_all(factory: Factory, db: Connection): for _ in range(5): factory.track(conn=db) count = track.count(db) assert count == 5
def test_exists(factory: Factory, db: Connection): trk = factory.track(conn=db) assert track.exists(trk.id, db)
def test_search_sort_recently_added(factory: Factory, db: Connection): tracks = [factory.track(conn=db) for _ in range(5)] out = track.search(sort=TrackSort.RECENTLY_ADDED, asc=True, conn=db) # The order of tracks is already by recently added. assert tracks == out
def test_from_sha256_success(factory: Factory, db: Connection): trk = factory.track(sha256=b"0" * 32, conn=db) assert trk.sha256 is not None new_trk = track.from_sha256(trk.sha256, db) assert new_trk == trk
def test_track(factory: Factory, db: Connection): trk = factory.track(conn=db) ety = factory.playlist_entry(track_id=trk.id, conn=db) assert pentry.track(ety, db).id == trk.id
def test_update_nothing(factory: Factory, db: Connection): trk = factory.track(conn=db) new_trk = track.update(trk, conn=db) assert trk == new_trk
def test_release_tracks(factory: Factory, db: Connection): rls = factory.release(conn=db) tracks = [factory.track(release_id=rls.id, conn=db) for _ in range(5)] out = release.tracks(rls, db) assert {t.id for t in tracks} == {t.id for t in out}
def _add_test_data(conn: Connection): factory = Factory() # These start at ID 1. usr_admin, _ = factory.user(nickname="admin", conn=conn) usr_blissful, _ = factory.user(nickname="blissful", conn=conn) # These start at ID 2. artists = [ factory.artist(name="Artist1", conn=conn), factory.artist(name="Artist2", conn=conn), factory.artist(name="Artist3", conn=conn, starred_for_user=usr_admin.id), factory.artist(name="Artist4", conn=conn), factory.artist(name="Artist5", conn=conn), ] # These start at ID 5. collages = [ factory.collection(name="Collage1", type=CollectionType.COLLAGE, conn=conn), factory.collection(name="Collage2", type=CollectionType.COLLAGE, conn=conn), factory.collection( name="Collage3", type=CollectionType.COLLAGE, conn=conn, starred_for_user=usr_admin.id, ), ] labels = [ factory.collection(name="Label1", type=CollectionType.LABEL, conn=conn), factory.collection(name="Label2", type=CollectionType.LABEL, conn=conn), factory.collection(name="Label3", type=CollectionType.LABEL, conn=conn), ] genres = [ factory.collection(name="Genre1", type=CollectionType.GENRE, conn=conn), factory.collection(name="Genre2", type=CollectionType.GENRE, conn=conn), factory.collection(name="Genre3", type=CollectionType.GENRE, conn=conn), ] # These start at ID 1. images = [ factory.mock_image(path=Path.cwd() / "image1.png", conn=conn), factory.mock_image(path=Path.cwd() / "image2.png", conn=conn), factory.mock_image(path=Path.cwd() / "image3.png", conn=conn), ] # These start at ID 1. [ factory.invite(by_user=usr_admin, conn=conn), factory.invite(by_user=usr_blissful, conn=conn), factory.invite(by_user=usr_admin, conn=conn, expired=True), factory.invite(by_user=usr_admin, conn=conn, used_by=usr_blissful), ] # These start at ID 3. playlists = [ factory.playlist(name="Playlist1", type=PlaylistType.PLAYLIST, conn=conn), factory.playlist(name="Playlist2", type=PlaylistType.PLAYLIST, conn=conn), factory.playlist( name="Playlist3", type=PlaylistType.PLAYLIST, conn=conn, starred_for_user=usr_admin.id, ), ] # These start at ID 2. releases = [ factory.release( title="Release1", artists=[ { "artist_id": artists[0].id, "role": ArtistRole.MAIN }, { "artist_id": artists[1].id, "role": ArtistRole.MAIN }, ], release_type=ReleaseType.ALBUM, release_year=1970, release_date=date(1970, 2, 5), rating=8, image_id=images[0].id, conn=conn, ), factory.release( title="Release2", artists=[ { "artist_id": artists[1].id, "role": ArtistRole.MAIN }, { "artist_id": artists[2].id, "role": ArtistRole.MAIN }, ], release_type=ReleaseType.ALBUM, release_year=1980, release_date=None, rating=None, image_id=None, conn=conn, ), factory.release( title="Release3", artists=[ { "artist_id": artists[3].id, "role": ArtistRole.MAIN }, ], release_type=ReleaseType.COMPILATION, release_year=1990, release_date=date(1970, 2, 5), rating=None, image_id=images[1].id, conn=conn, ), factory.release( title="Release4", artists=[ { "artist_id": artists[0].id, "role": ArtistRole.MAIN }, { "artist_id": artists[2].id, "role": ArtistRole.MAIN }, { "artist_id": artists[4].id, "role": ArtistRole.MAIN }, ], release_type=ReleaseType.UNKNOWN, release_year=2000, release_date=None, rating=2, image_id=None, conn=conn, ), factory.release( title="Release5", artists=[], release_type=ReleaseType.EP, release_year=2010, release_date=None, rating=5, image_id=images[2].id, conn=conn, ), ] collection.add_release(collages[0], releases[0].id, conn) collection.add_release(collages[0], releases[1].id, conn) collection.add_release(collages[0], releases[2].id, conn) collection.add_release(collages[1], releases[0].id, conn) collection.add_release(labels[0], releases[0].id, conn) collection.add_release(labels[0], releases[1].id, conn) collection.add_release(labels[1], releases[2].id, conn) collection.add_release(labels[1], releases[3].id, conn) collection.add_release(genres[0], releases[0].id, conn) collection.add_release(genres[0], releases[1].id, conn) collection.add_release(genres[0], releases[2].id, conn) collection.add_release(genres[1], releases[0].id, conn) collection.add_release(genres[1], releases[1].id, conn) collection.add_release(genres[1], releases[2].id, conn) collection.add_release(genres[2], releases[3].id, conn) collection.add_release(genres[2], releases[4].id, conn) # These start at ID 0. r1tracks = [ factory.track( title=f"Track{i}", filepath=Path.cwd() / "music" / f"track{i+1}.flac", sha256=bytes([i] * 32), release_id=releases[0].id, artists=[ { "artist_id": artists[0].id, "role": ArtistRole.MAIN }, { "artist_id": artists[1].id, "role": ArtistRole.PRODUCER }, ], duration=i + 1, track_number=str(i), disc_number="1", conn=conn, ) for i in range(3) ] r2tracks = [ factory.track( title=f"Track{i}", filepath=Path.cwd() / "music" / f"track{i+1}.flac", sha256=bytes([i] * 32), release_id=releases[1].id, artists=[ { "artist_id": artists[1].id, "role": ArtistRole.MAIN }, { "artist_id": artists[2].id, "role": ArtistRole.FEATURE }, ], duration=i + 1, track_number=str(i), disc_number=str(i), conn=conn, ) for i in range(3, 5) ] r3tracks = [ factory.track( title=f"Track{i}", filepath=Path.cwd() / "music" / f"track{i+1}.flac", sha256=bytes([i] * 32), release_id=releases[2].id, artists=[{ "artist_id": artists[3].id, "role": ArtistRole.MAIN }], duration=i + 1, track_number=str(i), disc_number="1", conn=conn, ) for i in range(5, 8) ] r4tracks = [ factory.track( title=f"Track{i}", filepath=Path.cwd() / "music" / f"track{i+1}.flac", sha256=bytes([i] * 32), release_id=releases[3].id, artists=[ { "artist_id": artists[0].id, "role": ArtistRole.MAIN }, { "artist_id": artists[2].id, "role": ArtistRole.FEATURE }, { "artist_id": artists[4].id, "role": ArtistRole.REMIXER }, ], duration=i + 1, track_number=str(i), disc_number="1", conn=conn, ) for i in range(8, 13) ] r5tracks = [ factory.track( title=f"Track{i}", filepath=Path.cwd() / "music" / f"track{i+1}.flac", sha256=bytes([i] * 32), release_id=releases[4].id, artists=[], duration=i + 1, track_number=str(i), disc_number=str(i), conn=conn, ) for i in range(13, 15) ] tracks = r1tracks + r2tracks + r3tracks + r4tracks + r5tracks # These start at ID 1. for trk in tracks[:5]: pentry.create(playlists[0].id, trk.id, conn) for trk in tracks[5:8]: pentry.create(playlists[1].id, trk.id, conn) for trk in tracks[5:10]: pentry.create(playlists[2].id, trk.id, conn)