import unittest from pathlib import Path from tempfile import TemporaryDirectory from typing import Any, cast from unittest.mock import patch from sn_basis.modules.pruef_ergebnis import pruef_ergebnis from sn_basis.functions.variable_wrapper import get_variable from sn_plan41.ui.tab_a_logic import TabALogic class _DummyPruefmanager: def verarbeite(self, ergebnis): return ergebnis class TestTabALogic(unittest.TestCase): def _make_logic(self) -> TabALogic: return TabALogic( pruefmanager=cast(Any, _DummyPruefmanager()), link_pruefer=cast(Any, object()), stil_pruefer=cast(Any, object()), ) def test_verfahrens_db_set_and_load_roundtrip(self): logic = self._make_logic() logic.set_verfahrens_db("C:/tmp/v_db.gpkg") self.assertEqual(logic.load_verfahrens_db(), "C:/tmp/v_db.gpkg") def test_verfahrens_db_clear(self): logic = self._make_logic() logic.set_verfahrens_db(None) self.assertEqual(get_variable("verfahrens_db", scope="project"), "") def test_linkliste_set_and_load_existing_path(self): logic = self._make_logic() with TemporaryDirectory() as tmp: link_path = Path(tmp) / "links.xlsx" link_path.write_text("x", encoding="utf-8") logic.set_linkliste(str(link_path)) self.assertEqual(logic.load_linkliste(), str(link_path)) def test_linkliste_load_returns_none_when_file_missing(self): logic = self._make_logic() logic.set_linkliste("C:/tmp/missing.xlsx") self.assertIsNone(logic.load_linkliste()) @patch("sn_plan41.ui.tab_a_logic.get_plugin_root", return_value="C:/plugins") @patch("sn_plan41.ui.tab_a_logic.join_path", return_value="C:/plugins/sn_plan41/assets/Linkliste.xlsx") def test_resolve_linkliste_empty_uses_standard_and_persists(self, _mock_join_path, _mock_root): logic = self._make_logic() resolved = logic._resolve_linkliste(None) self.assertEqual(resolved, "C:/plugins/sn_plan41/assets/Linkliste.xlsx") self.assertEqual(get_variable("linkliste", scope="project"), "C:/plugins/sn_plan41/assets/Linkliste.xlsx") @patch("sn_plan41.ui.tab_a_logic.Dateipruefer") def test_resolve_linkliste_returns_none_when_pruefmanager_rejects(self, mock_dateipruefer): logic = self._make_logic() mock_dateipruefer.return_value.pruefe.return_value = pruef_ergebnis( ok=False, meldung="Ungültig", aktion="datei_nicht_gefunden", kontext=None, ) resolved = logic._resolve_linkliste("C:/tmp/missing.xlsx") self.assertIsNone(resolved) def test_resolve_raumfilter_without_filter_returns_none(self): logic = self._make_logic() result = logic._resolve_raumfilter("ohne", "C:/tmp/v_db.gpkg") self.assertIsNone(result) @patch.object(TabALogic, "_get_verfahrensgebiet_layer", return_value="layer_obj") def test_resolve_raumfilter_verfahrensgebiet_uses_layer_lookup(self, mock_get_layer): logic = self._make_logic() result = logic._resolve_raumfilter("Verfahrensgebiet", "C:/tmp/v_db.gpkg") self.assertEqual(result, "layer_obj") mock_get_layer.assert_called_once() def test_extract_datenabruf_error_maps_merges_reason_maps(self): logic = self._make_logic() results = [ pruef_ergebnis( ok=False, meldung="Head failed", aktion="url_nicht_erreichbar", kontext={"ident": "A1", "thema": "Dienst A", "error": "Timeout"}, ), pruef_ergebnis( ok=False, meldung="Fetch failed", aktion="datenabruf", kontext={"fehler": {"Dienst B": "HTTP 500", "Dienst A": "ignored"}}, ), ] merged = logic._extract_datenabruf_error_maps(results) self.assertEqual(merged["by_ident"]["A1"], "Timeout") self.assertEqual(merged["by_thema"]["Dienst A"], "Timeout") self.assertEqual(merged["by_thema"]["Dienst B"], "HTTP 500") if __name__ == "__main__": unittest.main()