# 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()