Files
horror/backend/tests/test_wishlist.py
2026-09-17 15:40:28 +02:00

111 lines
3.9 KiB
Python

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