111 lines
4.1 KiB
Python
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()
|