Files
Plugin_SN_Plan41/tests/test_tab_a_logic.py
T
2026-04-20 15:36:29 +02:00

111 lines
4.1 KiB
Python

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()