Files
Plugin_SN_Basis/tests/test_base_dockwidget.py
T
DanielandClaude Sonnet 5 7ce820581f Tests für restliche priorisierte sn_basis-Funktionen ergänzt (#65)
79 neue Testfälle: Verfahrensgebiet-Zustandsverwaltung (Listener-Setup/
-teardown, Signal-Handler), DockManager/BaseDockWidget, pruef_ergebnis-
Persistenz-Gates, Pruefmanager-Entscheidungswege, restliche Dateipruefer-
Zweige, Fundament-Wrapper (sys_wrapper, ly_existence_wrapper,
ly_style_wrapper.apply_style_from_path, landkreise, message_wrapper,
qgiscore_wrapper.polygon_zu_linie/layer_exists_in_gpkg,
qgisui_wrapper.add_layer_to_project) und SettingsTab.save_data/load_data.

Ausgeklammert: LayerLoader.apply_style/ly_style_wrapper.apply_style
(Bug-Verdacht, hartkodierter Fachplugin-Pfad) und
Pruefmanager._ask_use_or_replace_pufferlayer (bereits als Bug in #60
erfasst: ruft nicht existierendes self.pruefmanager auf).

qt_wrapper._MockQDockWidget um closeEvent() ergänzt (fehlte, ließ jede
BaseDockWidget.closeEvent()-Ausführung im Mock-Modus abstürzen).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-18 11:20:10 +02:00

100 lines
3.0 KiB
Python

"""Tests für sn_basis/ui/base_dockwidget.py::closeEvent (Issue #65)."""
import unittest
from sn_basis.ui.base_dockwidget import BaseDockWidget
class _FakeTab:
def __init__(self, mit_cleanup: bool = True) -> None:
self.cleanup_aufgerufen = False
if mit_cleanup:
self.cleanup = self._cleanup
def _cleanup(self) -> None:
self.cleanup_aufgerufen = True
class _FehlerhafterTab:
def cleanup(self) -> None:
raise RuntimeError("cleanup kaputt")
class _FakeTabWidget:
def __init__(self, tabs) -> None:
self._tabs = tabs
def count(self) -> int:
return len(self._tabs)
def widget(self, index: int):
return self._tabs[index]
class _FakeAction:
def __init__(self) -> None:
self.checked = None
def setChecked(self, value: bool) -> None:
self.checked = value
def _neues_dock() -> BaseDockWidget:
"""Erzeugt ein BaseDockWidget ohne den echten __init__ (keine Qt-Tab-Erzeugung nötig für closeEvent)."""
dock = BaseDockWidget.__new__(BaseDockWidget)
dock.action = None
return dock
class CloseEventTests(unittest.TestCase):
def test_ruft_cleanup_aller_tabs_auf(self):
"""Prüft, dass closeEvent cleanup() auf allen Tabs des Dock-Widgets aufruft."""
dock = _neues_dock()
tab1, tab2 = _FakeTab(), _FakeTab()
dock.widget = lambda: _FakeTabWidget([tab1, tab2])
dock.closeEvent(None)
self.assertTrue(tab1.cleanup_aufgerufen)
self.assertTrue(tab2.cleanup_aufgerufen)
def test_ignoriert_tabs_ohne_cleanup(self):
"""Prüft, dass ein Tab ohne cleanup()-Methode nicht zu einem Fehler führt."""
dock = _neues_dock()
dock.widget = lambda: _FakeTabWidget([_FakeTab(mit_cleanup=False)])
dock.closeEvent(None) # darf keine Ausnahme werfen
def test_fehler_in_cleanup_wird_abgefangen_und_andere_tabs_laufen_weiter(self):
"""Prüft, dass ein Fehler in cleanup() eines Tabs nicht die übrigen Tabs verhindert."""
dock = _neues_dock()
funktionierender_tab = _FakeTab()
dock.widget = lambda: _FakeTabWidget([_FehlerhafterTab(), funktionierender_tab])
dock.closeEvent(None)
self.assertTrue(funktionierender_tab.cleanup_aufgerufen)
def test_setzt_toolbar_action_zurueck(self):
"""Prüft, dass closeEvent die verknüpfte Toolbar-Action auf 'nicht gedrückt' zurücksetzt."""
dock = _neues_dock()
dock.widget = lambda: _FakeTabWidget([])
action = _FakeAction()
dock.action = action
dock.closeEvent(None)
self.assertFalse(action.checked)
def test_ohne_action_wird_nichts_zurueckgesetzt(self):
"""Prüft, dass closeEvent ohne verknüpfte Toolbar-Action keine Ausnahme wirft."""
dock = _neues_dock()
dock.widget = lambda: _FakeTabWidget([])
dock.action = None
dock.closeEvent(None) # darf keine Ausnahme werfen
if __name__ == "__main__":
unittest.main()