Files
Plugin_SN_Basis/test/test_qt_compat.py

101 lines
3.0 KiB
Python

#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()