import sys import types import unittest from types import SimpleNamespace from unittest.mock import Mock, 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.main import Verfahrensgebiet class _DummyIface: def __init__(self): self.removed = [] def mainWindow(self): return object() def removeDockWidget(self, dock): self.removed.append(dock) class _DummyDock: def __init__(self): self.object_name = None self.action = None self.deleted = False def setObjectName(self, name): self.object_name = name def deleteLater(self): self.deleted = True class TestPluginMain(unittest.TestCase): @patch("sn_verfahrensgebiet.main.DataGrabber") @patch("sn_verfahrensgebiet.main.Pruefmanager") def test_init_sets_services_and_names(self, mock_pruefmanager, mock_data_grabber): pm = object() dg = object() mock_pruefmanager.return_value = pm mock_data_grabber.return_value = dg plugin = Verfahrensgebiet(_DummyIface()) self.assertIs(plugin.pruefmanager, pm) self.assertIs(plugin.data_grabber, dg) self.assertEqual(plugin.plugin_name, "Verfahrensgebiet") self.assertEqual(plugin.dock_name, "sn_dock_verfahrensgebiet") @patch("sn_verfahrensgebiet.main.plugins", new_callable=dict) def test_initGui_registers_action_when_basis_ui_exists(self, mock_plugins): iface = _DummyIface() plugin = Verfahrensgebiet(iface) ui = SimpleNamespace( add_action=Mock(return_value="action_obj"), finalize_menu_and_toolbar=Mock(), ) mock_plugins["sn_basis"] = SimpleNamespace(ui=ui) plugin.initGui() self.assertEqual(plugin.action, "action_obj") ui.add_action.assert_called_once() ui.finalize_menu_and_toolbar.assert_called_once() @patch("sn_verfahrensgebiet.main.plugins", new_callable=dict) @patch("sn_verfahrensgebiet.main.DockManager.show") @patch("sn_verfahrensgebiet.main.DockWidget") def test_run_creates_dock_and_marks_toolbar_active(self, mock_dockwidget_cls, mock_show, mock_plugins): iface = _DummyIface() plugin = Verfahrensgebiet(iface) plugin.action = "action_obj" dock = _DummyDock() mock_dockwidget_cls.return_value = dock ui = SimpleNamespace(set_active_plugin=Mock()) mock_plugins["sn_basis"] = SimpleNamespace(ui=ui) plugin.run() self.assertIs(plugin.dockwidget, dock) self.assertEqual(dock.object_name, "sn_dock_verfahrensgebiet") self.assertEqual(dock.action, "action_obj") mock_show.assert_called_once_with(dock) ui.set_active_plugin.assert_called_once_with("action_obj") @patch("sn_verfahrensgebiet.main.plugins", new_callable=dict) def test_unload_removes_dock_and_action(self, mock_plugins): iface = _DummyIface() plugin = Verfahrensgebiet(iface) dock = _DummyDock() plugin.dockwidget = dock plugin.action = "action_obj" ui = SimpleNamespace(remove_action=Mock()) mock_plugins["sn_basis"] = SimpleNamespace(ui=ui) plugin.unload() self.assertIn(dock, iface.removed) self.assertTrue(dock.deleted) self.assertIsNone(plugin.dockwidget) ui.remove_action.assert_called_once_with("action_obj") self.assertIsNone(plugin.action) if __name__ == "__main__": unittest.main()