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:
1 parent
72677ebed7
commit
968c68ac1a
12 files changed
+536
-178
No files matched your search
@@ -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()
|
||||
Reference in new issue
Block a user