Kategorie "vielleicht testen" in sn_basis abgeschlossen (#67)

37 neue Testfälle für die 31 verbleibenden "vielleicht testen"-
Funktionen: os_wrapper.is_case_sensitive_fs, qgiscore_wrapper.
create_buffer_layer (nur die Wächter, echte Pufferlogik importiert
qgis.core direkt), qgisui_wrapper.find_dock_widgets/add_menu/remove_menu,
DataGrabber._aggregate_results, pruef_ergebnis.dateipfad,
Navigation (add_action, finalize_menu_and_toolbar, set_active_plugin,
remove_action, remove_all), SettingsTab._build_input und PrintTab
(18 Methoden: Zustandslogik, Signal-Handling, Atlas-/Theme-Verwaltung).

PrintTab._build_ui bekommt stattdessen den Vermerk "von Test abgesehen,
weil vernachlässigbar; HD 18.09.2026" - reine Qt-Widget-Konstruktion ohne
eigenständig prüfbare Logik. Damit ist die Kategorie "vielleicht testen"
für sn_basis aufgelöst: jede Funktion ist jetzt getestet oder mit einem
begründeten Vermerk versehen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-18 13:06:06 +02:00
co-authored by Claude Sonnet 5
parent aa4b383a84
commit 8eb89e92a7
10 changed files with 1023 additions and 4 deletions
+70 -1
View File
@@ -1,4 +1,4 @@
"""Tests für sn_basis/functions/qgisui_wrapper.py::add_layer_to_project (Issue #65)."""
"""Tests für sn_basis/functions/qgisui_wrapper.py::add_layer_to_project/find_dock_widgets/add_menu/remove_menu (Issue #65/#67)."""
import unittest
from unittest.mock import MagicMock, patch
@@ -34,5 +34,74 @@ class AddLayerToProjectTests(unittest.TestCase):
self.assertFalse(qui.add_layer_to_project(object()))
class FindDockWidgetsTests(unittest.TestCase):
def test_ohne_main_window_liefert_leere_liste(self):
"""Prüft, dass find_dock_widgets ohne verfügbares Hauptfenster eine leere Liste liefert."""
with patch.object(qui, "get_main_window", return_value=None):
self.assertEqual(qui.find_dock_widgets(), [])
def test_liefert_dock_widgets_des_main_window(self):
"""Prüft, dass find_dock_widgets die vom Hauptfenster gefundenen Dock-Widgets durchreicht."""
fake_docks = [object(), object()]
fake_window = MagicMock()
fake_window.findChildren.return_value = fake_docks
with patch.object(qui, "get_main_window", return_value=fake_window):
self.assertEqual(qui.find_dock_widgets(), fake_docks)
def test_fehler_beim_suchen_liefert_leere_liste(self):
"""Prüft, dass ein Fehler beim Suchen der Dock-Widgets abgefangen wird und eine leere Liste liefert."""
fake_window = MagicMock()
fake_window.findChildren.side_effect = RuntimeError("kaputt")
with patch.object(qui, "get_main_window", return_value=fake_window):
self.assertEqual(qui.find_dock_widgets(), [])
class _FakeMenu:
def __init__(self) -> None:
self.menuAction = lambda: "MENU_ACTION"
class AddRemoveMenuTests(unittest.TestCase):
def test_add_menu_ohne_main_window_tut_nichts(self):
"""Prüft, dass add_menu ohne Hauptfenster keine Ausnahme wirft."""
fake_iface = MagicMock()
fake_iface.mainWindow.return_value = None
with patch.object(qui, "iface", fake_iface):
qui.add_menu(_FakeMenu()) # darf keine Ausnahme werfen
def test_add_menu_mit_echtem_qt_menu_fuegt_es_der_menubar_hinzu(self):
"""Prüft, dass ein echtes Qt-Menü (mit menuAction) der Menüleiste hinzugefügt wird."""
menu = _FakeMenu()
fake_iface = MagicMock()
with patch.object(qui, "iface", fake_iface):
qui.add_menu(menu)
fake_iface.mainWindow.return_value.menuBar.return_value.addMenu.assert_called_once_with(menu)
def test_add_menu_ohne_menuaction_wird_ignoriert(self):
"""Prüft, dass ein Objekt ohne menuAction nicht an die Menüleiste übergeben wird."""
fake_iface = MagicMock()
with patch.object(qui, "iface", fake_iface):
qui.add_menu(object())
fake_iface.mainWindow.return_value.menuBar.return_value.addMenu.assert_not_called()
def test_remove_menu_entfernt_ueber_menuaction(self):
"""Prüft, dass remove_menu das Menü über dessen menuAction() aus der Menüleiste entfernt."""
menu = _FakeMenu()
fake_iface = MagicMock()
with patch.object(qui, "iface", fake_iface):
qui.remove_menu(menu)
fake_iface.mainWindow.return_value.menuBar.return_value.removeAction.assert_called_once_with("MENU_ACTION")
def test_remove_menu_ohne_main_window_tut_nichts(self):
"""Prüft, dass remove_menu ohne Hauptfenster keine Ausnahme wirft."""
fake_iface = MagicMock()
fake_iface.mainWindow.return_value = None
with patch.object(qui, "iface", fake_iface):
qui.remove_menu(_FakeMenu()) # darf keine Ausnahme werfen
if __name__ == "__main__":
unittest.main()