Fixes aus den Audits (Fable/Codex): Doppelte, Staffel, Export-Sperre, Netz-DB, atomare Einstellungen, Formeln, Wiederherstellung, Importgrenzen, schnellere Suche; toter Code entfernt; Version 1.8.0

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Kerim AtilganandClaude Opus 5.5 committed 2026-11-03 14:58:51 +01:00
1 parent 72677ebed7
commit 968c68ac1a
12 files changed
+536 -178

No files matched your search

+54
View File
@@ -1123,6 +1123,10 @@ def test_export_zeitraum_kennzeichnen_und_erledigt(lauf_modern, tmp_path, monkey
app.ptree.selection_set(app.ptree.get_children()[0])
app.prozent()
assert "erledigt" in meldungen[-1]
# ... auch der Export (würde sonst offene Positionen abrechnen)
n = len(meldungen)
app.exportieren()
assert lauf.dialog(ExportDialog) is None and len(meldungen) == n + 1 and "erledigt" in meldungen[-1]
lauf.pruefen()
@@ -1205,3 +1209,53 @@ def test_startet_maximiert(home):
assert lauf.app.rahmen.maximiert, "Programm startet nicht maximiert"
finally:
lauf.ende()
def test_suche_und_filter_blenden_nur_aus(lauf_modern):
"""Suche/Filter bauen die Tabelle nicht neu auf: Zeilen werden aus- und wieder eingehängt."""
lauf = lauf_modern
app = lauf.app
alle = [i for g in app.ptree.get_children() for i in app.ptree.get_children(g)]
assert len(alle) == 3
app.v_suche.set("Beispiel")
app._suche_ausfuehren()
sichtbar = [i for g in app.ptree.get_children() for i in app.ptree.get_children(g)]
assert len(sichtbar) == 1 and app.ptree.item(sichtbar[0], "text") == "Beispiel KG"
assert all(app.ptree.exists(i) for i in alle), "ausgeblendete Zeilen bleiben erhalten (nur ausgehängt)"
assert app.kpi["pos"][0].cget("text") == "1"
gruppe = app.ptree.parent(sichtbar[0])
assert "(1)" in app.ptree.item(gruppe, "text") and app.ptree.item(gruppe, "open")
app.ptree.selection_set(gruppe)
assert app._ausgewaehlte_pids() == [int(sichtbar[0][1:])], "Gruppenauswahl = nur sichtbare Zeilen"
app.v_suche.set("")
app._suche_ausfuehren()
assert [i for g in app.ptree.get_children() for i in app.ptree.get_children(g)] == alle
assert app.kpi["pos"][0].cget("text") == "3"
lauf.pruefen()
def test_start_mit_unerreichbarer_datenbank_fragt(home, monkeypatch):
"""Eingestellter (Netz-)Pfad fehlt: Rückfrage statt Absturz – und es wird dort keine leere DB angelegt."""
from provtool import config
from provtool.gui import win95 as w
_profil_mit_daten(home)
weg = home / "netz" / "provisionen.db"
fragen = []
monkeypatch.setattr(w, "_meldung", lambda m, t, text, icon, knoepfe, default=0: fragen.append(text) or "standard")
lauf = Lauf(home, {"assistent_erledigt": True, "tipps_beim_start": False, "db_pfad": str(weg)})
try:
assert len(fragen) == 1 and str(weg) in fragen[0]
assert not weg.exists() and lauf.app.db.path == config.app_dir() / "provisionen.db"
assert config.load()["db_pfad"] is None, "Wahl „Standard“ wird gespeichert"
assert len(lauf.app.positionen) == 3
finally:
lauf.ende()
lauf.pruefen()
# „Beenden“ gewählt: Programm endet sauber
monkeypatch.setattr(w, "_meldung", lambda *a, **k: "ende")
(home / "einstellungen.json").write_text(json.dumps({"db_pfad": str(weg), "vollbild": False}), encoding="utf-8")
from provtool.gui import app as A
root = tk.Tk()
with pytest.raises(SystemExit):
A.App(root)
assert not weg.exists()