"""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