Funktion angelegt, Button eingefügt
This commit is contained in:
@@ -0,0 +1,157 @@
|
||||
"""sn_verfahrensgebiet/tests/test_beteiligung_pruefung.py
|
||||
|
||||
Unit-Tests für :mod:`sn_verfahrensgebiet.functions.beteiligung_pruefung`.
|
||||
|
||||
Getestete Szenarien:
|
||||
|
||||
baue_flurstueck_csv:
|
||||
- Normalfall mit führenden Nullen bei Zähler/Nenner
|
||||
- Nenner = 0 → Platzhalter "____"
|
||||
- Nenner leer → Platzhalter "____"
|
||||
- Ungültiges Format (nicht 4 Teile) → None
|
||||
- Leerer Wert → None
|
||||
|
||||
baue_flurstueck_csv_liste:
|
||||
- Bildet Liste nur aus gültigen Zeilen, schreibt Flurstueck_csv in jede Zeile zurück
|
||||
|
||||
lade_beteiligung_csv:
|
||||
- Dateidialog abgebrochen → None
|
||||
- Spalte FLURSTUECK fehlt → BeteiligungPruefungFehler
|
||||
- Leere Datei → BeteiligungPruefungFehler
|
||||
- Erfolgsfall → (zeilen, spaltennamen)
|
||||
"""
|
||||
|
||||
import csv
|
||||
import os
|
||||
import sys
|
||||
import tempfile
|
||||
import types
|
||||
import unittest
|
||||
from unittest.mock import patch
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Minimales QGIS-Mock-Setup
|
||||
# ---------------------------------------------------------------------------
|
||||
if "qgis" not in sys.modules:
|
||||
qgis_mod = types.ModuleType("qgis")
|
||||
qgis_core = types.ModuleType("qgis.core")
|
||||
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.beteiligung_pruefung import (
|
||||
baue_flurstueck_csv,
|
||||
baue_flurstueck_csv_liste,
|
||||
lade_beteiligung_csv,
|
||||
BeteiligungPruefungFehler,
|
||||
FELD_FLURSTUECK_CSV,
|
||||
CSV_SPALTE_FLURSTUECK,
|
||||
)
|
||||
|
||||
_MOD = "sn_verfahrensgebiet.functions.beteiligung_pruefung"
|
||||
|
||||
|
||||
class TestBaueFlurstueckCsv(unittest.TestCase):
|
||||
def test_normalfall_mit_fuehrenden_nullen(self):
|
||||
ergebnis = baue_flurstueck_csv("1234/123/45/00", "14")
|
||||
self.assertEqual(ergebnis, "141234___00123004500")
|
||||
|
||||
def test_nenner_null_wird_zu_unterstrichen(self):
|
||||
ergebnis = baue_flurstueck_csv("1234/123/0/00", "14")
|
||||
self.assertEqual(ergebnis, "141234___00123____00")
|
||||
|
||||
def test_nenner_leer_wird_zu_unterstrichen(self):
|
||||
ergebnis = baue_flurstueck_csv("1234//45/00", "14")
|
||||
# Gemarkung 1234, Zähler leer -> "00000"? -> zfill auf leeren String ergibt "00000"
|
||||
self.assertTrue(ergebnis.startswith("141234___00000"))
|
||||
|
||||
def test_gemarkung_ohne_fuehrende_nullen_wird_aufgefuellt(self):
|
||||
ergebnis = baue_flurstueck_csv("12/1/1/00", "14")
|
||||
self.assertTrue(ergebnis.startswith("140012___"))
|
||||
|
||||
def test_ungueltiges_format_gibt_none(self):
|
||||
self.assertIsNone(baue_flurstueck_csv("1234/123/45", "14"))
|
||||
self.assertIsNone(baue_flurstueck_csv("1234/123/45/00/99", "14"))
|
||||
|
||||
def test_leerer_wert_gibt_none(self):
|
||||
self.assertIsNone(baue_flurstueck_csv("", "14"))
|
||||
self.assertIsNone(baue_flurstueck_csv(None, "14"))
|
||||
|
||||
|
||||
class TestBaueFlurstueckCsvListe(unittest.TestCase):
|
||||
def test_nur_gueltige_zeilen_in_liste(self):
|
||||
zeilen = [
|
||||
{CSV_SPALTE_FLURSTUECK: "1234/123/45/00"},
|
||||
{CSV_SPALTE_FLURSTUECK: "ungueltig"},
|
||||
{CSV_SPALTE_FLURSTUECK: "5678/1/0/01"},
|
||||
]
|
||||
ergebnis = baue_flurstueck_csv_liste(zeilen, "14")
|
||||
self.assertEqual(len(ergebnis), 2)
|
||||
self.assertEqual(zeilen[0][FELD_FLURSTUECK_CSV], "141234___00123004500")
|
||||
self.assertEqual(zeilen[1][FELD_FLURSTUECK_CSV], "")
|
||||
self.assertEqual(zeilen[2][FELD_FLURSTUECK_CSV], "145678___00001____01")
|
||||
|
||||
|
||||
class TestLadeBeteiligungCsv(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self._tmp_files = []
|
||||
|
||||
def tearDown(self):
|
||||
for pfad in self._tmp_files:
|
||||
try:
|
||||
os.remove(pfad)
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
def _schreibe_csv(self, header, zeilen):
|
||||
fd, pfad = tempfile.mkstemp(suffix=".csv")
|
||||
self._tmp_files.append(pfad)
|
||||
with os.fdopen(fd, "w", encoding="utf-8", newline="") as f:
|
||||
writer = csv.writer(f)
|
||||
writer.writerow(header)
|
||||
for zeile in zeilen:
|
||||
writer.writerow(zeile)
|
||||
return pfad
|
||||
|
||||
@patch(f"{_MOD}.QFileDialog")
|
||||
def test_dialog_abgebrochen_gibt_none(self, mock_fd):
|
||||
mock_fd.getOpenFileName.return_value = ("", "")
|
||||
self.assertIsNone(lade_beteiligung_csv(None))
|
||||
|
||||
@patch(f"{_MOD}.QFileDialog")
|
||||
def test_fehlende_flurstueck_spalte_wirft_fehler(self, mock_fd):
|
||||
pfad = self._schreibe_csv(["FOO", "BAR"], [["1", "2"]])
|
||||
mock_fd.getOpenFileName.return_value = (pfad, "")
|
||||
with self.assertRaises(BeteiligungPruefungFehler) as ctx:
|
||||
lade_beteiligung_csv(None)
|
||||
self.assertIn(CSV_SPALTE_FLURSTUECK, str(ctx.exception))
|
||||
|
||||
@patch(f"{_MOD}.QFileDialog")
|
||||
def test_leere_datei_wirft_fehler(self, mock_fd):
|
||||
fd, pfad = tempfile.mkstemp(suffix=".csv")
|
||||
os.close(fd)
|
||||
self._tmp_files.append(pfad)
|
||||
mock_fd.getOpenFileName.return_value = (pfad, "")
|
||||
with self.assertRaises(BeteiligungPruefungFehler):
|
||||
lade_beteiligung_csv(None)
|
||||
|
||||
@patch(f"{_MOD}.QFileDialog")
|
||||
def test_erfolgsfall_gibt_zeilen_und_spalten_zurueck(self, mock_fd):
|
||||
pfad = self._schreibe_csv(
|
||||
["FLURSTUECK", "VEF_VKZF", "FLA_BETEILIGUNG"],
|
||||
[["1234/123/45/00", "12345", "1"]],
|
||||
)
|
||||
mock_fd.getOpenFileName.return_value = (pfad, "")
|
||||
zeilen, spalten = lade_beteiligung_csv(None)
|
||||
self.assertEqual(len(zeilen), 1)
|
||||
self.assertIn("FLURSTUECK", spalten)
|
||||
self.assertEqual(zeilen[0]["FLURSTUECK"], "1234/123/45/00")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user