def test_search_page(factory: Factory, db: Connection): for _ in range(5): factory.playlist(conn=db) p1 = playlist.search(db, page=1, per_page=1)[0] p2 = playlist.search(db, page=2, per_page=1)[0] assert p1 != p2
def test_search_user(factory: Factory, db: Connection): usr, _ = factory.user(conn=db) unused_usr, _ = factory.user(conn=db) ply1 = factory.playlist(type=PlaylistType.PERSONAL, user=usr, conn=db) ply2 = factory.playlist(type=PlaylistType.PERSONAL, user=usr, conn=db) ply3 = factory.playlist(type=PlaylistType.PERSONAL, user=unused_usr, conn=db) ply3 = factory.playlist(conn=db) plys = playlist.search(db, user_ids=[usr.id]) ids = [p.id for p in plys] assert all(p.id in ids for p in [ply1, ply2]) assert not any(p.id in ids for p in [ply3, ply3])
def test_create_success(factory: Factory, db: Connection): ply = factory.playlist(conn=db) trk = factory.track(conn=db) ety = pentry.create(ply.id, trk.id, db) assert ety.track_id == trk.id assert ety.playlist_id == ply.id assert ety.position == 1
def test_update( position: int, final_order: list[int], factory: Factory, db: Connection, ): ply = factory.playlist(conn=db) entries = [factory.playlist_entry(playlist_id=ply.id, conn=db) for _ in range(5)] ety = pentry.update(entries[2], position=position, conn=db) assert ety.position == position cursor = db.execute( """ SELECT id FROM music__playlists_tracks WHERE playlist_id = ? ORDER BY position ASC """, (ply.id,), ) order = [row["id"] for row in cursor] expected = [entries[i].track_id for i in final_order] assert order == expected
def test_from_name_and_type(factory: Factory, db: Connection): usr1, _ = factory.user(conn=db) ply1 = factory.playlist(name="test", type=PlaylistType.SYSTEM, user=usr1, conn=db) usr2, _ = factory.user(conn=db) ply2 = factory.playlist(name="test", type=PlaylistType.SYSTEM, user=usr2, conn=db) factory.playlist(name="other", type=PlaylistType.PLAYLIST, conn=db) plys = playlist.from_name_and_type("test", PlaylistType.SYSTEM, conn=db) assert {p.id for p in plys} == {ply1.id, ply2.id}
def test_update_duplicate(factory: Factory, db: Connection): ply1 = factory.playlist(conn=db) ply2 = factory.playlist(conn=db) with pytest.raises(Duplicate) as e: playlist.update(ply2, conn=db, name=ply1.name) assert e.value.entity == ply1
def test_query(factory: Factory, db: Connection): ply = factory.playlist(name="AAAAAA", conn=db) cursor = db.execute( """ SELECT rowid FROM music__playlists__fts WHERE music__playlists__fts MATCH '"AAAAAA"' ORDER BY rank """ ) assert cursor.fetchone()[0] == ply.id
def test_entries(factory: Factory, db: Connection): ply = factory.playlist(conn=db) tracks = [factory.track(conn=db) for _ in range(5)] for trk in tracks: pentry.create(ply.id, trk.id, db) track_ids = {trk.id for trk in tracks} entries = playlist.entries(ply, db) assert track_ids == {e.track_id for e in entries}
def test_image(factory: Factory, db: Connection): ply = factory.playlist(conn=db) img = factory.mock_image(conn=db) rls = factory.release(image_id=img.id, conn=db) trk = factory.track(release_id=rls.id, conn=db) pentry.create(ply.id, trk.id, db) new_img = playlist.image(ply, db) assert new_img is not None assert new_img.id == img.id
def test_search_filter_playlists(factory: Factory, db: Connection): tracks = [factory.track(conn=db) for _ in range(5)] ply1 = factory.playlist(conn=db) ply2 = factory.playlist(conn=db) for trk in tracks[:3]: pentry.create(ply1.id, trk.id, db) for trk in tracks[1:]: pentry.create(ply2.id, trk.id, db) out = track.search(db, playlist_ids=[ply1.id, ply2.id]) assert set(out) == set(tracks[1:3])
def test_delete(factory: Factory, db: Connection): ply = factory.playlist(conn=db) entries = [factory.playlist_entry(playlist_id=ply.id, conn=db) for _ in range(5)] pentry.delete(entries[2], db) new_entries = playlist.entries(ply, db) assert entries[2].id not in {e.id for e in new_entries} for i, ety in enumerate(entries[:2] + entries[3:], start=1): new_ety = pentry.from_id(ety.id, db) assert new_ety is not None assert new_ety.position == i
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_search_one(factory: Factory, db: Connection): plys = [factory.playlist(conn=db) for _ in range(5)] out = playlist.search(db, types=[plys[0].type], search=plys[0].name) assert plys[0] == out[0]
def test_exists(factory: Factory, db: Connection): ply = factory.playlist(conn=db) assert playlist.exists(ply.id, db)
def test_search_name(factory: Factory, db: Connection): factory.playlist(name="AAAAAA", conn=db) plys = playlist.search(db, search="AaA") assert len(plys) == 1 assert plys[0].name == "AAAAAA"
def test_search_all(factory: Factory, db: Connection): plys = {factory.playlist(conn=db) for _ in range(5)} assert plys == set(playlist.search(db))
def test_count_one(factory: Factory, db: Connection): plys = [factory.playlist(conn=db) for _ in range(5)] count = playlist.count(db, types=[plys[0].type], search=plys[0].name) assert count == 1
def test_update_immutable(factory: Factory, db: Connection): usr, _ = factory.user(conn=db) ply = factory.playlist(type=PlaylistType.SYSTEM, user=usr, conn=db) with pytest.raises(Immutable): playlist.update(ply, conn=db, name="New Name")
def test_count_all(factory: Factory, db: Connection): plys = [factory.playlist(conn=db) for _ in range(5)] count = playlist.count(db) assert count == len(plys)
def test_update_out_of_bounds(position: int, factory: Factory, db: Connection): ply = factory.playlist(conn=db) entries = [factory.playlist_entry(playlist_id=ply.id, conn=db) for _ in range(5)] with pytest.raises(IndexError): pentry.update(entries[2], position=position, conn=db)
def test_create_duplicate(factory: Factory, db: Connection): ply = factory.playlist(conn=db) with pytest.raises(Duplicate): playlist.create(ply.name, ply.type, db)
def test_unstar(factory: Factory, db: Connection): usr, _ = factory.user(conn=db) ply = factory.playlist(conn=db, starred_for_user=usr.id) playlist.unstar(ply, usr.id, db) assert not playlist.starred(ply, usr.id, db) is True
def test_star(factory: Factory, db: Connection): usr, _ = factory.user(conn=db) ply = factory.playlist(conn=db) playlist.star(ply, usr.id, db) assert playlist.starred(ply, usr.id, db) is True
def test_from_id_success(factory: Factory, db: Connection): ply = factory.playlist(conn=db) new_ply = playlist.from_id(ply.id, db) assert new_ply == ply
def test_playlist(factory: Factory, db: Connection): ply = factory.playlist(conn=db) ety = factory.playlist_entry(playlist_id=ply.id, conn=db) assert pentry.playlist(ety, db).id == ply.id
def test_image_nonexistent(factory: Factory, db: Connection): ply = factory.playlist(conn=db) assert playlist.image(ply, db) is None
def test_create_invalid_track(factory: Factory, db: Connection): ply = factory.playlist(conn=db) with pytest.raises(NotFound): pentry.create(ply.id, 9999999, db)
def test_from_name_type_user_success(factory: Factory, db: Connection): ply = factory.playlist(conn=db) new_ply = playlist.from_name_type_user(ply.name, ply.type, db) assert ply == new_ply
def test_from_name_type_user_with_user_id(factory: Factory, db: Connection): usr, _ = factory.user(conn=db) ply = factory.playlist(conn=db, type=PlaylistType.PERSONAL, user=usr) new_ply = playlist.from_name_type_user(ply.name, ply.type, db, usr.id) assert ply == new_ply
def test_update_fields(factory: Factory, db: Connection): ply = factory.playlist(conn=db) new_ply = playlist.update(ply, conn=db, name="New Name") assert new_ply == playlist.from_id(ply.id, db) assert new_ply.name == "New Name"