forked from AG_QGIS/Plugin_SN_Basis
Tests überarbeitet, Mocks und coverage eingefügt
This commit is contained in:
100
test/test_qt_compat.py
Normal file
100
test/test_qt_compat.py
Normal file
@@ -0,0 +1,100 @@
|
||||
#test_qt_compat.py
|
||||
import unittest
|
||||
import os
|
||||
import sys
|
||||
from unittest.mock import MagicMock
|
||||
import modules.qt_compat as qt_compat
|
||||
# Plugin-Root ermitteln (ein Verzeichnis über "test")
|
||||
ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
|
||||
sys.path.insert(0, ROOT)
|
||||
|
||||
def skip_if_mock(reason):
|
||||
"""Decorator: überspringt Test, wenn qt_compat im Mock-Modus läuft."""
|
||||
return unittest.skipIf(
|
||||
qt_compat.QT_VERSION == 0,
|
||||
f"{reason} — MOCK-Modus erkannt."
|
||||
f"Bitte diesen Test in einer echten QGIS-Umgebung ausführen."
|
||||
)
|
||||
|
||||
|
||||
class TestQtCompat(unittest.TestCase):
|
||||
|
||||
def test_exports_exist(self):
|
||||
"""Prüft, ob alle erwarteten Symbole exportiert werden."""
|
||||
expected = {
|
||||
"QMessageBox",
|
||||
"QFileDialog",
|
||||
"QEventLoop",
|
||||
"QUrl",
|
||||
"QNetworkRequest",
|
||||
"QNetworkReply",
|
||||
"YES",
|
||||
"NO",
|
||||
"CANCEL",
|
||||
"ICON_QUESTION",
|
||||
"exec_dialog",
|
||||
"QT_VERSION",
|
||||
}
|
||||
|
||||
for symbol in expected:
|
||||
self.assertTrue(
|
||||
hasattr(qt_compat, symbol),
|
||||
f"qt_compat sollte '{symbol}' exportieren"
|
||||
)
|
||||
|
||||
@skip_if_mock("QT_VERSION kann im Mock-Modus nicht 5 oder 6 sein")
|
||||
def test_qt_version_flag(self):
|
||||
"""QT_VERSION muss 5 oder 6 sein."""
|
||||
self.assertIn(qt_compat.QT_VERSION, (5, 6))
|
||||
|
||||
@skip_if_mock("Qt-Enums können im Mock-Modus nicht OR-kombiniert werden")
|
||||
def test_enums_are_valid(self):
|
||||
"""Prüft, ob die Enums gültige QMessageBox-Werte sind."""
|
||||
|
||||
msg = qt_compat.QMessageBox()
|
||||
try:
|
||||
msg.setStandardButtons(
|
||||
qt_compat.YES |
|
||||
qt_compat.NO |
|
||||
qt_compat.CANCEL
|
||||
)
|
||||
except Exception as e:
|
||||
self.fail(f"Qt-Enums sollten OR-kombinierbar sein, Fehler: {e}")
|
||||
|
||||
self.assertTrue(True)
|
||||
|
||||
@skip_if_mock("exec_dialog benötigt echtes Qt-Verhalten")
|
||||
def test_exec_dialog_calls_correct_method(self):
|
||||
"""Prüft, ob exec_dialog() die richtige Methode aufruft."""
|
||||
|
||||
mock_msg = MagicMock()
|
||||
|
||||
if qt_compat.QT_VERSION == 6:
|
||||
qt_compat.exec_dialog(mock_msg)
|
||||
mock_msg.exec.assert_called_once()
|
||||
|
||||
elif qt_compat.QT_VERSION == 5:
|
||||
qt_compat.exec_dialog(mock_msg)
|
||||
mock_msg.exec_.assert_called_once()
|
||||
|
||||
else:
|
||||
self.fail("QT_VERSION hat einen unerwarteten Wert.")
|
||||
|
||||
@skip_if_mock("Qt-Klassen können im Mock-Modus nicht real instanziiert werden")
|
||||
def test_qt_classes_importable(self):
|
||||
"""Prüft, ob die wichtigsten Qt-Klassen instanziierbar sind."""
|
||||
|
||||
loop = qt_compat.QEventLoop()
|
||||
self.assertIsNotNone(loop)
|
||||
|
||||
url = qt_compat.QUrl("http://example.com")
|
||||
self.assertTrue(url.isValid())
|
||||
|
||||
req = qt_compat.QNetworkRequest(url)
|
||||
self.assertIsNotNone(req)
|
||||
|
||||
self.assertTrue(hasattr(qt_compat.QNetworkReply, "NetworkError"))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user