Skip to content

Commit 5f712ab

Browse files
Lukas Geigerclaude
andcommitted
fix: closeEvent schließt Dialog nicht mehr bei fehlgeschlagenem Speichern
QuickEditorDialog.closeEvent() rief event.accept() bedingungslos auf, auch wenn _save_file() scheiterte. Nun wird _modified nach dem Speichern geprüft — nur False (=Erfolg) führt zu event.accept(), sonst event.ignore(). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent a1b6d66 commit 5f712ab

2 files changed

Lines changed: 58 additions & 2 deletions

File tree

src/modules/editor/quick_editor.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,11 @@ def closeEvent(self, event):
522522

523523
if reply == QMessageBox.StandardButton.Save:
524524
self._save_file()
525-
event.accept()
525+
if not self._modified:
526+
event.accept()
527+
else:
528+
event.ignore()
529+
return
526530
elif reply == QMessageBox.StandardButton.Discard:
527531
event.accept()
528532
else:

tests/test_quick_editor_close_event.py

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
"""
22
Bugfix-Test: quick_editor.py QuickEditorDialog.closeEvent() –
3-
Bei Klick auf 'Abbrechen' darf ein laufender Prozess NICHT gekillt werden.
3+
(1) Bei Klick auf 'Abbrechen' darf ein laufender Prozess NICHT gekillt werden.
4+
(2) Bei Klick auf 'Speichern' + fehlschlagendem _save_file() darf der Dialog
5+
NICHT geschlossen werden (event.accept() darf nicht feuern).
46
"""
57
from __future__ import annotations
68

@@ -95,3 +97,53 @@ def test_process_not_killed_when_unmodified(self):
9597

9698
mock_process.kill.assert_called_once()
9799
assert event.isAccepted() is True
100+
101+
102+
class TestCloseEventSaveFailure:
103+
"""closeEvent darf Dialog nicht schließen wenn _save_file() fehlschlägt."""
104+
105+
def test_dialog_stays_open_on_save_failure(self, monkeypatch):
106+
"""Wenn _save_file() scheitert (_modified bleibt True), darf event.accept() nicht feuern."""
107+
editor = QuickEditorDialog.__new__(QuickEditorDialog)
108+
editor._modified = True
109+
editor._process = None
110+
111+
monkeypatch.setattr(
112+
"modules.editor.quick_editor.QMessageBox.question",
113+
lambda *a, **kw: QMessageBox.StandardButton.Save
114+
)
115+
116+
def failing_save():
117+
pass # _modified bleibt True — simuliert fehlgeschlagenes Speichern
118+
119+
editor._save_file = failing_save
120+
121+
event = FakeCloseEvent()
122+
editor.closeEvent(event)
123+
124+
assert event.isAccepted() is False, (
125+
"Dialog wurde trotz fehlgeschlagenem Speichern geschlossen"
126+
)
127+
128+
def test_dialog_closes_on_save_success(self, monkeypatch):
129+
"""Wenn _save_file() erfolgreich (_modified = False), soll event.accept() feuern."""
130+
editor = QuickEditorDialog.__new__(QuickEditorDialog)
131+
editor._modified = True
132+
editor._process = None
133+
134+
monkeypatch.setattr(
135+
"modules.editor.quick_editor.QMessageBox.question",
136+
lambda *a, **kw: QMessageBox.StandardButton.Save
137+
)
138+
139+
def successful_save():
140+
editor._modified = False # simuliert erfolgreiches Speichern
141+
142+
editor._save_file = successful_save
143+
144+
event = FakeCloseEvent()
145+
editor.closeEvent(event)
146+
147+
assert event.isAccepted() is True, (
148+
"Dialog wurde nach erfolgreichem Speichern nicht geschlossen"
149+
)

0 commit comments

Comments
 (0)