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,77 +1,107 @@
#test_linkpruefer.py
# sn_basis/test/test_linkpruefer.py
import unittest
from unittest.mock import MagicMock, patch
from unittest.mock import patch
# QGIS-Module mocken, damit der Import funktioniert
with patch.dict("sys.modules", {
"qgis": MagicMock(),
"qgis.PyQt": MagicMock(),
"qgis.PyQt.QtCore": MagicMock(),
"qgis.PyQt.QtNetwork": MagicMock(),
"qgis.core": MagicMock(),
}):
from modules.linkpruefer import Linkpruefer
from sn_basis.modules.linkpruefer import Linkpruefer
from sn_basis.modules.pruef_ergebnis import pruef_ergebnis
# ---------------------------------------------------------
# Mock-Ergebnisse für network_head()
# ---------------------------------------------------------
class MockResponseOK:
ok = True
status = 200
error = None
class MockResponseNotFound:
ok = False
status = 404
error = "Not Found"
class MockResponseConnectionError:
ok = False
status = None
error = "Connection refused"
# ---------------------------------------------------------
# Testklasse
# ---------------------------------------------------------
class TestLinkpruefer(unittest.TestCase):
@patch("modules.linkpruefer.QNetworkReply")
@patch("modules.linkpruefer.QNetworkRequest")
@patch("modules.linkpruefer.QUrl")
@patch("modules.linkpruefer.QEventLoop")
@patch("modules.linkpruefer.QgsNetworkAccessManager")
def test_remote_link_ok(
self, mock_manager, mock_loop, mock_url, mock_request, mock_reply
):
# Setup: simulate successful HEAD request
reply_instance = MagicMock()
reply_instance.error.return_value = mock_reply.NetworkError.NoError
reply_instance.attribute.return_value = 200
mock_manager.return_value.head.return_value = reply_instance
# -----------------------------------------------------
# 1. Remote-Link erreichbar
# -----------------------------------------------------
@patch("sn_basis.functions.qgisqt_wrapper.network_head")
def test_remote_link_ok(self, mock_head):
mock_head.return_value = MockResponseOK()
lp = Linkpruefer("http://example.com", "REST")
result = lp.pruefe_link()
result = lp.pruefe()
self.assertTrue(result.erfolgreich)
self.assertEqual(result.daten["quelle"], "remote")
self.assertTrue(result.ok)
self.assertEqual(result.aktion, "ok")
@patch("modules.linkpruefer.QNetworkReply")
@patch("modules.linkpruefer.QNetworkRequest")
@patch("modules.linkpruefer.QUrl")
@patch("modules.linkpruefer.QEventLoop")
@patch("modules.linkpruefer.QgsNetworkAccessManager")
def test_remote_link_error(
self, mock_manager, mock_loop, mock_url, mock_request, mock_reply
):
# Fake-Reply erzeugen
reply_instance = MagicMock()
reply_instance.error.return_value = mock_reply.NetworkError.ConnectionRefusedError
reply_instance.errorString.return_value = "Connection refused"
# WICHTIG: finished-Signal simulieren
reply_instance.finished = MagicMock()
reply_instance.finished.connect = MagicMock()
# Wenn loop.exec() aufgerufen wird, rufen wir loop.quit() sofort auf
mock_loop.return_value.exec.side_effect = lambda: mock_loop.return_value.quit()
# Manager gibt unser Fake-Reply zurück
mock_manager.return_value.head.return_value = reply_instance
# -----------------------------------------------------
# 2. Remote-Link nicht erreichbar
# -----------------------------------------------------
@patch("sn_basis.functions.qgisqt_wrapper.network_head")
def test_remote_link_error(self, mock_head):
mock_head.return_value = MockResponseConnectionError()
lp = Linkpruefer("http://example.com", "REST")
result = lp.pruefe_link()
result = lp.pruefe()
self.assertFalse(result.erfolgreich)
self.assertIn("Verbindungsfehler", result.fehler[0])
self.assertFalse(result.ok)
self.assertEqual(result.aktion, "url_nicht_erreichbar")
self.assertIn("Connection refused", result.meldung)
# -----------------------------------------------------
# 3. Remote-Link 404
# -----------------------------------------------------
@patch("sn_basis.functions.qgisqt_wrapper.network_head")
def test_remote_link_404(self, mock_head):
mock_head.return_value = MockResponseNotFound()
lp = Linkpruefer("http://example.com/missing", "REST")
result = lp.pruefe()
self.assertFalse(result.ok)
self.assertEqual(result.aktion, "url_nicht_erreichbar")
self.assertIn("404", result.meldung)
# -----------------------------------------------------
# 4. Lokaler Pfad existiert nicht
# -----------------------------------------------------
@patch("sn_basis.functions.syswrapper.file_exists")
def test_local_link_not_found(self, mock_exists):
mock_exists.return_value = False
lp = Linkpruefer("/path/to/missing/file.shp", "OGR")
result = lp.pruefe()
self.assertFalse(result.ok)
self.assertEqual(result.aktion, "pfad_nicht_gefunden")
# -----------------------------------------------------
# 5. Lokaler Pfad existiert, aber ungewöhnlich
# -----------------------------------------------------
@patch("sn_basis.functions.syswrapper.file_exists")
def test_local_link_warning(self, mock_exists):
mock_exists.return_value = True
def test_local_link_warning(self):
lp = Linkpruefer("/path/to/file_without_extension", "OGR")
result = lp.pruefe_link()
result = lp.pruefe()
self.assertTrue(result.erfolgreich)
self.assertIn("ungewöhnlich", result.warnungen[0])
self.assertTrue(result.ok)
self.assertEqual(result.aktion, "ok")
self.assertIn("ungewöhnlich", result.meldung)
if __name__ == "__main__":