예제 #1
0
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
예제 #2
0
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])
예제 #3
0
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
예제 #4
0
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
예제 #5
0
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}
예제 #6
0
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
예제 #7
0
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
예제 #8
0
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}
예제 #9
0
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
예제 #10
0
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])
예제 #11
0
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
예제 #12
0
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
예제 #13
0
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]
예제 #14
0
def test_exists(factory: Factory, db: Connection):
    ply = factory.playlist(conn=db)
    assert playlist.exists(ply.id, db)
예제 #15
0
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"
예제 #16
0
def test_search_all(factory: Factory, db: Connection):
    plys = {factory.playlist(conn=db) for _ in range(5)}
    assert plys == set(playlist.search(db))
예제 #17
0
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
예제 #18
0
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")
예제 #19
0
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)
예제 #20
0
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)
예제 #21
0
def test_create_duplicate(factory: Factory, db: Connection):
    ply = factory.playlist(conn=db)
    with pytest.raises(Duplicate):
        playlist.create(ply.name, ply.type, db)
예제 #22
0
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
예제 #23
0
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
예제 #24
0
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
예제 #25
0
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
예제 #26
0
def test_image_nonexistent(factory: Factory, db: Connection):
    ply = factory.playlist(conn=db)
    assert playlist.image(ply, db) is None
예제 #27
0
def test_create_invalid_track(factory: Factory, db: Connection):
    ply = factory.playlist(conn=db)
    with pytest.raises(NotFound):
        pentry.create(ply.id, 9999999, db)
예제 #28
0
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
예제 #29
0
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
예제 #30
0
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"