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