111 lines
3.9 KiB
Python
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
|