This commit is contained in:
team3
2026-09-17 12:14:40 +02:00
parent b42cf64782
commit a1684cf54f
11 changed files with 181 additions and 29 deletions

View File

@@ -52,14 +52,36 @@ def frische_db(app_start):
main.letzter_dreh.update(ergebnis=None, start=0.0)
# Ein Client je Person — jeder hält sein eigenes Cookie
def _anmelden(client, name):
"""Namen anlegen, falls nötig, und für diesen Client wählen."""
antwort = client.post("/api/users", json={"name": name})
if antwort.status_code == 200:
user_id = antwort.json()["id"]
else:
runde = client.get("/api/users").json()["items"]
user_id = next(u["id"] for u in runde if u["name"] == name)
return client.post("/api/users/waehlen", json={"user_id": user_id}).json()["mine"]
# Ein Client je Person — jeder hält sein eigenes Cookie. Beide stehen in
# der Runde, denn ohne Namen darf niemand etwas eintragen.
@pytest.fixture
def client():
return TestClient(main.app)
c = TestClient(main.app)
_anmelden(c, "Anna")
return c
@pytest.fixture
def client2():
c = TestClient(main.app)
_anmelden(c, "Ben")
return c
@pytest.fixture
def zuschauer():
"""Ohne gewählten Namen: darf alles lesen, nichts schreiben."""
return TestClient(main.app)
@@ -78,14 +100,4 @@ def film():
@pytest.fixture
def anmelden():
"""Client wählt einen Namen; legt ihn an, falls es ihn noch nicht gibt."""
def waehlen(client, name):
antwort = client.post("/api/users", json={"name": name})
if antwort.status_code == 200:
user_id = antwort.json()["id"]
else:
runde = client.get("/api/users").json()["items"]
user_id = next(u["id"] for u in runde if u["name"] == name)
return client.post("/api/users/waehlen", json={"user_id": user_id}).json()["mine"]
return waehlen
return _anmelden

View File

@@ -39,8 +39,10 @@ def test_namenswechsel_laesst_alte_eintraege_beim_alten_namen(client, anmelden,
assert client.get("/api/suggestions").json()["mine"] == als_anna["id"]
def test_ohne_namen_zaehlt_die_sitzung(client, client2, film):
vorschlag = client.post("/api/suggestions", json={"movie_id": film(1)}).json()
assert vorschlag["name"] is None
assert client.get("/api/suggestions").json()["mine"] == vorschlag["id"]
assert client2.get("/api/suggestions").json()["mine"] is None
def test_abwaehlen_macht_wieder_zum_zuschauer(client, film):
client.post("/api/suggestions", json={"movie_id": film(1)})
client.post("/api/users/waehlen", json={"user_id": None})
assert client.get("/api/users").json()["mine"] is None
# Lesen geht weiter, Schreiben nicht mehr
assert client.get("/api/suggestions").json()["mine"] is None
assert client.post("/api/suggestions", json={"movie_id": film(2)}).status_code == 403

View File

@@ -0,0 +1,74 @@
"""Der Zuschauer: kein Name gewählt, also nur mitlesen.
Gedacht für alle, die noch nicht in der Runde stehen. Sie sollen den
Katalog, das Rad und die Wertungen der anderen sehen, aber nichts
eintragen — sonst hinge ihr Kram allein am Cookie.
"""
import pytest
# Jede Zeile: wie die Anfrage aussieht, wenn ein Zuschauer sie stellt
SCHREIBEN = [
("post", "/api/suggestions", {"movie_id": 1}),
("delete", "/api/suggestions", None),
("post", "/api/wishlist", {"movie_id": 1}),
("delete", "/api/wishlist/1", None),
("post", "/api/features", {"text": "Dunkles Design"}),
]
@pytest.mark.parametrize("methode,pfad,daten", SCHREIBEN)
def test_zuschauer_darf_nicht_schreiben(zuschauer, film, methode, pfad, daten):
film(1)
# DELETE nimmt bei TestClient keinen json-Parameter
anfrage = getattr(zuschauer, methode)
antwort = anfrage(pfad, json=daten) if daten is not None else anfrage(pfad)
assert antwort.status_code == 403
def test_zuschauer_darf_nicht_bewerten(zuschauer, client, film):
eintrag = client.post("/api/watched", json={"movie_id": film(1)}).json()
antwort = zuschauer.post(
f"/api/watched/{eintrag['id']}/rating", json={"stars": 5, "text": "stark"}
)
assert antwort.status_code == 403
assert zuschauer.get("/api/watched").json()[0]["count"] == 0
def test_zuschauer_darf_nicht_abstimmen_oder_ergaenzen(zuschauer, client):
wunsch = client.post("/api/features", json={"text": "Dunkles Design"}).json()[0]
assert zuschauer.post(f"/api/features/{wunsch['id']}/vote").status_code == 403
assert (
zuschauer.post(
f"/api/features/{wunsch['id']}/notes", json={"text": "dazu"}
).status_code
== 403
)
assert zuschauer.get("/api/features").json()[0]["votes"] == 0
def test_zuschauer_darf_alles_lesen(zuschauer, client, film):
client.post("/api/suggestions", json={"movie_id": film(1)})
client.post("/api/wishlist", json={"movie_id": film(2)})
client.post("/api/features", json={"text": "Dunkles Design"})
client.post("/api/watched", json={"movie_id": film(3)})
for pfad in ("/api/movies", "/api/suggestions", "/api/wishlist",
"/api/features", "/api/watched", "/api/users", "/api/spin"):
assert zuschauer.get(pfad).status_code == 200
# Fremdes gehört ihm nicht
assert zuschauer.get("/api/suggestions").json()["mine"] is None
assert zuschauer.get("/api/wishlist").json()[0]["mine"] is False
assert zuschauer.get("/api/features").json()[0]["mine"] is False
def test_host_kommt_ohne_namen_an_seine_knoepfe(zuschauer, client, film):
"""Den Hostmodus kennt nur der Browser — seine Routen bleiben offen."""
client.post("/api/suggestions", json={"movie_id": film(1)})
eintrag = zuschauer.post("/api/watched", json={"movie_id": film(2)}).json()
assert zuschauer.patch(
f"/api/watched/{eintrag['id']}", json={"hidden": True}
).status_code == 200
assert zuschauer.post("/api/spin").json()["started"] is True
assert zuschauer.delete("/api/suggestions/alle").status_code == 200