Files
planer2/backend/tests/test_inhalt.py
2026-07-28 08:36:49 +02:00

59 lines
2.6 KiB
Python

import inhalt
import quellcode
def test_unformatierte_prompts_ohne_doppelklammern():
"""Was nicht durch .format() geht, darf keine Escape-Klammern tragen —
das Modell schrieb sie sonst wörtlich in die Antwort und das JSON war kaputt."""
for name in ("ABDECKUNG_SYSTEM",):
text = getattr(inhalt, name)
assert "{{" not in text and "}}" not in text, name
def test_formatierte_prompts_ueberstehen_format():
punkt = {"art": "Bedienung", "datei": "a.vue", "zeile": 1,
"umfeld": "x", "rumpf": ""}
fertig = inhalt.ABDECKUNG.format(funktionen="—", **punkt)
assert '{"abgedeckt": true' in fertig
assert "{{" not in fertig
def test_beleg_muss_woertlich_dastehen():
quelle = {"a.py": "def eins():\n return 1\n"}
assert quellcode.belegt(quelle, "a.py", "def eins():")
assert quellcode.belegt(quelle, "a.py", " def eins(): ") # Einrückung egal
assert quellcode.belegt(quelle, "a.py", "def eins():\nreturn 1")
assert not quellcode.belegt(quelle, "a.py", "def zwei():")
assert not quellcode.belegt(quelle, "b.py", "def eins():")
assert not quellcode.belegt(quelle, "a.py", "")
def test_interaktionen_sind_deterministisch():
quelle = {
"frontend/src/X.vue": (
'<button @click="starte(\'ziel\')">a</button>\n'
'<button @click="starte(\'regeln\')">b</button>\n'
'<div @contextmenu="menue">c</div>\n'
'<input @blur="fertig" @keydown.esc="abbrechen">\n'
'<span @click="offen = false">zu</span>\n'
),
"backend/routes.py": '@router.get("/projekte")\n@router.post("/projekte")\n',
"frontend/src/m.js": " { text: '+ Projekt erstellen', aktion: () => x() },\n",
}
schluessel = [p["schluessel"] for p in quellcode.interaktionen(quelle)]
# Zwölf Aufrufe von starte() sind eine Fähigkeit, nicht zwölf
assert schluessel.count("bedienen:starte") == 1
assert "bedienen:menue" in schluessel
assert not any(s.startswith("schnittstelle:") for s in schluessel) # Verdrahtung
assert "menue:+ Projekt erstellen" in schluessel
# Technische Aufhänger und Zuweisungen sind keine Fähigkeiten
assert not any(s.startswith("bedienen:fertig") for s in schluessel)
assert not any(s.startswith("bedienen:abbrechen") for s in schluessel)
assert not any(s.startswith("bedienen:offen") for s in schluessel)
# Zweiter Aufruf liefert exakt dasselbe
assert schluessel == [p["schluessel"] for p in quellcode.interaktionen(quelle)]
def test_tests_sind_kein_quelltext():
assert not any("tests/" in p for p in quellcode.dateien())