Files
Plugin_SN_Basis/test/test_linkpruefer.py

126 lines
4.1 KiB
Python

# test/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 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
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)
checker = Linkpruefer("https://example.com/service", "REST")
result = checker.ausfuehren()
self.assertTrue(result.erfolgreich)
self.assertEqual(result.daten['typ'], 'REST')
self.assertEqual(result.daten['quelle'], 'remote')
self.assertEqual(result.fehler, [])
self.assertEqual(result.warnungen, [])
@patch('linkpruefer.QgsNetworkAccessManager.head')
def test_remote_link_failure(self, mock_head):
mock_head.return_value = DummyReply(1, 404)
checker = Linkpruefer("https://example.com/kaputt", "WMS")
result = checker.ausfuehren()
self.assertFalse(result.erfolgreich)
self.assertIn("Verbindungsfehler: Simulierter Fehler", result.fehler)
# ----------------------------
# 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")
# ----------------------------
# 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()