Auf Wrapper umgestellt, Prüfarchitektur QT6-kompatibel gemacht (Nicht lauffähig)

This commit is contained in:
2025-12-18 22:00:31 +01:00
parent f64d56d4bc
commit e8fea163b5
31 changed files with 2791 additions and 889 deletions

View File

@@ -1,86 +1,133 @@
#test_pruefmanager.py
# sn_basis/test/test_pruefmanager.py
import unittest
import os
import sys
from unittest.mock import patch, MagicMock
from unittest.mock import patch
# Plugin-Root ermitteln (ein Verzeichnis über "test")
ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
sys.path.insert(0, ROOT)
from modules.Pruefmanager import PruefManager
from modules.Dateipruefer import DateiEntscheidung
import modules.qt_compat as qt_compat
from sn_basis.modules.Pruefmanager import Pruefmanager
from sn_basis.modules.pruef_ergebnis import pruef_ergebnis
# Skip-Decorator für Mock-Modus
def skip_if_mock(reason):
return unittest.skipIf(
qt_compat.QT_VERSION == 0,
f"{reason} — MOCK-Modus erkannt. "
"Bitte diesen Test in einer echten QGIS-Umgebung ausführen."
)
class TestPruefManager(unittest.TestCase):
class TestPruefmanager(unittest.TestCase):
def setUp(self):
self.manager = PruefManager(plugin_pfad="/tmp")
self.manager = Pruefmanager()
# ---------------------------------------------------------
# Tests für frage_datei_ersetzen_oder_anhaengen
# ---------------------------------------------------------
# -----------------------------------------------------
# 1. OK-Ergebnis → keine Interaktion
# -----------------------------------------------------
def test_ok(self):
ergebnis = pruef_ergebnis(True, "Alles gut", "ok", None)
entscheidung = self.manager.verarbeite(ergebnis)
@skip_if_mock("Qt-Enums können im Mock-Modus nicht OR-kombiniert werden")
@patch("modules.qt_compat.exec_dialog", return_value=qt_compat.YES)
def test_frage_datei_ersetzen(self, mock_exec):
entscheidung = self.manager.frage_datei_ersetzen_oder_anhaengen("dummy.gpkg")
self.assertEqual(entscheidung, DateiEntscheidung.ERSETZEN)
self.assertTrue(entscheidung.ok)
self.assertEqual(entscheidung.aktion, "ok")
@skip_if_mock("Qt-Enums können im Mock-Modus nicht OR-kombiniert werden")
@patch("modules.qt_compat.exec_dialog", return_value=qt_compat.NO)
def test_frage_datei_anhaengen(self, mock_exec):
entscheidung = self.manager.frage_datei_ersetzen_oder_anhaengen("dummy.gpkg")
self.assertEqual(entscheidung, DateiEntscheidung.ANHAENGEN)
# -----------------------------------------------------
# 2. Leere Eingabe erlaubt → Nutzer sagt JA
# -----------------------------------------------------
@patch("sn_basis.functions.qgisqt_wrapper.ask_yes_no", return_value=True)
def test_leereingabe_erlaubt_ja(self, mock_ask):
ergebnis = pruef_ergebnis(False, "Leer?", "leereingabe_erlaubt", None)
entscheidung = self.manager.verarbeite(ergebnis)
@skip_if_mock("Qt-Enums können im Mock-Modus nicht OR-kombiniert werden")
@patch("modules.qt_compat.exec_dialog", return_value=qt_compat.CANCEL)
def test_frage_datei_abbrechen(self, mock_exec):
entscheidung = self.manager.frage_datei_ersetzen_oder_anhaengen("dummy.gpkg")
self.assertEqual(entscheidung, DateiEntscheidung.ABBRECHEN)
self.assertTrue(entscheidung.ok)
self.assertEqual(entscheidung.aktion, "ok")
# ---------------------------------------------------------
# Fehlerfall: exec_dialog liefert etwas Unerwartetes
# ---------------------------------------------------------
# -----------------------------------------------------
# 3. Leere Eingabe erlaubt → Nutzer sagt NEIN
# -----------------------------------------------------
@patch("sn_basis.functions.qgisqt_wrapper.ask_yes_no", return_value=False)
def test_leereingabe_erlaubt_nein(self, mock_ask):
ergebnis = pruef_ergebnis(False, "Leer?", "leereingabe_erlaubt", None)
entscheidung = self.manager.verarbeite(ergebnis)
@skip_if_mock("Qt-Enums können im Mock-Modus nicht OR-kombiniert werden")
@patch("modules.qt_compat.exec_dialog", return_value=999)
def test_frage_datei_unbekannte_antwort(self, mock_exec):
entscheidung = self.manager.frage_datei_ersetzen_oder_anhaengen("dummy.gpkg")
self.assertEqual(entscheidung, DateiEntscheidung.ABBRECHEN)
self.assertFalse(entscheidung.ok)
self.assertEqual(entscheidung.aktion, "leereingabe_erlaubt")
# ---------------------------------------------------------
# Tests für frage_temporär_verwenden
# ---------------------------------------------------------
# -----------------------------------------------------
# 4. Standarddatei vorschlagen → Nutzer sagt JA
# -----------------------------------------------------
@patch("sn_basis.functions.qgisqt_wrapper.ask_yes_no", return_value=True)
def test_standarddatei_vorschlagen_ja(self, mock_ask):
ergebnis = pruef_ergebnis(False, "Standarddatei verwenden?", "standarddatei_vorschlagen", "/tmp/std.txt")
entscheidung = self.manager.verarbeite(ergebnis)
@skip_if_mock("Qt-Enums können im Mock-Modus nicht OR-kombiniert werden")
@patch("modules.qt_compat.exec_dialog", return_value=qt_compat.YES)
def test_frage_temporär_verwenden_ja(self, mock_exec):
self.assertTrue(self.manager.frage_temporär_verwenden())
self.assertTrue(entscheidung.ok)
self.assertEqual(entscheidung.aktion, "ok")
self.assertEqual(entscheidung.pfad, "/tmp/std.txt")
@skip_if_mock("Qt-Enums können im Mock-Modus nicht OR-kombiniert werden")
@patch("modules.qt_compat.exec_dialog", return_value=qt_compat.NO)
def test_frage_temporär_verwenden_nein(self, mock_exec):
self.assertFalse(self.manager.frage_temporär_verwenden())
# -----------------------------------------------------
# 5. Standarddatei vorschlagen → Nutzer sagt NEIN
# -----------------------------------------------------
@patch("sn_basis.functions.qgisqt_wrapper.ask_yes_no", return_value=False)
def test_standarddatei_vorschlagen_nein(self, mock_ask):
ergebnis = pruef_ergebnis(False, "Standarddatei verwenden?", "standarddatei_vorschlagen", "/tmp/std.txt")
entscheidung = self.manager.verarbeite(ergebnis)
# ---------------------------------------------------------
# Fehlerfall: exec_dialog liefert etwas Unerwartetes
# ---------------------------------------------------------
self.assertFalse(entscheidung.ok)
self.assertEqual(entscheidung.aktion, "standarddatei_vorschlagen")
@skip_if_mock("Qt-Enums können im Mock-Modus nicht OR-kombiniert werden")
@patch("modules.qt_compat.exec_dialog", return_value=None)
def test_frage_temporär_verwenden_unbekannt(self, mock_exec):
self.assertFalse(self.manager.frage_temporär_verwenden())
# -----------------------------------------------------
# 6. Temporäre Datei erzeugen → Nutzer sagt JA
# -----------------------------------------------------
@patch("sn_basis.functions.qgisqt_wrapper.ask_yes_no", return_value=True)
def test_temporaer_erlaubt_ja(self, mock_ask):
ergebnis = pruef_ergebnis(False, "Temporär?", "temporaer_erlaubt", None)
entscheidung = self.manager.verarbeite(ergebnis)
self.assertTrue(entscheidung.ok)
self.assertEqual(entscheidung.aktion, "temporaer_erzeugen")
# -----------------------------------------------------
# 7. Temporäre Datei erzeugen → Nutzer sagt NEIN
# -----------------------------------------------------
@patch("sn_basis.functions.qgisqt_wrapper.ask_yes_no", return_value=False)
def test_temporaer_erlaubt_nein(self, mock_ask):
ergebnis = pruef_ergebnis(False, "Temporär?", "temporaer_erlaubt", None)
entscheidung = self.manager.verarbeite(ergebnis)
self.assertFalse(entscheidung.ok)
self.assertEqual(entscheidung.aktion, "temporaer_erlaubt")
# -----------------------------------------------------
# 8. Layer unsichtbar → Nutzer sagt JA
# -----------------------------------------------------
@patch("sn_basis.functions.qgisqt_wrapper.ask_yes_no", return_value=True)
@patch("sn_basis.functions.qgisqt_wrapper.set_layer_visible")
def test_layer_unsichtbar_ja(self, mock_set, mock_ask):
fake_layer = object()
ergebnis = pruef_ergebnis(False, "Layer unsichtbar", "layer_unsichtbar", fake_layer)
entscheidung = self.manager.verarbeite(ergebnis)
mock_set.assert_called_once_with(fake_layer, True)
self.assertTrue(entscheidung.ok)
self.assertEqual(entscheidung.aktion, "ok")
# -----------------------------------------------------
# 9. Layer unsichtbar → Nutzer sagt NEIN
# -----------------------------------------------------
@patch("sn_basis.functions.qgisqt_wrapper.ask_yes_no", return_value=False)
def test_layer_unsichtbar_nein(self, mock_ask):
fake_layer = object()
ergebnis = pruef_ergebnis(False, "Layer unsichtbar", "layer_unsichtbar", fake_layer)
entscheidung = self.manager.verarbeite(ergebnis)
self.assertFalse(entscheidung.ok)
self.assertEqual(entscheidung.aktion, "layer_unsichtbar")
# -----------------------------------------------------
# 10. Fehlerhafte Aktion → Fallback
# -----------------------------------------------------
@patch("sn_basis.functions.qgisqt_wrapper.warning")
def test_unbekannte_aktion(self, mock_warn):
ergebnis = pruef_ergebnis(False, "???", "unbekannt", None)
entscheidung = self.manager.verarbeite(ergebnis)
mock_warn.assert_called_once()
self.assertFalse(entscheidung.ok)
self.assertEqual(entscheidung.aktion, "unbekannt")
if __name__ == "__main__":