"""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, CSV_SPALTE_VEF_VKZF, ) _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( [CSV_SPALTE_VEF_VKZF, "FLA_Beteiligung", CSV_SPALTE_FLURSTUECK], [["12345", "1", "1234/123/45/00"]], ) mock_fd.getOpenFileName.return_value = (pfad, "") zeilen, spalten = lade_beteiligung_csv(None) self.assertEqual(len(zeilen), 1) self.assertIn(CSV_SPALTE_FLURSTUECK, spalten) self.assertEqual(zeilen[0][CSV_SPALTE_FLURSTUECK], "1234/123/45/00") if __name__ == "__main__": unittest.main()