"""Guide board: schema parsers + card reset semantics (no LLM).""" import guide_board as gb TOPIC, FMT = "t", "Guide" def test_ziele_schema(): ok = gb._ziele_schema({"ziele": [{"id": "z1", "text": "Erklären, warum X", "sub": "S"}, {"id": "z2", "text": "Nennen von Y"}]}) assert [z["id"] for z in ok] == ["z1", "z2"] assert gb._ziele_schema({"ziele": []}) is None assert gb._ziele_schema({"ziele": [{"id": "z1", "text": "a"}, {"id": "z1", "text": "b"}]}) \ == [{"id": "z1", "text": "a", "sub": ""}] # duplicate ids fold assert gb._ziele_schema("quatsch") is None def test_gate_schema(): assert gb._gate_schema({"ok": True}) == [] claims = gb._gate_schema({"claims": [{"text": "Falsch", "grund": "fehlt"}]}) assert claims == [{"text": "Falsch", "grund": "fehlt"}] assert gb._gate_schema({}) is None def test_coverage_schema(): res = gb._coverage_schema({"ziele": {"z1": True, "z2": "false"}, "luecken": [{"ziel": "z2", "fehlt": "Beweis"}], "ballast": ["Abschweifung"]}, {"z1", "z2"}) assert res["ziele"] == {"z1": True, "z2": False} assert res["luecken"][0]["fehlt"] == "Beweis" assert gb._coverage_schema({"ziele": {"z1": True}}, {"z1", "z2"}) is None # z2 missing def test_problems_schema(): assert gb._problems_schema({"ok": True}) == [] assert gb._problems_schema({"problems": [{"section": "S", "problem": "zu lang"}]}) == ["zu lang"] assert gb._problems_schema({"problems": []}) is None async def test_reset_from_stage(testdb): db = testdb await db.upsert_guide_card(TOPIC, FMT, "a", "A") await db.upsert_guide_card(TOPIC, FMT, "b", "B") await db.set_guide_card(TOPIC, FMT, "a", stage="done", md="text", writer_rounds=2) await db.set_guide_card(TOPIC, FMT, "b", stage="coverage", md="text") await db.put_lernziel(TOPIC, "a", "z1", "Ziel") # reset ab writer (idx 2): beide Karten zurück, md geleert, Ziele bleiben moved = await gb.reset_from_stage(TOPIC, FMT, 2) assert moved == 2 cards = {c["block_norm"]: c for c in await db.list_guide_cards(TOPIC, FMT)} assert cards["a"]["stage"] == "writer" and cards["a"]["md"] == "" and cards["a"]["writer_rounds"] == 0 assert cards["b"]["stage"] == "writer" assert await db.list_lernziele(TOPIC, "a") # reset ab lernziele (idx 0): Ziele weg await gb.reset_from_stage(TOPIC, FMT, 0) assert not await db.list_lernziele(TOPIC, "a") assert (await db.list_guide_cards(TOPIC, FMT))[0]["stage"] == "lernziele" async def test_done_step(testdb): db = testdb assert await gb.done_step(TOPIC, FMT) == -1 await db.upsert_guide_card(TOPIC, FMT, "a", "A") assert await gb.done_step(TOPIC, FMT) == -1 # alles in lernziele await db.set_guide_card(TOPIC, FMT, "a", stage="coverage") assert await gb.done_step(TOPIC, FMT) == 3 # bis fakten_gate fertig await db.set_guide_card(TOPIC, FMT, "a", stage="done") assert await gb.done_step(TOPIC, FMT) == len(gb.GUIDE_STAGES)