tests überarbeitet

This commit is contained in:
2026-04-20 15:36:38 +02:00
parent d2035139d9
commit 91669b34d6
4 changed files with 209 additions and 0 deletions
+127
View File
@@ -0,0 +1,127 @@
import unittest
from typing import Any, cast
from unittest.mock import patch
from sn_basis.modules.DataGrabber import DataGrabber
from sn_basis.modules.pruef_ergebnis import pruef_ergebnis
class _DummyPruefmanager:
def verarbeite(self, ergebnis: Any):
return ergebnis
class TestDataGrabber(unittest.TestCase):
def _make_grabber(self) -> DataGrabber:
return DataGrabber(pruefmanager=cast(Any, _DummyPruefmanager()))
@patch("sn_basis.modules.DataGrabber.Dateipruefer")
def test_analyze_source_type_detects_excel(self, mock_dateipruefer):
mock_dateipruefer.return_value.pruefe.return_value = pruef_ergebnis(
ok=True,
meldung="ok",
aktion="ok",
kontext="C:/tmp/list.xlsx",
)
grabber = self._make_grabber()
source_type, result = grabber.analyze_source_type("C:/tmp/list.xlsx")
self.assertEqual(source_type, "excel")
self.assertTrue(result.ok)
@patch("sn_basis.modules.DataGrabber.Dateipruefer")
def test_analyze_source_type_returns_unknown_filetype(self, mock_dateipruefer):
mock_dateipruefer.return_value.pruefe.return_value = pruef_ergebnis(
ok=True,
meldung="ok",
aktion="ok",
kontext="C:/tmp/file.txt",
)
grabber = self._make_grabber()
source_type, _result = grabber.analyze_source_type("C:/tmp/file.txt")
self.assertEqual(source_type, "unbekannter_dateityp")
@patch("sn_basis.modules.DataGrabber.Linkpruefer")
@patch("sn_basis.modules.DataGrabber.Dateipruefer")
def test_analyze_source_type_detects_service_when_file_check_fails(self, mock_dateipruefer, mock_linkpruefer):
mock_dateipruefer.return_value.pruefe.return_value = pruef_ergebnis(
ok=False,
meldung="missing",
aktion="datei_nicht_gefunden",
kontext=None,
)
mock_linkpruefer.return_value.pruefe.return_value = pruef_ergebnis(
ok=True,
meldung="ok",
aktion="url_ok",
kontext="https://example.test",
)
grabber = self._make_grabber()
source_type, result = grabber.analyze_source_type("https://example.test")
self.assertEqual(source_type, "dienst")
self.assertTrue(result.ok)
@patch("sn_basis.modules.DataGrabber.Linkpruefer")
@patch("sn_basis.modules.DataGrabber.Dateipruefer")
def test_analyze_source_type_returns_unbekannte_quelle_on_full_failure(self, mock_dateipruefer, mock_linkpruefer):
mock_dateipruefer.return_value.pruefe.return_value = pruef_ergebnis(
ok=False,
meldung="missing",
aktion="datei_nicht_gefunden",
kontext=None,
)
mock_linkpruefer.return_value.pruefe.return_value = pruef_ergebnis(
ok=False,
meldung="bad",
aktion="url_nicht_erreichbar",
kontext=None,
)
grabber = self._make_grabber()
source_type, result = grabber.analyze_source_type("broken-input")
self.assertEqual(source_type, "unbekannte_quelle")
self.assertFalse(result.ok)
@patch.object(DataGrabber, "analyze_source_type")
@patch.object(DataGrabber, "_process_excel_source")
def test_run_returns_success_summary_with_valid_rows(self, mock_process_excel, mock_analyze):
mock_analyze.return_value = (
"excel",
pruef_ergebnis(ok=True, meldung="ok", aktion="ok", kontext=None),
)
mock_process_excel.return_value = (
{"rows": [{"ident": "A1"}]},
[],
)
grabber = self._make_grabber()
source_dict, summary = grabber.run("C:/tmp/list.xlsx")
self.assertEqual(len(source_dict["rows"]), 1)
self.assertTrue(summary.ok)
self.assertEqual(summary.aktion, "ok")
@patch.object(DataGrabber, "analyze_source_type")
def test_run_returns_failure_summary_without_rows(self, mock_analyze):
mock_analyze.return_value = (
"unbekannte_quelle",
pruef_ergebnis(ok=False, meldung="bad", aktion="unbekannte_quelle", kontext=None),
)
grabber = self._make_grabber()
source_dict, summary = grabber.run("???")
self.assertEqual(source_dict, {})
self.assertFalse(summary.ok)
self.assertEqual(summary.aktion, "keine_validen_eintraege")
if __name__ == "__main__":
unittest.main()
+34
View File
@@ -141,6 +141,40 @@ class TestPruefmanager(unittest.TestCase):
self.assertFalse(entscheidung.ok)
self.assertEqual(entscheidung.aktion, "unbekannt")
@patch("sn_basis.modules.Pruefmanager.ask_overwrite_append_cancel_custom", return_value="overwrite")
def test_datei_existiert_overwrite(self, _mock_choice):
ergebnis = pruef_ergebnis(False, "Datei existiert", "datei_existiert", "C:/tmp/v.gpkg")
entscheidung = self.manager.verarbeite(ergebnis)
self.assertTrue(entscheidung.ok)
self.assertEqual(entscheidung.aktion, "datei_existiert_ueberschreiben")
self.assertEqual(entscheidung.kontext, "C:/tmp/v.gpkg")
@patch("sn_basis.modules.Pruefmanager.ask_overwrite_append_cancel_custom", return_value="append")
def test_datei_existiert_append(self, _mock_choice):
ergebnis = pruef_ergebnis(False, "Datei existiert", "datei_existiert", "C:/tmp/v.gpkg")
entscheidung = self.manager.verarbeite(ergebnis)
self.assertTrue(entscheidung.ok)
self.assertEqual(entscheidung.aktion, "datei_existiert_anhaengen")
@patch("sn_basis.modules.Pruefmanager.ask_overwrite_append_cancel_custom", return_value="cancel")
def test_datei_existiert_cancel(self, _mock_choice):
ergebnis = pruef_ergebnis(False, "Datei existiert", "datei_existiert", "C:/tmp/v.gpkg")
entscheidung = self.manager.verarbeite(ergebnis)
self.assertTrue(entscheidung.ok)
self.assertEqual(entscheidung.aktion, "datei_existiert_ueberspringen")
def test_datei_existiert_in_non_qgis_mode_returns_input(self):
manager = Pruefmanager(ui_modus="test")
ergebnis = pruef_ergebnis(False, "Datei existiert", "datei_existiert", "C:/tmp/v.gpkg")
entscheidung = manager.verarbeite(ergebnis)
self.assertFalse(entscheidung.ok)
self.assertEqual(entscheidung.aktion, "datei_existiert")
if __name__ == "__main__":
unittest.main()
+26
View File
@@ -55,6 +55,32 @@ class TestSettingsLogic(unittest.TestCase):
self.assertIn("gemeinden", saved_keys)
self.assertNotIn("unbekannt", saved_keys)
@patch("sn_basis.functions.settings_logic.get_variable")
def test_load_handles_partial_values_with_empty_fallback(self, mock_get):
values = {
"amt": "A1",
"behoerde": "",
"landkreis_user": "L1",
}
mock_get.side_effect = lambda key, scope="project": values.get(key, "")
logic = SettingsLogic()
daten = logic.load()
self.assertEqual(daten["amt"], "A1")
self.assertEqual(daten["behoerde"], "")
self.assertEqual(daten["landkreis_user"], "L1")
self.assertEqual(daten["sachgebiet"], "")
@patch("sn_basis.functions.settings_logic.set_variable")
def test_save_empty_string_value_is_persisted(self, mock_set):
logic = SettingsLogic()
logic.save({"amt": "", "behoerde": "B2"})
mock_set.assert_any_call("amt", "", scope="project")
mock_set.assert_any_call("behoerde", "B2", scope="project")
if __name__ == "__main__":
unittest.main()
+22
View File
@@ -51,6 +51,28 @@ class TestVariableWrapper(unittest.TestCase):
"new_value",
)
@patch("sn_basis.functions.variable_wrapper.QgsExpressionContextUtils.setGlobalVariable")
def test_set_variable_global_writes_prefixed_name(self, mock_set_global):
variable_wrapper.set_variable("verfahrensnummer", "123", scope="global")
mock_set_global.assert_called_once_with("sn_verfahrensnummer", "123")
@patch("sn_basis.functions.variable_wrapper.QgsExpressionContextUtils.globalScope")
def test_get_variable_global_returns_empty_string_fallback(self, mock_global_scope):
mock_global_scope.return_value = _Scope("")
value = variable_wrapper.get_variable("nicht_vorhanden", scope="global")
self.assertEqual(value, "")
def test_get_variable_invalid_scope_raises(self):
with self.assertRaises(ValueError):
variable_wrapper.get_variable("foo", scope="invalid")
def test_set_variable_invalid_scope_raises(self):
with self.assertRaises(ValueError):
variable_wrapper.set_variable("foo", "bar", scope="invalid")
if __name__ == "__main__":
unittest.main()