Tests überarbeitet, Mocks und coverage eingefügt

This commit is contained in:
2025-12-17 17:45:18 +01:00
parent 2d67ce8adc
commit f64d56d4bc
17 changed files with 562 additions and 201 deletions

View File

@@ -1,125 +1,78 @@
# test/test_linkpruefer.py
#test_linkpruefer.py
import unittest
import sys
from unittest.mock import patch
from qgis.PyQt.QtCore import QCoreApplication, QTimer
from qgis.PyQt.QtNetwork import QNetworkRequest
from unittest.mock import MagicMock, patch
from linkpruefer import Linkpruefer
# Stelle sicher, dass eine Qt-App existiert
app = QCoreApplication.instance()
if app is None:
app = QCoreApplication(sys.argv)
class DummyReply:
"""Fake-Reply, um Netzwerkabfragen zu simulieren"""
HttpStatusCodeAttribute = QNetworkRequest.HttpStatusCodeAttribute
def __init__(self, error, status_code):
self._error = error
self._status_code = status_code
self.finished = self # Fake-Signal
def connect(self, slot):
# sorgt dafür, dass loop.quit() nach Start von loop.exec_() ausgeführt wird
QTimer.singleShot(0, slot)
def error(self):
return self._error
def errorString(self):
return "Simulierter Fehler" if self._error != 0 else ""
def attribute(self, attr):
if attr == self.HttpStatusCodeAttribute:
return self._status_code
return None
def deleteLater(self):
# kein echtes QObject → wir tun einfach nichts
pass
# 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
class TestLinkpruefer(unittest.TestCase):
"""Tests für alle Funktionen des Linkpruefer"""
# ----------------------------
# Remote-Tests mit DummyReply
# ----------------------------
@patch('linkpruefer.QgsNetworkAccessManager.head')
def test_remote_link_success(self, mock_head):
mock_head.return_value = DummyReply(0, 200)
@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
checker = Linkpruefer("https://example.com/service", "REST")
result = checker.ausfuehren()
mock_manager.return_value.head.return_value = reply_instance
lp = Linkpruefer("http://example.com", "REST")
result = lp.pruefe_link()
self.assertTrue(result.erfolgreich)
self.assertEqual(result.daten['typ'], 'REST')
self.assertEqual(result.daten['quelle'], 'remote')
self.assertEqual(result.fehler, [])
self.assertEqual(result.warnungen, [])
self.assertEqual(result.daten["quelle"], "remote")
@patch('linkpruefer.QgsNetworkAccessManager.head')
def test_remote_link_failure(self, mock_head):
mock_head.return_value = DummyReply(1, 404)
@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"
checker = Linkpruefer("https://example.com/kaputt", "WMS")
result = checker.ausfuehren()
# 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
lp = Linkpruefer("http://example.com", "REST")
result = lp.pruefe_link()
self.assertFalse(result.erfolgreich)
self.assertIn("Verbindungsfehler: Simulierter Fehler", result.fehler)
self.assertIn("Verbindungsfehler", result.fehler[0])
# ----------------------------
# Klassifizierungstests
# ----------------------------
def test_klassifiziere_anbieter_remote(self):
checker = Linkpruefer("https://beispiel.de", "wms")
daten = checker.klassifiziere_anbieter()
self.assertEqual(daten["typ"], "WMS")
self.assertEqual(daten["quelle"], "remote")
def test_klassifiziere_anbieter_local(self):
checker = Linkpruefer("C:/daten/test.shp", "ogr")
daten = checker.klassifiziere_anbieter()
self.assertEqual(daten["typ"], "OGR")
self.assertEqual(daten["quelle"], "local")
def test_local_link_warning(self):
lp = Linkpruefer("/path/to/file_without_extension", "OGR")
result = lp.pruefe_link()
# ----------------------------
# Lokale Links
# ----------------------------
def test_pruefe_link_local_ok(self):
checker = Linkpruefer("C:/daten/test.shp", "OGR")
result = checker.pruefe_link()
self.assertTrue(result.erfolgreich)
self.assertEqual(result.warnungen, [])
def test_pruefe_link_local_warnung(self):
checker = Linkpruefer("C:/daten/ordner/", "OGR")
result = checker.pruefe_link()
self.assertTrue(result.erfolgreich)
self.assertIn("ungewöhnlich", result.warnungen[0])
# ----------------------------
# Sonderfall: leerer Link
# ----------------------------
def test_pruefe_link_empty(self):
checker = Linkpruefer("", "REST")
result = checker.pruefe_link()
self.assertFalse(result.erfolgreich)
self.assertIn("Link fehlt.", result.fehler)
# ----------------------------
# leerer Anbieter
# ----------------------------
def test_pruefe_link_leerer_anbieter(self):
checker = Linkpruefer("https://example.com/service", "")
result = checker.pruefe_link()
self.assertFalse(result.erfolgreich)
self.assertIn("Anbieter muss gesetzt werden und darf nicht leer sein.", result.fehler)
if __name__ == "__main__":
unittest.main()