forked from AG_QGIS/Plugin_SN_Basis
101 lines
3.0 KiB
Python
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()
|