update
This commit is contained in:
@@ -53,15 +53,21 @@ def _pruefe_endzustand(topic, run_id):
|
||||
folge = [b["kapitel_id"] for b in bausteine]
|
||||
segmente = [k for k, _ in itertools.groupby(folge)]
|
||||
assert len(segmente) == len(set(segmente)) == len(kaps) # kontiguierlich, lückenlos
|
||||
# Stufen-Bausteine: jeder Baustein trägt genau ein Level, alle seine Atome
|
||||
# dieses Level; Kapitel-Level monoton E→M→S entlang der globalen ord
|
||||
# Level je Baustein = dominantes Atom-Level; Themenreinheit: die Soll-Punkte
|
||||
# aller Atome gehören zum Baustein-Thema; Kapitel-Level monoton E→M→S
|
||||
rang = {"E": 0, "M": 1, "S": 2}
|
||||
kap_level = {k["id"]: k["level"] for k in kaps}
|
||||
soll_thema = {p["id"]: p["thema_id"] for p in
|
||||
db.query("SELECT id, thema_id FROM soll WHERE topic=?", (topic,))}
|
||||
from collections import Counter
|
||||
for b in bausteine:
|
||||
assert kap_level[b["kapitel_id"]] == b["level"]
|
||||
for a in atome:
|
||||
if a["baustein_id"] == b["id"]:
|
||||
assert a["level"] == b["level"], (a["titel"], a["level"], b["level"])
|
||||
eigene = [a for a in atome if a["baustein_id"] == b["id"]]
|
||||
zaehler = Counter(a["level"] for a in eigene)
|
||||
dominant = min(zaehler, key=lambda lv: (-zaehler[lv], rang.get(lv, 9)))
|
||||
assert b["level"] == dominant, (b["titel"], b["level"], dict(zaehler))
|
||||
for a in eigene:
|
||||
assert soll_thema.get(a["soll_id"]) == b["thema_id"], (a["titel"], b["titel"])
|
||||
level_folge = [rang[b["level"]] for b in bausteine]
|
||||
assert level_folge == sorted(level_folge), "Durchgänge nicht E<M<S geordnet"
|
||||
for b in db.query("SELECT titel FROM bausteine WHERE topic=?", (topic,)):
|
||||
@@ -74,9 +80,11 @@ async def test_e2e_thema():
|
||||
topic = topic_anlegen("fake-thema", art="thema")
|
||||
run_id = await _lauf_komplett(topic)
|
||||
_pruefe_endzustand(topic, run_id)
|
||||
# Fake-Welt: 3 Atome mit Level E/M/S → je Level ein eigener Baustein-Durchgang
|
||||
# Fake-Welt: 3 Atome E/M/S im selben Thema → EIN Baustein, Level = E
|
||||
# (Gleichstand 1/1/1 → niedrigstes; kein Level-Split mehr)
|
||||
bausteine = db.query("SELECT * FROM bausteine WHERE topic=? ORDER BY ord", (topic,))
|
||||
assert [b["level"] for b in bausteine] == ["E", "M", "S"]
|
||||
assert [b["level"] for b in bausteine] == ["E"]
|
||||
assert all(b["thema_id"] for b in bausteine)
|
||||
|
||||
|
||||
async def test_e2e_uni(tmp_path):
|
||||
@@ -143,6 +151,9 @@ async def test_ebenen_entfernen_kaskade():
|
||||
assert db.query("SELECT * FROM bausteine WHERE topic=?", (topic,)) == []
|
||||
assert db.query("SELECT * FROM kapitel WHERE topic=?", (topic,)) == []
|
||||
assert db.query("SELECT * FROM lernziele WHERE topic=?", (topic,)) == []
|
||||
assert db.query("SELECT * FROM themen WHERE topic=?", (topic,)) == []
|
||||
assert all(p["thema_id"] is None for p in
|
||||
db.query("SELECT thema_id FROM soll WHERE topic=?", (topic,)))
|
||||
assert db.one("SELECT status FROM topics WHERE name=?", (topic,))["status"] == "artefakte_fertig"
|
||||
# Anzeige-Reset: Token-Zählung der entfernten Ebenen beginnt neu (Events bleiben)
|
||||
resets = db.uj(db.one("SELECT resets FROM topics WHERE name=?", (topic,))["resets"], {})
|
||||
@@ -161,7 +172,7 @@ async def test_topic_loeschen():
|
||||
_pruefe_endzustand(topic, run1)
|
||||
pipeline.topic_loeschen(topic)
|
||||
for tabelle in ("topics", "quellen", "soll", "atome", "lernziele", "bausteine",
|
||||
"kapitel", "runs"):
|
||||
"kapitel", "themen", "runs"):
|
||||
feld = "name" if tabelle == "topics" else "topic"
|
||||
assert db.query(f"SELECT * FROM {tabelle} WHERE {feld}=?", (topic,)) == [], tabelle
|
||||
|
||||
|
||||
Reference in New Issue
Block a user