"""Die Sammlungen. Alle sehen alle, ändern darf jeder nur die eigene. Die Karten im Sammlungen-Reiter zeigen dieselben Daten wie im Katalog — die holt die Liste per Join nach. """ from app import db def katalogfilm(movie_id, **felder): """Film mit allem, was die Detailkarte zeigt.""" with db.connect() as conn: db.upsert( conn, { "id": movie_id, "title": "Alien", "year": 1979, "teaser": "Im Weltall hört dich niemand schreien.", "overview": "Die Nostromo fängt ein Signal auf.", "runtime": 117, "vote_average": 8.2, "vote_count": 14000, "genres": ["Horror", "Science Fiction"], "images": ["/a.jpg", "/b.jpg"], **felder, }, ) return movie_id def test_karte_bekommt_die_katalogdaten(client): client.post("/api/wishlist", json={"movie_id": katalogfilm(42)}) eintrag = client.get("/api/wishlist").json()[0] assert eintrag["teaser"].startswith("Im Weltall") assert eintrag["runtime"] == 117 assert eintrag["vote_average"] == 8.2 assert eintrag["vote_count"] == 14000 assert eintrag["genres"] == ["Horror", "Science Fiction"] assert eintrag["images"] == ["/a.jpg", "/b.jpg"] def test_film_ausserhalb_des_katalogs_bleibt_spaerlich(client, film): """Titel und Poster stehen in der Sammlung selbst, der Rest fehlt.""" client.post("/api/wishlist", json={"movie_id": film(7, "Irgendwas")}) eintrag = client.get("/api/wishlist").json()[0] assert eintrag["title"] == "Irgendwas" assert eintrag["teaser"] is None assert eintrag["genres"] == [] assert eintrag["images"] == [] def test_merken_und_wieder_vergessen(client): movie_id = katalogfilm(42) client.post("/api/wishlist", json={"movie_id": movie_id}) assert len(client.get("/api/wishlist").json()) == 1 assert client.delete(f"/api/wishlist/{movie_id}").json()["removed"] == 1 assert client.get("/api/wishlist").json() == [] def test_zweimal_merken_legt_nur_einen_an(client): movie_id = katalogfilm(42) client.post("/api/wishlist", json={"movie_id": movie_id}) client.post("/api/wishlist", json={"movie_id": movie_id}) assert len(client.get("/api/wishlist").json()) == 1 def test_fremde_sammlung_sieht_man_aber_raeumt_sie_nicht(client, client2): movie_id = katalogfilm(42) client.post("/api/wishlist", json={"movie_id": movie_id}) # Ben sieht Annas Eintrag, aber er gehört ihm nicht eintrag = client2.get("/api/wishlist").json()[0] assert eintrag["name"] == "Anna" assert eintrag["mine"] is False # Sein Löschversuch trifft nur die eigene Sammlung, also nichts assert client2.delete(f"/api/wishlist/{movie_id}").json()["removed"] == 0 assert len(client.get("/api/wishlist").json()) == 1 def test_jeder_hat_seine_eigene_sammlung(client, client2): movie_id = katalogfilm(42) client.post("/api/wishlist", json={"movie_id": movie_id}) client2.post("/api/wishlist", json={"movie_id": movie_id}) eintraege = client.get("/api/wishlist").json() assert len(eintraege) == 2 assert sorted(e["name"] for e in eintraege) == ["Anna", "Ben"] def test_sync_verschont_was_jemand_gemerkt_hat(client): """Der Katalog kennt nur Netflix und den Kanon. Gemerkte Filme müssen trotzdem drinbleiben — sonst verlieren ihre Karten alle Daten.""" gemerkt = katalogfilm(42) egal = katalogfilm(99, title="Niemandsfilm") client.post("/api/wishlist", json={"movie_id": gemerkt}) with db.connect() as conn: # Der Sync behält nur, was er gerade geholt hat — hier gar nichts weg = db.drop_missing(conn, []) uebrig = {r["id"] for r in conn.execute("SELECT id FROM movies")} assert weg == 1 assert uebrig == {gemerkt} assert egal not in uebrig