Tests für Dateipruefer._ist_leer (None/Whitespace), Dateipruefer._handle_leere_eingabe (Priorität bei mehreren Flags), Datenschreiber._store_style_in_gpkg (nachgezogen aus #63, siehe #67) und Pruefmanager._handle_verfahrensgebiet_layer_existiert (entfernen/ersetzen) ergänzt. Linkpruefer._ist_url/_pruefe_url/_pruefe_dateipfad und Pruefmanager._handle_datei_existiert sind bereits über pruefe()/verarbeite() vollständig abgedeckt und bekommen den Vermerk "von Test abgesehen". Pruefmanager._ask_use_or_replace_pufferlayer ist toter Code (Bug #60) und bleibt bis zur Behebung unmarkiert getestet, nur vermerkt. sn_basis steht damit laut Prüfstand bei 0 ungeklärten Funktionen. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
201 lines
8.9 KiB
Python
201 lines
8.9 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")))
|
|
|
|
# -----------------------------------------------------
|
|
# 10. _ist_leer: Sonderfälle jenseits von ""
|
|
# -----------------------------------------------------
|
|
def test_ist_leer_erkennt_none_und_nicht_string_als_leer(self):
|
|
"""Prüft, dass _ist_leer sowohl None als auch einen Nicht-String-Wert als leer meldet."""
|
|
self.assertTrue(Dateipruefer(pfad=None)._ist_leer())
|
|
self.assertTrue(Dateipruefer(pfad=123)._ist_leer())
|
|
|
|
def test_ist_leer_erkennt_reinen_whitespace_als_leer(self):
|
|
"""Prüft, dass _ist_leer eine Eingabe aus reinen Leerzeichen als leer meldet."""
|
|
self.assertTrue(Dateipruefer(pfad=" ")._ist_leer())
|
|
|
|
def test_ist_leer_meldet_pfad_mit_sichtbaren_zeichen_nicht_als_leer(self):
|
|
"""Prüft, dass _ist_leer einen Pfad mit sichtbaren Zeichen nicht als leer meldet."""
|
|
self.assertFalse(Dateipruefer(pfad=" a.gpkg ")._ist_leer())
|
|
|
|
# -----------------------------------------------------
|
|
# 11. _handle_leere_eingabe: Priorität bei mehreren gesetzten Flags
|
|
# -----------------------------------------------------
|
|
def test_leere_eingabe_bevorzugt_leereingabe_erlaubt_vor_standarddatei(self):
|
|
"""Prüft, dass bei leerer Eingabe leereingabe_erlaubt Vorrang vor einer gesetzten Standarddatei hat."""
|
|
pruefer = Dateipruefer(pfad="", leereingabe_erlaubt=True, standarddatei="/tmp/std.txt")
|
|
|
|
result = pruefer._handle_leere_eingabe()
|
|
|
|
self.assertEqual(result.aktion, "leereingabe_erlaubt")
|
|
|
|
def test_leere_eingabe_bevorzugt_standarddatei_vor_temporaer_erlaubt(self):
|
|
"""Prüft, dass bei leerer Eingabe eine gesetzte Standarddatei Vorrang vor temporaer_erlaubt hat."""
|
|
pruefer = Dateipruefer(pfad="", standarddatei="/tmp/std.txt", temporaer_erlaubt=True)
|
|
|
|
result = pruefer._handle_leere_eingabe()
|
|
|
|
self.assertEqual(result.aktion, "standarddatei_vorschlagen")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|