"""Tests für den Tab „Eigentümer“ – Flurstückssuche (#56).""" import sys import types import unittest from unittest.mock import MagicMock, patch if "qgis" not in sys.modules: qgis_mod = types.ModuleType("qgis") qgis_utils = types.ModuleType("qgis.utils") qgis_utils.iface = types.SimpleNamespace() qgis_utils.plugins = {} qgis_mod.utils = qgis_utils sys.modules["qgis"] = qgis_mod sys.modules["qgis.utils"] = qgis_utils from sn_verfahrensgebiet.ui.tabs import eigentuemer_tab as et from sn_verfahrensgebiet.ui.tabs.eigentuemer_tab import EigentuemerTab from sn_verfahrensgebiet.functions.flurstueck_suche import ( FlurstueckSucheFehler, KeinFlurstueckslayer, SuchErgebnis, ) def _tab(gemarkung="0268", flurstueck="562"): tab = EigentuemerTab.__new__(EigentuemerTab) tab.gemarkung_edit = types.SimpleNamespace(text=lambda: gemarkung) tab.flurstueck_edit = types.SimpleNamespace(text=lambda: flurstueck) return tab @patch.object(et, "success") @patch.object(et, "info") @patch.object(et, "warning") @patch.object(et, "show_info_dialog") class TestFlurstueckSuchen(unittest.TestCase): def test_ohne_flurstueckslayer_erscheint_hinweisdialog(self, dialog, warnung, hinweis, erfolg): """Prüft, dass ohne Layer „Flurstücke“ ein Dialog zum Laden von Verfahrensgebiet und Flurstücken erscheint.""" with patch.object(et, "flurstueck_suchen", side_effect=KeinFlurstueckslayer()): _tab()._on_flurstueck_suchen() dialog.assert_called_once() self.assertIn("Flurstücke aus ALKIS laden", dialog.call_args[0][1]) warnung.assert_not_called() erfolg.assert_not_called() def test_eingabefehler_als_warnung(self, dialog, warnung, hinweis, erfolg): """Prüft, dass eine ungültige Eingabe als Warnung in der Meldungsleiste erscheint, nicht als Dialog.""" with patch.object(et, "flurstueck_suchen", side_effect=FlurstueckSucheFehler("falsch")): _tab()._on_flurstueck_suchen() warnung.assert_called_once_with("Flurstückssuche", "falsch") dialog.assert_not_called() def test_kein_treffer(self, dialog, warnung, hinweis, erfolg): """Prüft, dass ohne Treffer ein Hinweis erscheint und keine Auswahl gesetzt wird.""" layer = MagicMock() with patch.object(et, "flurstueck_suchen", return_value=SuchErgebnis(layer, [])): _tab(flurstueck="999")._on_flurstueck_suchen() hinweis.assert_called_once() self.assertIn("999", hinweis.call_args[0][1]) layer.selectByIds.assert_not_called() def test_treffer_werden_ausgewaehlt_und_angezoomt(self, dialog, warnung, hinweis, erfolg): """Prüft, dass Treffer im Flurstückslayer ausgewählt, angezoomt und gemeldet werden.""" layer = MagicMock() layer.name.return_value = "Flurstücke" canvas = MagicMock() with patch.object(et, "flurstueck_suchen", return_value=SuchErgebnis(layer, [1, 2])) as suche, \ patch.object(et, "iface", types.SimpleNamespace(mapCanvas=lambda: canvas)): _tab(gemarkung=" Beispielhausen ", flurstueck=" 562 ")._on_flurstueck_suchen() suche.assert_called_once_with("Beispielhausen", "562") layer.selectByIds.assert_called_once_with([1, 2]) canvas.zoomToSelected.assert_called_once_with(layer) canvas.flashFeatureIds.assert_called_once_with(layer, [1, 2]) erfolg.assert_called_once() self.assertIn("2 Flurstücke", erfolg.call_args[0][1]) def test_ohne_kartenansicht_bleibt_auswahl(self, dialog, warnung, hinweis, erfolg): """Prüft, dass die Auswahl auch ohne Kartenansicht gesetzt und gemeldet wird.""" layer = MagicMock() with patch.object(et, "flurstueck_suchen", return_value=SuchErgebnis(layer, [7])), \ patch.object(et, "iface", types.SimpleNamespace()): _tab()._on_flurstueck_suchen() layer.selectByIds.assert_called_once_with([7]) self.assertIn("1 Flurstück", erfolg.call_args[0][1]) class TestDockWidgetTabs(unittest.TestCase): def test_tab_ist_im_dockwidget_eingetragen(self): """Prüft, dass der Tab „Eigentümer“ im DockWidget direkt nach dem Bearbeitungs-Tab steht.""" from sn_verfahrensgebiet.ui.dockwidget import DockWidget from sn_verfahrensgebiet.ui.tabs.working_tab import WorkingTab self.assertEqual(DockWidget.tabs[:2], [WorkingTab, EigentuemerTab]) self.assertEqual(EigentuemerTab.tab_title, "Eigentümer") if __name__ == "__main__": unittest.main()