Files
Plugin_SN_Basis/tests/test_dateipruefer.py
T
DanielandClaude Sonnet 5 7ce820581f Tests für restliche priorisierte sn_basis-Funktionen ergänzt (#65)
79 neue Testfälle: Verfahrensgebiet-Zustandsverwaltung (Listener-Setup/
-teardown, Signal-Handler), DockManager/BaseDockWidget, pruef_ergebnis-
Persistenz-Gates, Pruefmanager-Entscheidungswege, restliche Dateipruefer-
Zweige, Fundament-Wrapper (sys_wrapper, ly_existence_wrapper,
ly_style_wrapper.apply_style_from_path, landkreise, message_wrapper,
qgiscore_wrapper.polygon_zu_linie/layer_exists_in_gpkg,
qgisui_wrapper.add_layer_to_project) und SettingsTab.save_data/load_data.

Ausgeklammert: LayerLoader.apply_style/ly_style_wrapper.apply_style
(Bug-Verdacht, hartkodierter Fachplugin-Pfad) und
Pruefmanager._ask_use_or_replace_pufferlayer (bereits als Bug in #60
erfasst: ruft nicht existierendes self.pruefmanager auf).

qt_wrapper._MockQDockWidget um closeEvent() ergänzt (fehlte, ließ jede
BaseDockWidget.closeEvent()-Ausführung im Mock-Modus abstürzen).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-18 11:20:10 +02:00

166 lines
7.0 KiB
Python

# sn_basis/test/test_dateipruefer.py
import unittest
from pathlib import Path
from tempfile import TemporaryDirectory
from unittest.mock import patch
from sn_basis.modules.Dateipruefer import Dateipruefer
class TestDateipruefer(unittest.TestCase):
# -----------------------------------------------------
# 1. Leere Eingabe erlaubt
# -----------------------------------------------------
def test_leereingabe_erlaubt(self):
"""Prüft, dass eine leere Pfadangabe bei leereingabe_erlaubt=True als 'leereingabe_erlaubt' ohne Kontext gemeldet wird."""
pruefer = Dateipruefer(
pfad="",
leereingabe_erlaubt=True
)
result = pruefer.pruefe()
self.assertFalse(result.ok)
self.assertEqual(result.aktion, "leereingabe_erlaubt")
self.assertIsNone(result.kontext)
# -----------------------------------------------------
# 2. Leere Eingabe nicht erlaubt
# -----------------------------------------------------
def test_leereingabe_nicht_erlaubt(self):
"""Prüft, dass eine leere Pfadangabe ohne leereingabe_erlaubt als 'leereingabe_nicht_erlaubt' abgelehnt wird."""
pruefer = Dateipruefer(
pfad="",
leereingabe_erlaubt=False
)
result = pruefer.pruefe()
self.assertFalse(result.ok)
self.assertEqual(result.aktion, "leereingabe_nicht_erlaubt")
self.assertIsNone(result.kontext)
# -----------------------------------------------------
# 3. Standarddatei vorschlagen
# -----------------------------------------------------
def test_standarddatei_vorschlagen(self):
"""Prüft, dass bei leerer Pfadangabe mit gesetzter Standarddatei 'standarddatei_vorschlagen' mit dem Standardpfad als Kontext geliefert wird.
Deckt nicht ab, ob die Standarddatei tatsächlich existiert - das wird hier
(und in Pruefmanager._handle_basic_decision() bei einer Ja-Antwort) nirgends
geprüft. Fix zurückgestellt, bis geklärt ist, ob der Standarddatei-Modus
überhaupt gebraucht wird (Basis #59, siehe STATUS.md).
"""
pruefer = Dateipruefer(
pfad="",
standarddatei="/tmp/std.txt"
)
result = pruefer.pruefe()
self.assertFalse(result.ok)
self.assertEqual(result.aktion, "standarddatei_vorschlagen")
self.assertEqual(result.kontext, Path("/tmp/std.txt"))
# -----------------------------------------------------
# 4. Temporäre Datei erlaubt
# -----------------------------------------------------
def test_temporaer_erlaubt(self):
"""Prüft, dass eine leere Pfadangabe bei temporaer_erlaubt=True als 'temporaer_erlaubt' ohne Kontext gemeldet wird."""
pruefer = Dateipruefer(
pfad="",
temporaer_erlaubt=True
)
result = pruefer.pruefe()
self.assertFalse(result.ok)
self.assertEqual(result.aktion, "temporaer_erlaubt")
self.assertIsNone(result.kontext)
# -----------------------------------------------------
# 5. Datei existiert nicht
# -----------------------------------------------------
@patch("sn_basis.modules.Dateipruefer.file_exists", return_value=False)
def test_datei_nicht_gefunden(self, mock_exists):
"""Prüft, dass ein nicht existierender Dateipfad als 'datei_nicht_gefunden' mit dem Pfad als Kontext abgelehnt wird."""
pruefer = Dateipruefer(
pfad="/tmp/nichtvorhanden.txt"
)
result = pruefer.pruefe()
self.assertFalse(result.ok)
self.assertEqual(result.aktion, "datei_nicht_gefunden")
self.assertEqual(result.kontext, Path("/tmp/nichtvorhanden.txt"))
# -----------------------------------------------------
# 6. Datei existiert
# -----------------------------------------------------
@patch("sn_basis.modules.Dateipruefer.file_exists", return_value=True)
def test_datei_ok(self, mock_exists):
"""Prüft, dass ein existierender Dateipfad als 'ok' mit dem Pfad als Kontext bestätigt wird."""
pruefer = Dateipruefer(
pfad="/tmp/test.txt"
)
result = pruefer.pruefe()
self.assertTrue(result.ok)
self.assertEqual(result.aktion, "ok")
self.assertEqual(result.kontext, Path("/tmp/test.txt"))
# -----------------------------------------------------
# 7. erkenne_dateityp
# -----------------------------------------------------
def test_erkenne_dateityp_unterscheidet_excel_datenbank_und_unbekannt(self):
"""Prüft, dass erkenne_dateityp .xlsx als 'excel', .gpkg/.sqlite als 'datenbank' und Rest als 'unbekannt' erkennt."""
pruefer = Dateipruefer(pfad="ignoriert")
self.assertEqual(pruefer.erkenne_dateityp(Path("liste.xlsx")), "excel")
self.assertEqual(pruefer.erkenne_dateityp(Path("daten.gpkg")), "datenbank")
self.assertEqual(pruefer.erkenne_dateityp(Path("daten.sqlite")), "datenbank")
self.assertEqual(pruefer.erkenne_dateityp(Path("text.txt")), "unbekannt")
# -----------------------------------------------------
# 8. _pfad: relativ vs. absolut
# -----------------------------------------------------
def test_pfad_verbindet_relativen_pfad_mit_basispfad(self):
"""Prüft, dass _pfad einen relativen Pfad mit dem Basisverzeichnis verbindet."""
pruefer = Dateipruefer(pfad="ignoriert", basis_pfad="C:/verfahren")
self.assertEqual(pruefer._pfad("daten.gpkg"), Path("C:/verfahren/daten.gpkg"))
def test_pfad_laesst_absoluten_pfad_unveraendert(self):
"""Prüft, dass _pfad einen bereits absoluten Pfad nicht mit dem Basisverzeichnis verbindet."""
pruefer = Dateipruefer(pfad="ignoriert", basis_pfad="C:/verfahren")
self.assertEqual(pruefer._pfad("/absolut/daten.gpkg"), Path("/absolut/daten.gpkg"))
# -----------------------------------------------------
# 9. _ist_gueltiger_gpkg_pfad
# -----------------------------------------------------
def test_ist_gueltiger_gpkg_pfad_akzeptiert_vorhandenes_verzeichnis(self):
"""Prüft, dass ein .gpkg-Pfad mit vorhandenem Zielverzeichnis als gültig gilt."""
pruefer = Dateipruefer(pfad="ignoriert")
with TemporaryDirectory() as tmp:
self.assertTrue(pruefer._ist_gueltiger_gpkg_pfad(Path(tmp) / "verfahren.gpkg"))
def test_ist_gueltiger_gpkg_pfad_lehnt_falsche_endung_ab(self):
"""Prüft, dass ein Pfad ohne .gpkg-Endung als ungültig gilt, auch bei vorhandenem Verzeichnis."""
pruefer = Dateipruefer(pfad="ignoriert")
with TemporaryDirectory() as tmp:
self.assertFalse(pruefer._ist_gueltiger_gpkg_pfad(Path(tmp) / "verfahren.txt"))
def test_ist_gueltiger_gpkg_pfad_lehnt_fehlendes_verzeichnis_ab(self):
"""Prüft, dass ein .gpkg-Pfad in einem nicht vorhandenen Verzeichnis als ungültig gilt."""
pruefer = Dateipruefer(pfad="ignoriert")
self.assertFalse(pruefer._ist_gueltiger_gpkg_pfad(Path("C:/nicht/vorhanden/verfahren.gpkg")))
if __name__ == "__main__":
unittest.main()