PlexLibrary, PlexShow, PlexSeason, PlexItem, PlexPerson, PlexCollection, PlexState, PlexLink, PlexPlaylist and PlexPlaylistItem leave app/models.py for app/plex/models.py; app.tables registers them. Every import is re-pointed; no schema change.
88 lines
3.3 KiB
Python
88 lines
3.3 KiB
Python
"""A movie or show card's "Add to collection": the collections it can go into, each saying whether the
|
|
title is in it already. DB lane (`db` fixture)."""
|
|
|
|
from datetime import datetime, timezone
|
|
|
|
from fastapi.testclient import TestClient
|
|
|
|
import app.state as state
|
|
from app.auth import current_user
|
|
from app.db import get_db
|
|
from app.main import app
|
|
from app.models import User
|
|
from app.plex.models import PlexCollection, PlexItem, PlexLibrary, PlexShow
|
|
|
|
|
|
def _seed(db):
|
|
movies = PlexLibrary(plex_key="1", title="Movies", kind="movie", enabled=True)
|
|
shows = PlexLibrary(plex_key="2", title="Shows", kind="show", enabled=True)
|
|
db.add_all([movies, shows])
|
|
db.flush()
|
|
enriched = datetime(2024, 1, 1, tzinfo=timezone.utc)
|
|
db.add_all(
|
|
[
|
|
PlexItem(
|
|
rating_key="m1",
|
|
title="Film",
|
|
kind="movie",
|
|
library_id=movies.id,
|
|
collection_keys=["cA"],
|
|
people_enriched_at=enriched,
|
|
),
|
|
PlexItem(
|
|
rating_key="e1",
|
|
title="An episode",
|
|
kind="episode",
|
|
library_id=shows.id,
|
|
people_enriched_at=enriched,
|
|
),
|
|
PlexShow(rating_key="s1", title="Series", library_id=shows.id, collection_keys=[]),
|
|
# The movie library's: two manual ones it can go into, and three it cannot.
|
|
PlexCollection(rating_key="cA", library_id=movies.id, title="Alpha", editable=True),
|
|
PlexCollection(rating_key="cB", library_id=movies.id, title="Beta", editable=True),
|
|
PlexCollection(rating_key="cP", library_id=movies.id, title="Plain", editable=False),
|
|
PlexCollection(
|
|
rating_key="cS", library_id=movies.id, title="Smart", editable=True, smart=True
|
|
),
|
|
PlexCollection(
|
|
rating_key="cI", library_id=movies.id, title="IMDb Top 250", editable=True
|
|
),
|
|
# The show library's own.
|
|
PlexCollection(rating_key="cT", library_id=shows.id, title="Sci-fi", editable=True),
|
|
]
|
|
)
|
|
user = User(email="collfor@example.com")
|
|
db.add(user)
|
|
db.commit()
|
|
return user
|
|
|
|
|
|
def _get(db, monkeypatch, override_dep, rk):
|
|
user = _seed(db)
|
|
monkeypatch.setattr(state, "_configured_cache", True)
|
|
override_dep(get_db, db.info["request"])
|
|
override_dep(current_user, lambda: user)
|
|
return TestClient(app).get(f"/api/plex/collections/for/{rk}")
|
|
|
|
|
|
def test_a_movie_lists_its_librarys_manual_collections_and_which_hold_it(
|
|
db, monkeypatch, override_dep
|
|
):
|
|
resp = _get(db, monkeypatch, override_dep, "m1")
|
|
assert resp.status_code == 200
|
|
got = [(c["id"], c["contains"]) for c in resp.json()["collections"]]
|
|
assert got == [("cA", True), ("cB", False)]
|
|
|
|
|
|
def test_a_show_lists_its_own_librarys(db, monkeypatch, override_dep):
|
|
resp = _get(db, monkeypatch, override_dep, "s1")
|
|
assert [(c["id"], c["contains"]) for c in resp.json()["collections"]] == [("cT", False)]
|
|
|
|
|
|
def test_an_episode_is_not_a_collection_member(db, monkeypatch, override_dep):
|
|
assert _get(db, monkeypatch, override_dep, "e1").status_code == 404
|
|
|
|
|
|
def test_an_unknown_key_is_not_found(db, monkeypatch, override_dep):
|
|
assert _get(db, monkeypatch, override_dep, "nope").status_code == 404
|