update
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
import httpx
|
||||
|
||||
from app import clips, main, punkte
|
||||
from app import clips, db, main, punkte
|
||||
|
||||
|
||||
def marke(client):
|
||||
@@ -38,7 +38,7 @@ def test_ohne_dreh_zaehlt_der_neueste_abend(client, film):
|
||||
assert marke(client)["movie_id"] == film(2)
|
||||
|
||||
|
||||
def test_tage_mit_aufnahme(client, monkeypatch):
|
||||
def stuecke_mocken(monkeypatch):
|
||||
async def segmente(von, bis):
|
||||
# Ein Abend mit Stück vor und nach Mitternacht, ein weiterer am Tag danach
|
||||
return [
|
||||
@@ -48,63 +48,72 @@ def test_tage_mit_aufnahme(client, monkeypatch):
|
||||
]
|
||||
|
||||
monkeypatch.setattr(clips, "_segmente", segmente)
|
||||
assert client.get("/api/clips/aufnahmen").json()["tage"] == ["2026-09-23", "2026-09-25"]
|
||||
|
||||
|
||||
def test_clip_zu_altem_abend(client, film, monkeypatch):
|
||||
from datetime import datetime, timezone
|
||||
def test_aufnahmen_bekommen_ihren_film(client, zuschauer, hostmodus, film, monkeypatch):
|
||||
"""Zuweisung schlägt den Abend am gleichen Datum; sonst kein Film."""
|
||||
stuecke_mocken(monkeypatch)
|
||||
client.post("/api/watched", json={"movie_id": film(1)})
|
||||
with db.connect() as conn:
|
||||
conn.execute("UPDATE watched SET watched_at = '2026-09-23T20:41:00+00:00'")
|
||||
|
||||
client.post("/api/watched", json={"movie_id": film(4)})
|
||||
# Kein Abend zu diesem Film
|
||||
assert client.post("/api/clips/von-film", json={"movie_id": 999}).status_code == 404
|
||||
|
||||
# Keine Aufnahme an dem Tag
|
||||
async def keine(watched_at):
|
||||
return []
|
||||
|
||||
monkeypatch.setattr(clips, "aufnahmen_des_abends", keine)
|
||||
assert client.get(f"/api/clips/von-film/{film(4)}").json()["stuecke"] == []
|
||||
antwort = client.post("/api/clips/von-film", json={"movie_id": film(4)})
|
||||
assert antwort.status_code == 404 and "Aufnahme" in antwort.json()["detail"]
|
||||
|
||||
# Zwei Stücke, weil der Stream neu gestartet wurde
|
||||
stuecke = [
|
||||
{"start": "2026-09-23T19:00:00+00:00", "dauer": 1800.0},
|
||||
{"start": "2026-09-23T20:00:00+00:00", "dauer": 600.0},
|
||||
liste = client.get("/api/aufnahmen").json()["stuecke"]
|
||||
assert [s["start"] for s in liste] == [
|
||||
"2026-09-25T19:00:00+00:00",
|
||||
"2026-09-24T00:30:00+00:00",
|
||||
"2026-09-23T20:00:00+00:00",
|
||||
]
|
||||
# Der Abend vom 23. gilt auch für die Nacht danach
|
||||
assert liste[2]["film"]["id"] == film(1) and liste[2]["zugewiesen"] is False
|
||||
assert liste[1]["film"]["id"] == film(1)
|
||||
assert liste[0]["film"] is None
|
||||
|
||||
async def da(watched_at):
|
||||
return stuecke
|
||||
# Zuweisen darf nur der Host
|
||||
zuweisung = {"start": "2026-09-25T19:00:00+00:00", "movie_id": film(2)}
|
||||
assert client.put("/api/aufnahmen/film", json=zuweisung).status_code == 403
|
||||
hostmodus(zuschauer)
|
||||
assert zuschauer.put("/api/aufnahmen/film", json=zuweisung).json() == {"zugewiesen": True}
|
||||
liste = client.get("/api/aufnahmen").json()["stuecke"]
|
||||
assert liste[0]["film"]["title"] == "Film 2" and liste[0]["zugewiesen"] is True
|
||||
# Die Zuweisung schlägt den Abend
|
||||
zuschauer.put("/api/aufnahmen/film", json={"start": liste[2]["start"], "movie_id": film(2)})
|
||||
assert client.get("/api/aufnahmen").json()["stuecke"][2]["film"]["id"] == film(2)
|
||||
# Aufheben
|
||||
zuschauer.put("/api/aufnahmen/film", json={"start": zuweisung["start"], "movie_id": None})
|
||||
assert client.get("/api/aufnahmen").json()["stuecke"][0]["film"] is None
|
||||
|
||||
monkeypatch.setattr(clips, "aufnahmen_des_abends", da)
|
||||
assert client.get(f"/api/clips/von-film/{film(4)}").json()["stuecke"] == stuecke
|
||||
|
||||
# Ohne Wahl: die Marke liegt kurz nach dem Beginn des ersten Stücks
|
||||
m = client.post("/api/clips/von-film", json={"movie_id": film(4)}).json()
|
||||
assert m["movie_id"] == film(4)
|
||||
def test_clip_aus_aufnahme(client, zuschauer, hostmodus, film):
|
||||
hostmodus(zuschauer)
|
||||
start = "2026-09-23T19:00:00+00:00"
|
||||
zuschauer.put("/api/aufnahmen/film", json={"start": start, "movie_id": film(4)})
|
||||
m = client.post("/api/clips/von-aufnahme", json={"start": start}).json()
|
||||
assert m["movie_id"] == film(4) and m["title"] == "Film 4"
|
||||
# Die Marke liegt kurz nach dem Anfang der Aufnahme
|
||||
assert m["marke_at"] == "2026-09-23T19:01:00+00:00"
|
||||
|
||||
# Mit Wahl: nach dem Beginn des gewählten Stücks
|
||||
m = client.post(
|
||||
"/api/clips/von-film", json={"movie_id": film(4), "start": stuecke[1]["start"]}
|
||||
).json()
|
||||
assert m["marke_at"] == "2026-09-23T20:01:00+00:00"
|
||||
# Ohne Film gibt es die Marke trotzdem — unter Sonstige
|
||||
m = client.post("/api/clips/von-aufnahme", json={"start": "2026-09-25T19:00:00+00:00"}).json()
|
||||
assert m["movie_id"] is None
|
||||
|
||||
|
||||
def test_stuecke_eines_abends_nach_beginn_geordnet(monkeypatch):
|
||||
import asyncio
|
||||
def test_taste_c_nimmt_den_film_der_laufenden_aufnahme(client, zuschauer, hostmodus, film, monkeypatch):
|
||||
from datetime import timedelta
|
||||
|
||||
start = clips._iso(clips._jetzt() - timedelta(seconds=100))
|
||||
|
||||
async def segmente(von, bis):
|
||||
return [
|
||||
{"start": "2026-09-23T21:00:00Z", "duration": 600.0},
|
||||
{"start": "2026-09-23T19:00:00Z", "duration": 1800.04},
|
||||
]
|
||||
return [{"start": start, "duration": 60}]
|
||||
|
||||
monkeypatch.setattr(clips, "_segmente", segmente)
|
||||
assert asyncio.run(clips.aufnahmen_des_abends("2026-09-23T20:00:00+00:00")) == [
|
||||
{"start": "2026-09-23T19:00:00+00:00", "dauer": 1800.0},
|
||||
{"start": "2026-09-23T21:00:00+00:00", "dauer": 600.0},
|
||||
]
|
||||
# Es läuft eine Aufnahme, aber ohne Film: dann wie bisher der neueste Abend
|
||||
client.post("/api/watched", json={"movie_id": film(1)})
|
||||
with db.connect() as conn:
|
||||
conn.execute("UPDATE watched SET watched_at = '2020-01-01T20:00:00+00:00'")
|
||||
assert marke(client)["movie_id"] == film(1)
|
||||
# Zugewiesen: der Film der Aufnahme
|
||||
hostmodus(zuschauer)
|
||||
zuschauer.put("/api/aufnahmen/film", json={"start": start, "movie_id": film(3)})
|
||||
assert marke(client)["movie_id"] == film(3)
|
||||
|
||||
|
||||
def test_fremde_sehen_nichts_der_host_alles(client, client2, zuschauer, hostmodus):
|
||||
@@ -221,25 +230,21 @@ def test_segmente_eines_stuecks():
|
||||
]
|
||||
|
||||
|
||||
def test_aufnahmen_verwaltet_nur_der_host(client, zuschauer, hostmodus, monkeypatch):
|
||||
stuecke = [{"start": "2026-09-23T19:00:00+00:00", "dauer": 60.0}]
|
||||
|
||||
async def alle():
|
||||
return stuecke
|
||||
|
||||
def test_aufnahme_loescht_nur_der_host(client, zuschauer, hostmodus, film, monkeypatch):
|
||||
geloescht = []
|
||||
|
||||
async def loeschen(start, dauer):
|
||||
geloescht.append((start, dauer))
|
||||
return 2
|
||||
|
||||
monkeypatch.setattr(clips, "aufnahmen_alle", alle)
|
||||
monkeypatch.setattr(clips, "aufnahme_loeschen", loeschen)
|
||||
assert client.get("/api/aufnahmen").status_code == 403
|
||||
assert client.delete("/api/aufnahmen", params={"start": stuecke[0]["start"], "dauer": 60}).status_code == 403
|
||||
start = "2026-09-23T19:00:00+00:00"
|
||||
assert client.delete("/api/aufnahmen", params={"start": start, "dauer": 60}).status_code == 403
|
||||
|
||||
hostmodus(zuschauer)
|
||||
assert zuschauer.get("/api/aufnahmen").json()["stuecke"] == stuecke
|
||||
antwort = zuschauer.delete("/api/aufnahmen", params={"start": stuecke[0]["start"], "dauer": 60})
|
||||
zuschauer.put("/api/aufnahmen/film", json={"start": start, "movie_id": film(1)})
|
||||
antwort = zuschauer.delete("/api/aufnahmen", params={"start": start, "dauer": 60})
|
||||
assert antwort.json() == {"segmente": 2}
|
||||
assert geloescht == [(stuecke[0]["start"], 60.0)]
|
||||
assert geloescht == [(start, 60.0)]
|
||||
# Mit der Aufnahme geht auch die Zuweisung
|
||||
assert clips.film_der_aufnahme(start) is None
|
||||
|
||||
Reference in New Issue
Block a user