def test_count_all(factory: Factory, db: Connection): for _ in range(5): factory.artist(conn=db) count = artist.count(db) # The extra 1 is the Unknown Artist. assert count == 5 + 1
def test_search_page(factory: Factory, db: Connection): for _ in range(5): factory.artist(conn=db) a1 = artist.search(db, page=1, per_page=1)[0] a2 = artist.search(db, page=2, per_page=1)[0] assert a1 != a2
def test_create_bad_artist_ids(factory: Factory, db: Connection): art = factory.artist(conn=db) rls = factory.release(conn=db) with pytest.raises(NotFound) as e: track.create( title="new track", filepath=Path("/tmp/repertoire-library/09-track.m4a"), sha256_initial=b"0" * 32, release_id=rls.id, artists=[ { "artist_id": art.id, "role": ArtistRole.MAIN }, { "artist_id": 1000, "role": ArtistRole.MAIN }, { "artist_id": 1001, "role": ArtistRole.MAIN }, ], duration=9001, track_number="1", disc_number="2", conn=db, ) assert e.value.message is not None assert "Artist(s) 1000, 1001" in e.value.message
def test_fix_album_artists_track_artists(factory: Factory, db: Connection): rls = factory.release(artists=[], conn=db) art1 = factory.artist(conn=db) art2 = factory.artist(conn=db) factory.track( release_id=rls.id, artists=[ { "artist_id": art1.id, "role": ArtistRole.MAIN }, { "artist_id": art2.id, "role": ArtistRole.FEATURE }, ], conn=db, ) _fix_album_artists(db) rls = release.from_id(rls.id, db) # type: ignore assert rls is not None album_artists = release.artists(rls, db) assert len(album_artists) == 1 assert album_artists[0]["artist"].id == art1.id
def test_create_same_album_name_artist_subset_no_duplicate_trigger( factory: Factory, db: Connection, ): art1 = factory.artist(conn=db) art2 = factory.artist(conn=db) rls1 = factory.release( artists=[ { "artist_id": art1.id, "role": ArtistRole.MAIN }, { "artist_id": art2.id, "role": ArtistRole.MAIN }, ], conn=db, ) new_rls = release.create( title=rls1.title, artists=[{ "artist_id": art1.id, "role": ArtistRole.MAIN }], release_type=rls1.release_type, release_year=rls1.release_year, conn=db, allow_duplicate=False, ) assert rls1.id != new_rls.id
def test_search_filter_artists(factory: Factory, db: Connection): art1 = factory.artist(conn=db) art2 = factory.artist(conn=db) # Create some releases only on one artist. factory.release(artists=[{ "artist_id": art1.id, "role": ArtistRole.MAIN }], conn=db) factory.release(artists=[{ "artist_id": art2.id, "role": ArtistRole.MAIN }], conn=db) # Now create some for both; these are what we want to see in search results. releases = [ factory.release( artists=[ { "artist_id": art1.id, "role": ArtistRole.MAIN }, { "artist_id": art2.id, "role": ArtistRole.MAIN }, ], conn=db, ) for _ in range(5) ] out = release.search(db, artist_ids=[art1.id, art2.id]) assert set(releases) == set(out)
def test_update_duplicate(factory: Factory, db: Connection): art1 = factory.artist(conn=db) art2 = factory.artist(conn=db) with pytest.raises(Duplicate) as e: artist.update(art2, conn=db, name=art1.name) assert e.value.entity == art1
def test_add_artist(factory: Factory, db: Connection): trk = factory.track(conn=db) art = factory.artist(conn=db) track.add_artist(trk, art.id, ArtistRole.MAIN, db) artists = track.artists(trk, db) assert len(artists) == 2 assert art.id in [a["artist"].id for a in artists]
def test_add_artist(factory: Factory, db: Connection): rls = factory.release(artists=[], conn=db) art = factory.artist(conn=db) release.add_artist(rls, art.id, ArtistRole.MAIN, db) artists = release.artists(rls, db) assert len(artists) == 1 assert artists[0]["artist"].id == art.id
def test_releases(factory: Factory, db: Connection): art = factory.artist(conn=db) releases = { factory.release( artists=[{"artist_id": art.id, "role": ArtistRole.MAIN}], conn=db, ) for _ in range(4) } assert releases == set(artist.releases(art, db))
def test_image(factory: Factory, db: Connection): art = factory.artist(conn=db) img = factory.mock_image(conn=db) factory.release( artists=[{"artist_id": art.id, "role": ArtistRole.MAIN}], image_id=img.id, conn=db, ) new_img = artist.image(art, db) assert new_img is not None assert new_img.id == img.id
def test_search_one(factory: Factory, db: Connection): art = factory.artist(name="Baron East", conn=db) trk = factory.track( title="One Track", artists=[{ "artist_id": art.id, "role": ArtistRole.MAIN }], conn=db, ) out = track.search(search="Baron Track", conn=db) assert out == [trk]
def test_add_artist_failure(factory: Factory, db: Connection): art = factory.artist(conn=db) trk = factory.track( artists=[{ "artist_id": art.id, "role": ArtistRole.MAIN }], conn=db, ) with pytest.raises(AlreadyExists): track.add_artist(trk, art.id, ArtistRole.MAIN, db)
def test_search_filter_artists(factory: Factory, db: Connection): tracks = [factory.track(conn=db) for _ in range(5)] art1 = factory.artist(conn=db) art2 = factory.artist(conn=db) for trk in tracks[:3]: track.add_artist(trk, art1.id, ArtistRole.MAIN, db) for trk in tracks[1:]: track.add_artist(trk, art2.id, ArtistRole.MAIN, db) out = track.search(db, artist_ids=[art1.id, art2.id]) assert set(out) == set(tracks[1:3])
def test_search_search(factory: Factory, db: Connection): art = factory.artist(name="Aaron West", conn=db) rls = factory.release( title="Music for Sleepy Devs", artists=[ { "artist_id": art.id, "role": ArtistRole.MAIN }, ], conn=db, ) out = release.search(search="Aaron Sleepy", conn=db) assert out == [rls]
def test_add_artist_failure(factory: Factory, db: Connection): art = factory.artist(conn=db) rls = factory.release( artists=[ { "artist_id": art.id, "role": ArtistRole.MAIN }, ], conn=db, ) with pytest.raises(AlreadyExists): release.add_artist(rls, art.id, ArtistRole.MAIN, db)
def test_artists(factory: Factory, db: Connection): art = factory.artist(conn=db) trk = factory.track( artists=[{ "artist_id": art.id, "role": ArtistRole.MAIN }], conn=db, ) artists = track.artists(trk, db) assert len(artists) == 1 assert artists[0]["role"] == ArtistRole.MAIN assert artists[0]["artist"].id == art.id
def test_add_artist_new_role(factory: Factory, db: Connection): art = factory.artist(conn=db) trk = factory.track( artists=[{ "artist_id": art.id, "role": ArtistRole.MAIN }], conn=db, ) track.add_artist(trk, art.id, ArtistRole.REMIXER, db) artists = track.artists(trk, db) assert len(artists) == 2 assert all(art.id == a["artist"].id for a in artists)
def test_del_artist(factory: Factory, db: Connection): art = factory.artist(conn=db) rls = factory.release( artists=[ { "artist_id": art.id, "role": ArtistRole.MAIN }, ], conn=db, ) new_rls = release.del_artist(rls, 2, ArtistRole.MAIN, db) assert rls == new_rls assert release.artists(rls, 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_artists(factory: Factory, db: Connection): art1 = factory.artist(conn=db) art2 = factory.artist(conn=db) rls = factory.release( artists=[ { "artist_id": art1.id, "role": ArtistRole.MAIN }, { "artist_id": art2.id, "role": ArtistRole.MAIN }, ], conn=db, ) artists = release.artists(rls, db) assert {a["artist"].id for a in artists} == {art1.id, art2.id}
def test_create(factory: Factory, db: Connection): art = factory.artist(conn=db) rls = release.create( title="New Release", artists=[{ "artist_id": art.id, "role": ArtistRole.MAIN }], release_type=ReleaseType.ALBUM, release_year=2020, conn=db, ) assert rls == release.from_id(rls.id, db) artists = release.artists(rls, db) assert len(artists) == 1 assert artists[0]["artist"].id == art.id
def test_top_genres(factory: Factory, db: Connection): art = factory.artist(conn=db) releases = [ factory.release( artists=[{"artist_id": art.id, "role": ArtistRole.MAIN}], conn=db, ) for _ in range(4) ] genres = [factory.collection(type=CollectionType.GENRE, conn=db) for _ in range(4)] for i, rls in enumerate(releases): for col in genres[: i + 1]: collection.add_release(col, rls.id, db) tg = artist.top_genres(art, db) for i in range(4): assert tg[i]["genre"].id == genres[i].id assert tg[i]["num_matches"] == 4 - i
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_create(factory: Factory, db: Connection): art = factory.artist(conn=db) artists = [{"artist_id": art.id, "role": ArtistRole.MAIN}] rls = factory.release(conn=db) trk = track.create( title="new track", filepath=Path("/tmp/repertoire-library/09-track.m4a"), sha256_initial=b"0" * 32, release_id=rls.id, artists=artists, duration=9001, track_number="1", disc_number="2", conn=db, ) assert trk == track.from_id(trk.id, db) trk_arts = track.artists(trk, db) assert len(trk_arts) == 1 assert trk_arts[0]["artist"].id == art.id
def test_create_duplicate_allow(factory: Factory, db: Connection): art = factory.artist(conn=db) rls = factory.release( artists=[{ "artist_id": art.id, "role": ArtistRole.MAIN }], conn=db, ) new_rls = release.create( title=rls.title, artists=[{ "artist_id": art.id, "role": ArtistRole.MAIN }], release_type=rls.release_type, release_year=rls.release_year, conn=db, allow_duplicate=True, ) assert rls.id != new_rls.id
def test_create_duplicate_disallow(factory: Factory, db: Connection): art = factory.artist(conn=db) rls = factory.release( artists=[{ "artist_id": art.id, "role": ArtistRole.MAIN }], conn=db, ) with pytest.raises(Duplicate) as e: release.create( title=rls.title, artists=[{ "artist_id": art.id, "role": ArtistRole.MAIN }], release_type=rls.release_type, release_year=rls.release_year, conn=db, allow_duplicate=False, ) assert e.value.entity == rls
def test_del_artist_failure(factory: Factory, db: Connection): rls = factory.release(conn=db) art = factory.artist(conn=db) with pytest.raises(DoesNotExist): release.del_artist(rls, art.id, ArtistRole.MAIN, db)
def test_update_fields(factory: Factory, db: Connection): art = factory.artist(conn=db) new_art = artist.update(art, conn=db, name="New Name") assert new_art.name == "New Name" assert new_art == artist.from_id(art.id, db)