Ejemplo n.º 1
0
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()
Ejemplo n.º 2
0
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,
        )
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
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
Ejemplo n.º 7
0
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
Ejemplo n.º 8
0
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
Ejemplo n.º 9
0
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
Ejemplo n.º 10
0
def test_release(factory: Factory, db: Connection):
    trk = factory.track(conn=db)
    assert track.release(trk, db).id == trk.release_id
Ejemplo n.º 11
0
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
Ejemplo n.º 12
0
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
Ejemplo n.º 13
0
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
Ejemplo n.º 14
0
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
Ejemplo n.º 15
0
def test_count_all(factory: Factory, db: Connection):
    for _ in range(5):
        factory.track(conn=db)

    count = track.count(db)
    assert count == 5
Ejemplo n.º 16
0
def test_exists(factory: Factory, db: Connection):
    trk = factory.track(conn=db)
    assert track.exists(trk.id, db)
Ejemplo n.º 17
0
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
Ejemplo n.º 18
0
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
Ejemplo n.º 19
0
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
Ejemplo n.º 20
0
def test_update_nothing(factory: Factory, db: Connection):
    trk = factory.track(conn=db)
    new_trk = track.update(trk, conn=db)
    assert trk == new_trk
Ejemplo n.º 21
0
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}
Ejemplo n.º 22
0
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)