"""Artefakt-Schicht: Merge, ergaenze-anker, Writer, Prüfungs-Gerüst.""" from pathlib import Path import artefakte FRAG_A = """## a.py::eins beschreibung: Erste. input: x output: y ## a.py::zwei beschreibung: Zweite. """ FRAG_NACHFASS = """ergaenze-anker: a.py::_helfer zu a.py::eins ## a.py::drei beschreibung: Dritte. """ def test_merge_mit_nachfass(): rumpf = artefakte.merge_fragmente([FRAG_A, FRAG_NACHFASS]) assert rumpf.index("## a.py::eins") < rumpf.index("## a.py::zwei") < rumpf.index("## a.py::drei") assert "anker: a.py::_helfer" in rumpf.split("## a.py::zwei")[0] # im eins-Block assert "ergaenze-anker" not in rumpf def test_merge_dubletten_fallen_weg(): rumpf = artefakte.merge_fragmente([FRAG_A, FRAG_A]) assert rumpf.count("## a.py::eins") == 1 def test_einheiten_datei_und_stand(): text = artefakte.einheiten_datei("a.py", "## a.py::eins\nbeschreibung: X.", "abc123") assert text.startswith("# Einheiten: a.py\nstand: abc123\n") assert artefakte.lese_stand(text) == "abc123" def test_alle_ids(): text = "## a.py::eins\nanker: a.py::_helfer\n\n## a.py::zwei\n" assert artefakte.alle_ids(text) == {"a.py::eins", "a.py::_helfer", "a.py::zwei"} def test_datei_pfad(): assert artefakte.datei_pfad("backend/kanban.py") == "einheiten/backend__kanban.py.md" def test_schreibe_planer(tmp_path): pfade = artefakte.schreibe_planer(tmp_path, {"kern.md": "# Kern\n", "einheiten/a.py.md": "# Einheiten: a.py\n"}) assert (tmp_path / ".planer" / "kern.md").read_text() == "# Kern\n" assert len(pfade) == 2 def test_pruefung_geruest_mit_makefile(tmp_path): (tmp_path / "Makefile").write_text("test:\n\tpytest\ndev:\n\tuvicorn\n") text = artefakte.pruefung_geruest(tmp_path, "demo") assert "tests: make test" in text and "start: make dev" in text assert "lint: (keins vorhanden)" in text def test_pruefung_geruest_ohne_alles(tmp_path): text = artefakte.pruefung_geruest(tmp_path, "demo") assert "tests: (keins vorhanden)" in text