"""Ziel-Dedup: synonyme Lernziele werden deterministisch gemerged.""" from backend import db, struktur from .conftest import topic_anlegen def test_ziele_dedup_merged_synonyme(): topic = topic_anlegen() z1 = db.insert("lernziele", topic=topic, titel="Grundlagen einordnen", text="Der Lernende kann Pomodoro-Grundlagen einordnen.") z2 = db.insert("lernziele", topic=topic, titel="Grundlagen verorten", text="Der Lernende kann Pomodoro-Grundlagen verorten.") z3 = db.insert("lernziele", topic=topic, titel="Anwendung", text="Der Lernende kann die Technik im Alltag anwenden.") b2 = db.insert("bausteine", topic=topic, ziel_id=z2, titel="B2") a1 = db.insert("atome", topic=topic, titel="A1", status="aktiv", ziel_id=z2, baustein_id=b2) merges = struktur._ziele_dedup(topic) assert merges == 1 # z2 weg, sein Atom hängt jetzt an z1, Baustein-Zuordnung gelöst assert db.one("SELECT id FROM lernziele WHERE id=?", z2) is None atom = db.one("SELECT ziel_id, baustein_id FROM atome WHERE id=?", a1) assert atom["ziel_id"] == z1 and atom["baustein_id"] is None assert db.one("SELECT id FROM lernziele WHERE id=?", z3) is not None def test_ziele_dedup_verschont_verschiedene(): topic = topic_anlegen() db.insert("lernziele", topic=topic, titel="Pausen gestalten", text="Der Lernende kann Pausen erholsam gestalten.") db.insert("lernziele", topic=topic, titel="Werkzeuge nutzen", text="Der Lernende kann passende Apps und Timer auswählen.") assert struktur._ziele_dedup(topic) == 0 assert db.one("SELECT COUNT(*) c FROM lernziele WHERE topic=?", topic)["c"] == 2 def test_ziele_dedup_facetten_paraphrase(): """Audit: Ganz-Satz-Jaccard kam nie über 0.36 — der Inhaltswort-Kern (Floskeln raus) merged Paraphrasen desselben Soll-Punkts.""" topic = topic_anlegen() s = db.insert("soll", topic=topic, punkt="P", status="bestaetigt") db.insert("lernziele", topic=topic, titel="Wirkung verstehen", soll_id=s, text="Der Lernende kann die Wirkung der Technik verstehen.") db.insert("lernziele", topic=topic, titel="Wirkung einordnen", soll_id=s, text="Der Lernende kann Wirkung und Grenzen der Technik einordnen.") assert struktur._ziele_dedup(topic) == 1 def test_ziele_dedup_nur_gleicher_soll(): topic = topic_anlegen() s1 = db.insert("soll", topic=topic, punkt="P1", status="bestaetigt") s2 = db.insert("soll", topic=topic, punkt="P2", status="bestaetigt") db.insert("lernziele", topic=topic, titel="Wirkung verstehen", soll_id=s1, text="Der Lernende kann die Wirkung der Technik verstehen.") db.insert("lernziele", topic=topic, titel="Wirkung einordnen", soll_id=s2, text="Der Lernende kann Wirkung und Grenzen der Technik einordnen.") assert struktur._ziele_dedup(topic) == 0 # andere Soll-Punkte → kein Merge def test_baustein_min_wird_erzwungen(): """Audit: 10 Atome → 8 „Teil"-Gruppen mit 1-2 Atomen. MIN-Merge macht daraus Gruppen im Band, Quellreihenfolge bleibt.""" from backend import config gruppen = [[{"id": i}] for i in range(8)] aus = struktur._min_erzwingen(gruppen) assert all(len(g) >= config.BAUSTEIN_MIN_ATOME for g in aus) assert all(len(g) <= config.BAUSTEIN_MAX_ATOME for g in aus) assert [a["id"] for g in aus for a in g] == list(range(8))