Verfahrensgebietsprüfung auf Knickpunkte umgestellt
Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
@@ -0,0 +1,307 @@
|
||||
"""sn_verfahrensgebiet/tests/test_knickpunkt_pruefung.py
|
||||
|
||||
Unit-Tests für :mod:`sn_verfahrensgebiet.functions.knickpunkt_pruefung`.
|
||||
|
||||
Getestete Szenarien:
|
||||
|
||||
_extrahiere_knickpunkte:
|
||||
- Leerer Layer → leere Liste
|
||||
- Polygon mit 4 Knickpunkten → korrekte Anzahl (ohne doppelten Schlusspunkt)
|
||||
- Keine Geometrie → leere Liste
|
||||
|
||||
knickpunkt_pruefung:
|
||||
- Leere Knickpunktliste → (None, 0, 0, 0)
|
||||
- Kein PunktortTA-Layer → (None, 0, 0, 0)
|
||||
- Identischer Punkt → grün gezählt
|
||||
- Kein passender PunktortTA → rot gezählt
|
||||
- PunktortTA nahe Umring auf Flurstücksgrenze → orange gezählt
|
||||
- Abbruch via progress.is_canceled() → (None, 0, 0, 0)
|
||||
"""
|
||||
|
||||
import sys
|
||||
import types
|
||||
import unittest
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Minimales QGIS-Mock-Setup (identisch mit test_verfahrensgebiet_alkis_komplett)
|
||||
# ---------------------------------------------------------------------------
|
||||
if "qgis" not in sys.modules:
|
||||
qgis_mod = types.ModuleType("qgis")
|
||||
qgis_core = types.ModuleType("qgis.core")
|
||||
# Attribute vorab setzen, damit patch() sie überschreiben kann
|
||||
qgis_core.QgsPointXY = None
|
||||
qgis_core.QgsRectangle = None
|
||||
qgis_core.QgsSpatialIndex = None
|
||||
qgis_core.QgsMarkerSymbol = None
|
||||
qgis_core.QgsCategorizedSymbolRenderer = None
|
||||
qgis_core.QgsRendererCategory = None
|
||||
qgis_utils = types.ModuleType("qgis.utils")
|
||||
qgis_utils.iface = types.SimpleNamespace()
|
||||
qgis_utils.plugins = {}
|
||||
qgis_mod.utils = qgis_utils
|
||||
qgis_mod.core = qgis_core
|
||||
sys.modules["qgis"] = qgis_mod
|
||||
sys.modules["qgis.core"] = qgis_core
|
||||
sys.modules["qgis.utils"] = qgis_utils
|
||||
|
||||
from sn_verfahrensgebiet.functions.knickpunkt_pruefung import (
|
||||
knickpunkt_pruefung,
|
||||
_extrahiere_knickpunkte,
|
||||
WERT_IDENTISCH,
|
||||
WERT_KEIN_PTA,
|
||||
WERT_FEHLENDER_KNICK,
|
||||
)
|
||||
|
||||
_MOD = "sn_verfahrensgebiet.functions.knickpunkt_pruefung"
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Hilfsfunktionen
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def _make_layer(valid=True, crs="EPSG:25833", lid="L1"):
|
||||
layer = MagicMock()
|
||||
layer.isValid.return_value = valid
|
||||
layer.id.return_value = lid
|
||||
mock_crs = MagicMock()
|
||||
mock_crs.authid.return_value = crs
|
||||
layer.crs.return_value = mock_crs
|
||||
layer.getFeatures.return_value = []
|
||||
return layer
|
||||
|
||||
|
||||
def _make_progress(canceled_after: int = 9999):
|
||||
"""Progress-Mock: gibt is_canceled() nach N Aufrufen True zurück."""
|
||||
call_count = [0]
|
||||
|
||||
def _is_canceled():
|
||||
call_count[0] += 1
|
||||
return call_count[0] > canceled_after
|
||||
|
||||
prog = MagicMock()
|
||||
prog.is_canceled.side_effect = _is_canceled
|
||||
return prog
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Tests: _extrahiere_knickpunkte
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
class TestExtrahiereKnickpunkte(unittest.TestCase):
|
||||
|
||||
def test_leerer_layer_gibt_leere_liste(self):
|
||||
layer = _make_layer()
|
||||
layer.getFeatures.return_value = []
|
||||
result = _extrahiere_knickpunkte(layer)
|
||||
self.assertEqual(result, [])
|
||||
|
||||
def test_keine_gueltige_geometrie_gibt_leere_liste(self):
|
||||
feat = MagicMock()
|
||||
feat.geometry.return_value = None
|
||||
layer = _make_layer()
|
||||
layer.getFeatures.return_value = [feat]
|
||||
result = _extrahiere_knickpunkte(layer)
|
||||
self.assertEqual(result, [])
|
||||
|
||||
def test_feature_mit_leerer_geometrie_gibt_leere_liste(self):
|
||||
feat = MagicMock()
|
||||
geom = MagicMock()
|
||||
geom.isEmpty.return_value = True
|
||||
feat.geometry.return_value = geom
|
||||
layer = _make_layer()
|
||||
layer.getFeatures.return_value = [feat]
|
||||
result = _extrahiere_knickpunkte(layer)
|
||||
self.assertEqual(result, [])
|
||||
|
||||
def test_qgis_nicht_verfuegbar_gibt_leere_liste(self):
|
||||
"""Wenn qgis.core kein QgsPointXY hat (ImportError in Funktion), leere Liste."""
|
||||
layer = _make_layer()
|
||||
feat = MagicMock()
|
||||
geom = MagicMock()
|
||||
geom.isEmpty.return_value = False
|
||||
feat.geometry.return_value = geom
|
||||
layer.getFeatures.return_value = [feat]
|
||||
|
||||
# QgsGeometry.unaryUnion wirft eine Exception → leere Liste erwartet
|
||||
with patch(f"{_MOD}.QgsGeometry") as mock_geom_cls:
|
||||
mock_geom_cls.unaryUnion.side_effect = ImportError("kein QGIS")
|
||||
result = _extrahiere_knickpunkte(layer)
|
||||
self.assertEqual(result, [])
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Tests: knickpunkt_pruefung – Eingabevalidierung
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
class TestKnickpunktPruefungInputvalidierung(unittest.TestCase):
|
||||
|
||||
def test_keine_knickpunkte_gibt_none_zurueck(self):
|
||||
bror = _make_layer()
|
||||
bror.getFeatures.return_value = []
|
||||
result = knickpunkt_pruefung(bror, MagicMock(), None)
|
||||
layer, identisch, kein_pta, fehlend = result
|
||||
self.assertIsNone(layer)
|
||||
self.assertEqual(identisch, 0)
|
||||
self.assertEqual(kein_pta, 0)
|
||||
self.assertEqual(fehlend, 0)
|
||||
|
||||
def test_kein_punktort_layer_gibt_none_zurueck(self):
|
||||
bror = _make_layer()
|
||||
result = knickpunkt_pruefung(bror, None, None, knickpunkte=[MagicMock()])
|
||||
layer, identisch, kein_pta, fehlend = result
|
||||
self.assertIsNone(layer)
|
||||
|
||||
def test_abbruch_via_progress_gibt_none_zurueck(self):
|
||||
bror = _make_layer()
|
||||
pta = _make_layer()
|
||||
prog = _make_progress(canceled_after=0) # sofort abbrechen
|
||||
result = knickpunkt_pruefung(
|
||||
bror, pta, None,
|
||||
progress=prog,
|
||||
knickpunkte=[MagicMock()],
|
||||
)
|
||||
self.assertIsNone(result[0])
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Tests: knickpunkt_pruefung – Klassifizierungslogik (mit QGIS-Mocks)
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
class TestKnickpunktPruefungKlassifizierung(unittest.TestCase):
|
||||
"""Testet die Grün/Rot/Orange-Klassifizierung mit gesteuertem QGIS-Mock."""
|
||||
|
||||
def _make_pta_layer_mit_punkt(self, x: float, y: float, fid: int = 1):
|
||||
"""Erstellt einen PunktortTA-Layer-Mock mit einem Punkt bei (x, y)."""
|
||||
layer = _make_layer(lid=f"PTA_{fid}")
|
||||
geom = MagicMock()
|
||||
geom.isEmpty.return_value = False
|
||||
pt = MagicMock()
|
||||
pt.x.return_value = x
|
||||
pt.y.return_value = y
|
||||
geom.asPoint.return_value = pt
|
||||
feat = MagicMock()
|
||||
feat.id.return_value = fid
|
||||
feat.geometry.return_value = geom
|
||||
layer.getFeatures.return_value = [feat]
|
||||
return layer
|
||||
|
||||
def _make_bror_layer(self, x: float = 0.0, y: float = 0.0):
|
||||
"""BROR-Layer mit einer minimalen Polygon-Geometrie."""
|
||||
layer = _make_layer()
|
||||
geom = MagicMock()
|
||||
geom.isEmpty.return_value = False
|
||||
geom.area.return_value = 10000.0
|
||||
feat = MagicMock()
|
||||
feat.geometry.return_value = geom
|
||||
layer.getFeatures.return_value = [feat]
|
||||
return layer
|
||||
|
||||
@patch(f"{_MOD}.QgsGeometry")
|
||||
@patch(f"{_MOD}._baue_pta_index")
|
||||
@patch(f"{_MOD}._erstelle_ergebnis_layer")
|
||||
@patch(f"qgis.core.QgsRectangle", create=True)
|
||||
@patch(f"qgis.core.QgsPointXY", create=True)
|
||||
def test_identischer_punkt_wird_gruen_gezaehlt(
|
||||
self, mock_ptxy, mock_rect, mock_erstelle, mock_index, mock_geom_cls
|
||||
):
|
||||
"""PunktortTA exakt am Knickpunkt → identisch_count == 1."""
|
||||
# Knickpunkt bei (100, 200)
|
||||
knick = MagicMock()
|
||||
knick.x.return_value = 100.0
|
||||
knick.y.return_value = 200.0
|
||||
|
||||
# PunktortTA ebenfalls bei (100, 200) – exakter Treffer
|
||||
pta_geom = MagicMock()
|
||||
pta_geom.isEmpty.return_value = False
|
||||
pta_pt = MagicMock()
|
||||
pta_pt.x.return_value = 100.0
|
||||
pta_pt.y.return_value = 200.0
|
||||
pta_geom.asPoint.return_value = pta_pt
|
||||
|
||||
# Spatial-Index gibt Feature-ID 1 zurück
|
||||
mock_idx = MagicMock()
|
||||
mock_idx.intersects.return_value = [1]
|
||||
mock_index.return_value = (mock_idx, {1: pta_geom})
|
||||
|
||||
# Ergebnis-Layer
|
||||
pr = MagicMock()
|
||||
pr.addFeatures.return_value = True
|
||||
ergebnis = MagicMock()
|
||||
ergebnis.dataProvider.return_value = pr
|
||||
ergebnis.isValid.return_value = True
|
||||
mock_erstelle.return_value = ergebnis
|
||||
|
||||
bror = self._make_bror_layer()
|
||||
pta = self._make_pta_layer_mit_punkt(100.0, 200.0)
|
||||
|
||||
result = knickpunkt_pruefung(
|
||||
bror, pta, None, knickpunkte=[knick]
|
||||
)
|
||||
_, identisch, kein_pta, _ = result
|
||||
self.assertEqual(identisch, 1)
|
||||
self.assertEqual(kein_pta, 0)
|
||||
|
||||
@patch(f"{_MOD}.QgsGeometry")
|
||||
@patch(f"{_MOD}._baue_pta_index")
|
||||
@patch(f"{_MOD}._erstelle_ergebnis_layer")
|
||||
@patch(f"qgis.core.QgsRectangle", create=True)
|
||||
@patch(f"qgis.core.QgsPointXY", create=True)
|
||||
def test_kein_pta_an_knickpunkt_wird_rot_gezaehlt(
|
||||
self, mock_ptxy, mock_rect, mock_erstelle, mock_index, mock_geom_cls
|
||||
):
|
||||
"""Kein PunktortTA am Knickpunkt → kein_pta_count == 1."""
|
||||
knick = MagicMock()
|
||||
knick.x.return_value = 100.0
|
||||
knick.y.return_value = 200.0
|
||||
|
||||
# Spatial-Index gibt leere Liste zurück → kein Treffer
|
||||
mock_idx = MagicMock()
|
||||
mock_idx.intersects.return_value = []
|
||||
mock_index.return_value = (mock_idx, {})
|
||||
|
||||
pr = MagicMock()
|
||||
pr.addFeatures.return_value = True
|
||||
ergebnis = MagicMock()
|
||||
ergebnis.dataProvider.return_value = pr
|
||||
ergebnis.isValid.return_value = True
|
||||
mock_erstelle.return_value = ergebnis
|
||||
|
||||
bror = self._make_bror_layer()
|
||||
pta = self._make_pta_layer_mit_punkt(999.0, 999.0) # weit weg
|
||||
|
||||
result = knickpunkt_pruefung(
|
||||
bror, pta, None, knickpunkte=[knick]
|
||||
)
|
||||
_, identisch, kein_pta, _ = result
|
||||
self.assertEqual(identisch, 0)
|
||||
self.assertEqual(kein_pta, 1)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Tests: _baue_flst_vertex_set
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
class TestBaueFlstVertexSet(unittest.TestCase):
|
||||
|
||||
def test_none_layer_gibt_leeres_set(self):
|
||||
from sn_verfahrensgebiet.functions.knickpunkt_pruefung import _baue_flst_vertex_set
|
||||
result = _baue_flst_vertex_set(None, MagicMock())
|
||||
self.assertEqual(result, set())
|
||||
|
||||
def test_layer_ohne_schnitt_mit_puffer_ignoriert(self):
|
||||
from sn_verfahrensgebiet.functions.knickpunkt_pruefung import _baue_flst_vertex_set
|
||||
layer = _make_layer()
|
||||
geom = MagicMock()
|
||||
geom.isEmpty.return_value = False
|
||||
geom.intersects.return_value = False # kein Schnitt
|
||||
feat = MagicMock()
|
||||
feat.geometry.return_value = geom
|
||||
layer.getFeatures.return_value = [feat]
|
||||
buffer_geom = MagicMock()
|
||||
result = _baue_flst_vertex_set(layer, buffer_geom)
|
||||
self.assertEqual(result, set())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -17,9 +17,10 @@ Abbruchpfade:
|
||||
- Progress-Abbruch nach Schritt 1 → sofortiger sauberer Rückgabestatus
|
||||
|
||||
Flächenvergleich:
|
||||
- Übereinstimmung → show_info_dialog, keine Umringsprüfung
|
||||
- Abweichung + Nein → kein Umringsprüfungs-Aufruf
|
||||
- Abweichung + Ja → umringspruefung aufgerufen, Ergebnislayer ins Projekt
|
||||
- Übereinstimmung → show_info_dialog, keine Detailprüfung
|
||||
- Abweichung + abbrechen → kein Detailprüfungs-Aufruf
|
||||
- Abweichung + als_vg_laden → BROR umbenannt, als enriched_layer zurückgegeben
|
||||
- Abweichung + detailpruefung → lade_punktort_ta + knickpunkt_pruefung aufgerufen
|
||||
|
||||
Cleanup:
|
||||
- BROR-Layer wird bei Erfolg NICHT entfernt
|
||||
@@ -141,8 +142,10 @@ _PATCH_GET_VAR = f"{_MOD}.get_variable"
|
||||
_PATCH_PROGRESS = f"{_MOD}.create_progress_dialog"
|
||||
_PATCH_VERGLEICHE = f"{_MOD}._vergleiche_flaechen"
|
||||
_PATCH_SHOW_INFO = f"{_MOD}.show_info_dialog"
|
||||
_PATCH_ASK_YES_NO = f"{_MOD}.ask_yes_no"
|
||||
_PATCH_UMRING = f"{_MOD}.umringspruefung"
|
||||
_PATCH_ASK_DIALOG = f"{_MOD}.ask_detailpruefung_oder_vg_laden"
|
||||
_PATCH_GP_ALKIS = f"{_MOD}.lade_punktort_ta"
|
||||
_PATCH_KNICK = f"{_MOD}.knickpunkt_pruefung"
|
||||
_PATCH_EXTRAHIERE = f"{_MOD}._extrahiere_knickpunkte"
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
@@ -448,12 +451,12 @@ class TestVerfahrensgebietAlkisKomplett(unittest.TestCase):
|
||||
mock_vkz.assert_called_once_with(enriched, "")
|
||||
|
||||
# ------------------------------------------------------------------ #
|
||||
# Flächenvergleich – Abweichung + Nein
|
||||
# Flächenvergleich – Abweichung + Abbrechen
|
||||
# ------------------------------------------------------------------ #
|
||||
|
||||
@patch(_PATCH_PROGRESS)
|
||||
@patch(_PATCH_UMRING)
|
||||
@patch(_PATCH_ASK_YES_NO)
|
||||
@patch(_PATCH_KNICK)
|
||||
@patch(_PATCH_ASK_DIALOG)
|
||||
@patch(_PATCH_VERGLEICHE)
|
||||
@patch(_PATCH_VKZ)
|
||||
@patch(_PATCH_GET_VAR)
|
||||
@@ -463,11 +466,11 @@ class TestVerfahrensgebietAlkisKomplett(unittest.TestCase):
|
||||
@patch(_PATCH_GEM)
|
||||
@patch(_PATCH_FLST)
|
||||
@patch(_PATCH_VG_ALKIS)
|
||||
def test_flaechen_abweichung_nein_kein_umring(
|
||||
def test_flaechen_abweichung_abbrechen_kein_detailcheck(
|
||||
self, mock_vg, mock_flst, mock_gem, mock_proj, mock_select,
|
||||
mock_erstelle, mock_get_var, mock_vkz, mock_vergl, mock_ask, mock_umring, mock_prog,
|
||||
mock_erstelle, mock_get_var, mock_vkz, mock_vergl, mock_ask, mock_knick, mock_prog,
|
||||
):
|
||||
"""Abweichung + Nein → umringspruefung wird NICHT aufgerufen."""
|
||||
"""Abweichung + Abbrechen → knickpunkt_pruefung wird NICHT aufgerufen."""
|
||||
mock_proj.instance.return_value = _DummyProject()
|
||||
vg_layer = _make_layer(name="BauRaumOrdnungsrecht (ALKIS)")
|
||||
flst_layer = _make_layer(name="Flurstücke")
|
||||
@@ -480,23 +483,22 @@ class TestVerfahrensgebietAlkisKomplett(unittest.TestCase):
|
||||
mock_erstelle.return_value = (enriched, 3, 0)
|
||||
mock_get_var.return_value = ""
|
||||
mock_vergl.return_value = (1000.0, 800.0, False)
|
||||
mock_ask.return_value = False
|
||||
mock_ask.return_value = "abbrechen"
|
||||
mock_prog.return_value = _make_progress_mock()
|
||||
|
||||
result_enriched, _, _, status = verfahrensgebiet_alkis_komplett(None)
|
||||
|
||||
mock_umring.assert_not_called()
|
||||
mock_knick.assert_not_called()
|
||||
self.assertIs(result_enriched, enriched)
|
||||
self.assertEqual(status, LoadStatus.FIRST)
|
||||
|
||||
# ------------------------------------------------------------------ #
|
||||
# Flächenvergleich – Abweichung + Ja → Umringsprüfung
|
||||
# Flächenvergleich – Abweichung + Als VG laden
|
||||
# ------------------------------------------------------------------ #
|
||||
|
||||
@patch(_PATCH_PROGRESS)
|
||||
@patch(_PATCH_SHOW_INFO)
|
||||
@patch(_PATCH_UMRING)
|
||||
@patch(_PATCH_ASK_YES_NO)
|
||||
@patch(_PATCH_KNICK)
|
||||
@patch(_PATCH_ASK_DIALOG)
|
||||
@patch(_PATCH_VERGLEICHE)
|
||||
@patch(_PATCH_VKZ)
|
||||
@patch(_PATCH_GET_VAR)
|
||||
@@ -506,20 +508,18 @@ class TestVerfahrensgebietAlkisKomplett(unittest.TestCase):
|
||||
@patch(_PATCH_GEM)
|
||||
@patch(_PATCH_FLST)
|
||||
@patch(_PATCH_VG_ALKIS)
|
||||
def test_flaechen_abweichung_ja_startet_umringspruefung(
|
||||
def test_flaechen_abweichung_als_vg_laden(
|
||||
self, mock_vg, mock_flst, mock_gem, mock_proj, mock_select,
|
||||
mock_erstelle, mock_get_var, mock_vkz, mock_vergl, mock_ask,
|
||||
mock_umring, mock_info, mock_prog,
|
||||
mock_erstelle, mock_get_var, mock_vkz, mock_vergl, mock_ask, mock_knick, mock_prog,
|
||||
):
|
||||
"""Abweichung + Ja → umringspruefung aufgerufen, Ergebnislayer ins Projekt,
|
||||
Abschlussmeldung mit Konfliktanzahl."""
|
||||
"""Abweichung + Als VG laden → BROR-Layer wird umbenannt und als
|
||||
enriched_layer zurückgegeben; flst_layer und bror_layer sind None."""
|
||||
proj_inst = _DummyProject()
|
||||
mock_proj.instance.return_value = proj_inst
|
||||
|
||||
vg_layer = _make_layer(name="BauRaumOrdnungsrecht (ALKIS)")
|
||||
flst_layer = _make_layer(name="Flurstücke")
|
||||
enriched = _make_layer(name="Verfahrensgebiet", valid=True)
|
||||
ergebnis_layer = _make_layer(name="Umringsprüfung", lid="UMRING_L")
|
||||
vg_layer = _make_layer(name="BauRaumOrdnungsrecht (ALKIS)", lid="BROR_VG")
|
||||
flst_layer = _make_layer(name="Flurstücke")
|
||||
enriched = _make_layer(name="Verfahrensgebiet", valid=True)
|
||||
|
||||
mock_vg.return_value = (vg_layer, LoadStatus.FIRST, [])
|
||||
mock_gem.return_value = []
|
||||
@@ -528,17 +528,79 @@ class TestVerfahrensgebietAlkisKomplett(unittest.TestCase):
|
||||
mock_erstelle.return_value = (enriched, 3, 0)
|
||||
mock_get_var.return_value = ""
|
||||
mock_vergl.return_value = (1000.0, 800.0, False)
|
||||
mock_ask.return_value = True
|
||||
mock_umring.return_value = (ergebnis_layer, 4)
|
||||
mock_ask.return_value = "als_vg_laden"
|
||||
mock_prog.return_value = _make_progress_mock()
|
||||
|
||||
result_enriched, result_flst, result_bror, status = verfahrensgebiet_alkis_komplett(None)
|
||||
|
||||
mock_knick.assert_not_called()
|
||||
# BROR-Layer wird als enriched_layer zurückgegeben
|
||||
self.assertIs(result_enriched, vg_layer)
|
||||
self.assertIsNone(result_flst)
|
||||
self.assertIsNone(result_bror)
|
||||
self.assertEqual(status, LoadStatus.FIRST)
|
||||
# Name wurde auf VERF_LAYER_NAME geändert
|
||||
vg_layer.setName.assert_called()
|
||||
|
||||
# ------------------------------------------------------------------ #
|
||||
# Flächenvergleich – Abweichung + Detailprüfung
|
||||
# ------------------------------------------------------------------ #
|
||||
|
||||
@patch(_PATCH_PROGRESS)
|
||||
@patch(_PATCH_SHOW_INFO)
|
||||
@patch(_PATCH_EXTRAHIERE)
|
||||
@patch(_PATCH_KNICK)
|
||||
@patch(_PATCH_GP_ALKIS)
|
||||
@patch(_PATCH_ASK_DIALOG)
|
||||
@patch(_PATCH_VERGLEICHE)
|
||||
@patch(_PATCH_VKZ)
|
||||
@patch(_PATCH_GET_VAR)
|
||||
@patch(_PATCH_ERSTELLE)
|
||||
@patch(_PATCH_SELECT)
|
||||
@patch(_PATCH_PROJECT)
|
||||
@patch(_PATCH_GEM)
|
||||
@patch(_PATCH_FLST)
|
||||
@patch(_PATCH_VG_ALKIS)
|
||||
def test_flaechen_abweichung_detailpruefung_startet_knickpruefung(
|
||||
self, mock_vg, mock_flst, mock_gem, mock_proj, mock_select,
|
||||
mock_erstelle, mock_get_var, mock_vkz, mock_vergl, mock_ask,
|
||||
mock_gp, mock_knick, mock_extrahiere, mock_info, mock_prog,
|
||||
):
|
||||
"""Abweichung + Detailprüfung → lade_punktort_ta + knickpunkt_pruefung
|
||||
aufgerufen, Ergebnislayer ins Projekt, Abschlussmeldung mit Zählung."""
|
||||
proj_inst = _DummyProject()
|
||||
mock_proj.instance.return_value = proj_inst
|
||||
|
||||
vg_layer = _make_layer(name="BauRaumOrdnungsrecht (ALKIS)")
|
||||
flst_layer = _make_layer(name="Flurstücke")
|
||||
enriched = _make_layer(name="Verfahrensgebiet", valid=True)
|
||||
punktort_layer = _make_layer(name="PunktortTA", lid="PTA_L")
|
||||
ergebnis_layer = _make_layer(name="Knickpunktprüfung", lid="KNICK_L")
|
||||
|
||||
mock_vg.return_value = (vg_layer, LoadStatus.FIRST, [])
|
||||
mock_gem.return_value = []
|
||||
mock_flst.return_value = (flst_layer, LoadStatus.FIRST)
|
||||
mock_select.return_value = 3
|
||||
mock_erstelle.return_value = (enriched, 3, 0)
|
||||
mock_get_var.return_value = ""
|
||||
mock_vergl.return_value = (1000.0, 800.0, False)
|
||||
mock_ask.return_value = "detailpruefung"
|
||||
mock_extrahiere.return_value = [MagicMock(), MagicMock(), MagicMock()] # 3 Knickpunkte
|
||||
mock_gp.return_value = punktort_layer
|
||||
mock_knick.return_value = (ergebnis_layer, 2, 1, 0)
|
||||
mock_prog.return_value = _make_progress_mock()
|
||||
|
||||
result_enriched, _, _, status = verfahrensgebiet_alkis_komplett(None)
|
||||
|
||||
mock_umring.assert_called_once()
|
||||
mock_gp.assert_called_once()
|
||||
mock_knick.assert_called_once()
|
||||
self.assertIn(ergebnis_layer, proj_inst.added)
|
||||
mock_info.assert_called_once()
|
||||
self.assertIn("4", mock_info.call_args[0][1])
|
||||
self.assertIn("Konfliktstellen", mock_info.call_args[0][1])
|
||||
# Abschlussmeldung muss Zahlen enthalten
|
||||
info_text = mock_info.call_args[0][1]
|
||||
self.assertIn("3", info_text) # Anzahl Knickpunkte
|
||||
self.assertIn("2", info_text) # identisch
|
||||
self.assertIn("1", info_text) # kein_pta
|
||||
self.assertEqual(status, LoadStatus.FIRST)
|
||||
|
||||
# ------------------------------------------------------------------ #
|
||||
|
||||
Reference in New Issue
Block a user