update
This commit is contained in:
@@ -184,3 +184,131 @@ async def test_freeze_urteilt_weiter(monkeypatch):
|
||||
{"art": "auftrag_offen", "item": str(b["id"]), "detail": "(falsch) D"}])
|
||||
assert bewegt is True # geurteilt (behoben) trotz Freeze
|
||||
assert db.one("SELECT COUNT(*) n FROM auftraege WHERE status='behoben'")["n"] == 1
|
||||
|
||||
|
||||
# ── Klärungs-Stichentscheid (eskalierte falsch/luecke) ────────────────────────
|
||||
|
||||
async def test_klaerung_text_falsch_wiedereroeffnet(monkeypatch):
|
||||
"""Mehrheit text_falsch → Auftrag wieder offen (runden=0, geklaert=1); der
|
||||
Fix bekommt das Streich-Mandat als [KLÄRUNG]-Vermerk."""
|
||||
topic = topic_anlegen("klaer1")
|
||||
b = _baustein(topic)
|
||||
au = db.insert("auftraege", baustein_id=b["id"], art="falsch", detail="Zahl falsch",
|
||||
status="eskaliert", runden=AUFTRAG_RUNDEN_MAX)
|
||||
monkeypatch.setitem(fake_agents._HANDLER, "Guide-Konflikt-Klaerung",
|
||||
lambda p: [{"auftrag": 1, "urteil": "text_falsch"}])
|
||||
await guide._klaeren(_ctx(topic), b)
|
||||
r = db.one("SELECT * FROM auftraege WHERE id=?", (au,))
|
||||
assert (r["status"], r["runden"], r["geklaert"]) == ("offen", 0, 1)
|
||||
# der Fix-Prompt trägt das Streich-Mandat
|
||||
gesehen = {}
|
||||
sec = db.one("SELECT * FROM sections WHERE baustein_id=?", (b["id"],))
|
||||
def fix(prompt):
|
||||
gesehen["klaerung"] = "[KLÄRUNG" in prompt and "STREICHEN" in prompt
|
||||
return {"kompakt": "- p", "lang": sec["text_lang"] + " korrigiert"}
|
||||
monkeypatch.setitem(fake_agents._HANDLER, "Guide-Fix", fix)
|
||||
db.update("sections", "baustein_id", b["id"], stage="fix")
|
||||
await guide._stage_fix(_ctx(topic), b)
|
||||
assert gesehen["klaerung"]
|
||||
|
||||
|
||||
async def test_klaerung_unbegruendet_schliesst():
|
||||
"""Default-Fake stimmt unbegruendet → kein_mangel, geklaert=1, bewegt True."""
|
||||
topic = topic_anlegen("klaer2")
|
||||
b = _baustein(topic)
|
||||
au = db.insert("auftraege", baustein_id=b["id"], art="luecke", detail="Fehlalarm",
|
||||
status="eskaliert")
|
||||
db.update("sections", "baustein_id", b["id"], stage="done")
|
||||
bewegt = await guide.reparieren(_ctx(topic), [
|
||||
{"art": "klaerung_offen", "item": str(b["id"]), "detail": "Fehlalarm"}])
|
||||
r = db.one("SELECT * FROM auftraege WHERE id=?", (au,))
|
||||
assert (r["status"], r["geklaert"]) == ("kein_mangel", 1)
|
||||
assert bewegt is True
|
||||
assert db.one("SELECT stage FROM sections WHERE baustein_id=?",
|
||||
(b["id"],))["stage"] == "done" # keine Stage-Route nötig
|
||||
|
||||
|
||||
async def test_klaerung_patt_terminal(monkeypatch):
|
||||
"""Voll-Patt (1/1/1) → geklaert=1, bleibt eskaliert; messen zeigt
|
||||
fakten_konflikt; zweiter reparieren-Lauf ruft die Klärung nie wieder."""
|
||||
topic = topic_anlegen("klaer3")
|
||||
b = _baustein(topic)
|
||||
au = db.insert("auftraege", baustein_id=b["id"], art="falsch", detail="strittig",
|
||||
status="eskaliert")
|
||||
votes = iter(["text_falsch", "unbegruendet", "quelle_unklar"])
|
||||
monkeypatch.setitem(fake_agents._HANDLER, "Guide-Konflikt-Klaerung",
|
||||
lambda p: [{"auftrag": 1, "urteil": next(votes)}])
|
||||
await guide._klaeren(_ctx(topic), b)
|
||||
r = db.one("SELECT * FROM auftraege WHERE id=?", (au,))
|
||||
assert (r["status"], r["geklaert"]) == ("eskaliert", 1)
|
||||
ctx = _ctx(topic)
|
||||
arten = [x["art"] for x in guide.messen(ctx)]
|
||||
assert "fakten_konflikt" in arten and "klaerung_offen" not in arten
|
||||
monkeypatch.setitem(fake_agents._HANDLER, "Guide-Konflikt-Klaerung",
|
||||
lambda p: pytest.fail("geklärter Auftrag erneut geklärt"))
|
||||
assert await guide.reparieren(ctx, [{"art": "fakten_konflikt",
|
||||
"item": str(b["id"]), "detail": "strittig"}]) is False
|
||||
|
||||
|
||||
async def test_klaerung_ohne_gueltige_stimmen_fail_closed(monkeypatch):
|
||||
"""Liefern die Richter keine gültigen Urteile, bleibt geklaert=0 —
|
||||
nächste Runde klärt erneut (fail-closed)."""
|
||||
topic = topic_anlegen("klaer4")
|
||||
b = _baustein(topic)
|
||||
au = db.insert("auftraege", baustein_id=b["id"], art="falsch", detail="D",
|
||||
status="eskaliert")
|
||||
monkeypatch.setitem(fake_agents._HANDLER, "Guide-Konflikt-Klaerung",
|
||||
lambda p: [{"auftrag": 1, "urteil": "quatsch"}])
|
||||
await guide._klaeren(_ctx(topic), b)
|
||||
r = db.one("SELECT * FROM auftraege WHERE id=?", (au,))
|
||||
assert (r["status"], r["geklaert"]) == ("eskaliert", 0)
|
||||
|
||||
|
||||
async def test_runden_inkrement_ist_nicht_bewegt(monkeypatch):
|
||||
"""Identisches Panel-Patt auf identischem Text = Leer-Churn → reparieren
|
||||
meldet ehrlich False (runden zählt nicht mehr als Bewegung)."""
|
||||
topic = topic_anlegen("leerchurn")
|
||||
b = _baustein(topic)
|
||||
db.insert("auftraege", baustein_id=b["id"], art="falsch", detail="Patt")
|
||||
db.update("sections", "baustein_id", b["id"], stage="done")
|
||||
monkeypatch.setitem(fake_agents._HANDLER, "Guide-Pruefer-Urteil",
|
||||
lambda p: [{"auftrag": 1, "urteil": "offen"}])
|
||||
sec = db.one("SELECT * FROM sections WHERE baustein_id=?", (b["id"],))
|
||||
monkeypatch.setitem(fake_agents._HANDLER, "Guide-Fix",
|
||||
lambda p: {"kompakt": sec["text_kompakt"], "lang": sec["text_lang"]})
|
||||
bewegt = await guide.reparieren(_ctx(topic), [
|
||||
{"art": "auftrag_offen", "item": str(b["id"]), "detail": "(falsch) Patt"}])
|
||||
assert bewegt is False # nur runden+1, kein Status-/Text-Fortschritt
|
||||
|
||||
|
||||
async def test_stil_rest_keine_route():
|
||||
topic = topic_anlegen("stilrest")
|
||||
b = _baustein(topic)
|
||||
db.insert("auftraege", baustein_id=b["id"], art="stil", detail="zäh",
|
||||
status="eskaliert")
|
||||
db.update("sections", "baustein_id", b["id"], stage="done")
|
||||
assert await guide.reparieren(_ctx(topic), [
|
||||
{"art": "stil_rest", "item": str(b["id"]), "detail": "zäh"}]) is False
|
||||
assert db.one("SELECT stage FROM sections WHERE baustein_id=?",
|
||||
(b["id"],))["stage"] == "done"
|
||||
|
||||
|
||||
async def test_reeskalation_nach_klaerung_terminal(monkeypatch):
|
||||
"""Wiedereröffneter (geklärter) Auftrag, der erneut am Cap eskaliert, ist
|
||||
terminal unauflösbar — keine zweite Klärung."""
|
||||
topic = topic_anlegen("reesk")
|
||||
b = _baustein(topic)
|
||||
au = db.insert("auftraege", baustein_id=b["id"], art="falsch", detail="D",
|
||||
geklaert=1, runden=AUFTRAG_RUNDEN_MAX - 1)
|
||||
monkeypatch.setitem(fake_agents._HANDLER, "Guide-Pruefer-Urteil",
|
||||
lambda p: [{"auftrag": 1, "urteil": "offen"}])
|
||||
await guide._auftraege_urteilen(_ctx(topic), b,
|
||||
db.one("SELECT * FROM sections WHERE baustein_id=?",
|
||||
(b["id"],)),
|
||||
guide._offene_auftraege(b["id"]))
|
||||
r = db.one("SELECT * FROM auftraege WHERE id=?", (au,))
|
||||
assert (r["status"], r["geklaert"]) == ("eskaliert", 1)
|
||||
ctx = _ctx(topic)
|
||||
arten = [x["art"] for x in guide.messen(ctx)]
|
||||
assert "fakten_konflikt" in arten and "klaerung_offen" not in arten
|
||||
assert guide._klaerung_kandidaten(b["id"]) == []
|
||||
|
||||
Reference in New Issue
Block a user