"""Tests für sn_basis/ui/dockmanager.py (nur ein Dock gleichzeitig sichtbar, Issue #65).""" import unittest from unittest.mock import patch from sn_basis.ui.dockmanager import DockManager from sn_basis.functions.qt_wrapper import DockAreaRight class _FakeDock: def __init__(self, name: str = "") -> None: self._name = name self.shown = False def objectName(self) -> str: return self._name def setObjectName(self, name: str) -> None: self._name = name def show(self) -> None: self.shown = True def deleteLater(self) -> None: return None class DockManagerShowTests(unittest.TestCase): @patch("sn_basis.ui.dockmanager.error") @patch("sn_basis.ui.dockmanager.add_dock_widget") def test_none_dock_meldet_fehler_und_zeigt_nichts_an(self, mock_add, mock_error): """Prüft, dass ein fehlendes Dock-Widget (None) einen Fehler meldet und nichts anzeigt.""" DockManager.show(None) mock_error.assert_called_once() mock_add.assert_not_called() @patch("sn_basis.ui.dockmanager.find_dock_widgets", return_value=[]) @patch("sn_basis.ui.dockmanager.add_dock_widget") def test_setzt_objectname_wenn_leer(self, mock_add, mock_find): """Prüft, dass ein Dock ohne Namen einen technischen Namen mit dem Präfix 'sn_dock_' erhält.""" dock = _FakeDock(name="") DockManager.show(dock) self.assertTrue(dock.objectName().startswith("sn_dock_")) @patch("sn_basis.ui.dockmanager.remove_dock_widget") @patch("sn_basis.ui.dockmanager.add_dock_widget") def test_entfernt_andere_sn_docks_aber_nicht_sich_selbst(self, mock_add, mock_remove): """Prüft, dass andere sn_basis-Docks entfernt werden, das neue Dock und fremde Widgets aber unangetastet bleiben.""" neues_dock = _FakeDock(name="sn_dock_neu") altes_dock = _FakeDock(name="sn_dock_alt") fremdes_widget = _FakeDock(name="irgendein_anderes_widget") with patch("sn_basis.ui.dockmanager.find_dock_widgets", return_value=[neues_dock, altes_dock, fremdes_widget]): DockManager.show(neues_dock) mock_remove.assert_called_once_with(altes_dock) @patch("sn_basis.ui.dockmanager.find_dock_widgets", return_value=[]) @patch("sn_basis.ui.dockmanager.add_dock_widget") def test_zeigt_neues_dock_mit_default_area_an(self, mock_add, mock_find): """Prüft, dass ein neues Dock mit der Standard-Area (DockAreaRight) angezeigt wird.""" dock = _FakeDock(name="sn_dock_x") DockManager.show(dock) mock_add.assert_called_once_with(DockAreaRight, dock) self.assertTrue(dock.shown) @patch("sn_basis.ui.dockmanager.warning") @patch("sn_basis.ui.dockmanager.add_dock_widget") @patch("sn_basis.ui.dockmanager.find_dock_widgets", side_effect=RuntimeError("kaputt")) def test_fehler_beim_entfernen_wird_als_warnung_gemeldet(self, mock_find, mock_add, mock_warning): """Prüft, dass ein Fehler beim Entfernen alter Docks nur gewarnt und das neue Dock trotzdem angezeigt wird.""" dock = _FakeDock(name="sn_dock_x") DockManager.show(dock) mock_warning.assert_called_once() mock_add.assert_called_once() @patch("sn_basis.ui.dockmanager.error") @patch("sn_basis.ui.dockmanager.add_dock_widget", side_effect=RuntimeError("kaputt")) @patch("sn_basis.ui.dockmanager.find_dock_widgets", return_value=[]) def test_fehler_beim_anzeigen_wird_gemeldet(self, mock_find, mock_add, mock_error): """Prüft, dass ein Fehler beim Anzeigen des Docks als Fehler gemeldet wird.""" dock = _FakeDock(name="sn_dock_x") DockManager.show(dock) mock_error.assert_called_once() if __name__ == "__main__": unittest.main()