update
This commit is contained in:
94
backend/tests/test_suggestions.py
Normal file
94
backend/tests/test_suggestions.py
Normal file
@@ -0,0 +1,94 @@
|
||||
"""Die Ziehung: Streifen, Stopps, Gewinner."""
|
||||
|
||||
from app import suggestions
|
||||
from app.suggestions import BRUCH_DAUER, DREH_DAUER, STREIFEN_LAENGE, STREIFEN_ZIEL
|
||||
|
||||
|
||||
def vorschlagen(client, movie_id):
|
||||
antwort = client.post("/api/suggestions", json={"movie_id": movie_id})
|
||||
assert antwort.status_code == 200
|
||||
return antwort.json()
|
||||
|
||||
|
||||
def test_zweiter_vorschlag_ersetzt_den_ersten(client, film):
|
||||
vorschlagen(client, film(1))
|
||||
neu = vorschlagen(client, film(2))
|
||||
|
||||
liste = client.get("/api/suggestions").json()
|
||||
assert [e["movie_id"] for e in liste["items"]] == [2]
|
||||
assert liste["mine"] == neu["id"]
|
||||
|
||||
|
||||
def test_dreh_liefert_streifen_und_gewinner(client, client2, film):
|
||||
vorschlagen(client, film(1))
|
||||
vorschlagen(client2, film(2))
|
||||
|
||||
ergebnis = client.post("/api/spin").json()
|
||||
|
||||
assert ergebnis["started"] is True
|
||||
assert [k["movie_id"] for k in ergebnis["karten"]] == [1, 2]
|
||||
assert len(ergebnis["streifen"]) == STREIFEN_LAENGE
|
||||
assert set(ergebnis["streifen"]) <= {0, 1}
|
||||
stopps = ergebnis["stopps"]
|
||||
assert len(stopps) in (1, 2)
|
||||
assert all(set(s) == {"position", "versatz"} for s in stopps)
|
||||
assert stopps[0]["position"] == STREIFEN_ZIEL
|
||||
assert ergebnis["gewinner"] == ergebnis["karten"][ergebnis["index"]]
|
||||
|
||||
|
||||
def test_ziehung_haelt_auf_dem_gewinner(client, client2, film):
|
||||
vorschlagen(client, film(1))
|
||||
vorschlagen(client2, film(2))
|
||||
|
||||
stopp_anzahlen = set()
|
||||
for _ in range(60):
|
||||
e = suggestions.ziehen()
|
||||
stopps = e["stopps"]
|
||||
stopp_anzahlen.add(len(stopps))
|
||||
# Der letzte Halt zeigt den Gewinner
|
||||
assert e["streifen"][stopps[-1]["position"]] == e["index"]
|
||||
assert all(-0.5 < s["versatz"] < 0.5 for s in stopps)
|
||||
if len(stopps) == 2:
|
||||
# Bruch: ein paar Poster zurück, der erste Halt zeigt einen anderen
|
||||
assert 1 <= stopps[0]["position"] - stopps[1]["position"] <= 4
|
||||
assert e["streifen"][stopps[0]["position"]] != e["index"]
|
||||
assert e["dauer"] == DREH_DAUER + BRUCH_DAUER
|
||||
else:
|
||||
assert e["dauer"] == DREH_DAUER
|
||||
# Beide Fälle kamen vor
|
||||
assert stopp_anzahlen == {1, 2}
|
||||
|
||||
|
||||
def test_zweiter_dreh_waehrend_laufender_ziehung(client, film):
|
||||
vorschlagen(client, film(1))
|
||||
assert client.post("/api/spin").json()["started"] is True
|
||||
|
||||
assert client.post("/api/spin").json()["started"] is False
|
||||
|
||||
stand = client.get("/api/spin").json()
|
||||
assert stand["running"] is True
|
||||
assert stand["elapsed"] >= 0
|
||||
assert stand["result"]["gewinner"]["movie_id"] == 1
|
||||
|
||||
|
||||
def test_ohne_vorschlaege_kein_dreh(client):
|
||||
assert client.post("/api/spin").status_code == 400
|
||||
assert client.get("/api/spin").json() == {"running": False, "result": None}
|
||||
|
||||
|
||||
def test_gesehene_filme_gewinnen_nicht(client, client2, film):
|
||||
vorschlagen(client, film(1))
|
||||
vorschlagen(client2, film(2))
|
||||
client.post("/api/watched", json={"movie_id": 1})
|
||||
|
||||
for _ in range(50):
|
||||
assert suggestions.ziehen()["gewinner"]["movie_id"] == 2
|
||||
|
||||
|
||||
def test_runde_zuruecksetzen(client, film):
|
||||
vorschlagen(client, film(1))
|
||||
client.post("/api/spin")
|
||||
|
||||
assert client.delete("/api/suggestions/alle").json() == {"removed": 1}
|
||||
assert client.get("/api/spin").json()["running"] is False
|
||||
assert client.get("/api/suggestions").json()["items"] == []
|
||||
Reference in New Issue
Block a user