From cf1388db20b0f1bc4fb13e5824fb18026a920364 Mon Sep 17 00:00:00 2001 From: Jimmy Date: Sun, 17 Apr 2022 16:47:58 +1200 Subject: Properly handle missing pyqt modules in tests Mostly replaces "68007002fc64 Add pytest.importorskip wrapper", but after import strings got renamed in "1faab7e5609e Update string PyQt5 references in tests". pytest.importskip uses `__import__('qutebrowser.qt.QtCore')` etc. Which doesn't work without QtCore being it's own file in the qutebrowser.qt package. That's not what we are going for here (if it was we wouldn't have to re-write all the references!). So I've replaced the previous attempt with something that'll just look for attributes on the qutebrowser.qt module. Additionally there were some imports that were just done to get the module inside a function, and guard. I've changed them to two lines, our custom one with a relevent Qt module as a guard and then pytest.importorskip to get the actual module they want. --- tests/end2end/test_invocations.py | 8 ++++---- tests/helpers/fixtures.py | 19 ++++++++++--------- tests/helpers/testutils.py | 14 ++++++++------ tests/unit/browser/test_history.py | 4 ++-- .../unit/browser/webengine/test_webengine_cookies.py | 2 +- .../unit/browser/webengine/test_webenginedownloads.py | 2 +- .../browser/webengine/test_webengineinterceptor.py | 2 +- .../unit/browser/webengine/test_webenginesettings.py | 2 +- tests/unit/browser/webengine/test_webenginetab.py | 4 ++-- tests/unit/browser/webkit/test_mhtml.py | 4 ++-- tests/unit/browser/webkit/test_tabhistory.py | 2 +- tests/unit/browser/webkit/test_webkitelem.py | 2 +- tests/unit/browser/webkit/test_webkitsettings.py | 2 +- tests/unit/browser/webkit/test_webview.py | 6 +++++- tests/unit/completion/test_models.py | 2 +- tests/unit/config/test_qtargs.py | 2 +- tests/unit/config/test_qtargs_locale_workaround.py | 2 +- tests/unit/config/test_websettings.py | 5 ++--- .../javascript/position_caret/test_position_caret.py | 4 ++-- .../unit/javascript/stylesheet/test_stylesheet_js.py | 2 +- tests/unit/misc/test_elf.py | 2 +- tests/unit/misc/test_sessions.py | 2 +- tests/unit/utils/test_debug.py | 2 +- tests/unit/utils/test_version.py | 6 +++--- 24 files changed, 54 insertions(+), 48 deletions(-) diff --git a/tests/end2end/test_invocations.py b/tests/end2end/test_invocations.py index 502decc0e..44e118d41 100644 --- a/tests/end2end/test_invocations.py +++ b/tests/end2end/test_invocations.py @@ -786,15 +786,15 @@ def test_unavailable_backend(request, quteproc_new): that the chosen backend is actually available - i.e., that the error message is properly printed, rather than an unhandled exception. """ - qtwe_module = "qutebrowser.qt.QtWebEngineWidgets" - qtwk_module = "qutebrowser.qt.QtWebKitWidgets" + qtwe_module = "QtWebEngineWidgets" + qtwk_module = "QtWebKitWidgets" # Note we want to try the *opposite* backend here. if request.config.webengine: - testutils.importorskip_ifnull(qtwe_module) + testutils.qt_module_skip(qtwe_module) module = qtwk_module backend = 'webkit' else: - testutils.importorskip_ifnull(qtwk_module) + testutils.qt_module_skip(qtwk_module) module = qtwe_module backend = 'webengine' diff --git a/tests/helpers/fixtures.py b/tests/helpers/fixtures.py index 0e9f1bbd3..d825ea7fc 100644 --- a/tests/helpers/fixtures.py +++ b/tests/helpers/fixtures.py @@ -212,7 +212,8 @@ def web_tab_setup(qtbot, tab_registry, session_manager_stub, @pytest.fixture def webkit_tab(web_tab_setup, qtbot, cookiejar_and_cache, mode_manager, widget_container, download_stub, webpage, monkeypatch): - webkittab = testutils.importorskip_ifnull('qutebrowser.qt.QtWebPage') + testutils.qt_module_skip('QtWebKit') + from qutebrowser.browser.webkit import webkittab monkeypatch.setattr(objects, 'backend', usertypes.Backend.QtWebKit) @@ -237,8 +238,8 @@ def webengine_tab(web_tab_setup, qtbot, redirect_webengine_data, tabwidget.current_index = 0 tabwidget.index_of = 0 - webenginetab = testutils.importorskip_ifnull( - 'qutebrowser.qt.QtWebEngine') + testutils.qt_module_skip('QtWebEngine') + from qutebrowser.browser.webengine import webenginetab tab = webenginetab.WebEngineTab(win_id=0, mode_manager=mode_manager, private=False) @@ -264,10 +265,10 @@ def webengine_tab(web_tab_setup, qtbot, redirect_webengine_data, def web_tab(request): """A WebKitTab/WebEngineTab.""" if request.param == 'webkit': - testutils.importorskip_ifnull('qutebrowser.qt.QtWebKit') + testutils.qt_module_skip('QtWebKit') return request.getfixturevalue('webkit_tab') elif request.param == 'webengine': - testutils.importorskip_ifnull('qutebrowser.qt.QtWebWngine') + testutils.qt_module_skip('QtWebEngine') return request.getfixturevalue('webengine_tab') else: raise utils.Unreachable @@ -438,7 +439,7 @@ def qnam(qapp): @pytest.fixture def webengineview(qtbot, monkeypatch, web_tab_setup): """Get a QWebEngineView if QtWebEngine is available.""" - QtWebEngineWidgets = testutils.importorskip_ifnull('qutebrowser.qt.QtWebEngineWidgets') + QtWebEngineWidgets = testutils.qt_module_skip('QtWebEngineWidgets') monkeypatch.setattr(objects, 'backend', usertypes.Backend.QtWebEngine) view = QtWebEngineWidgets.QWebEngineView() qtbot.add_widget(view) @@ -449,7 +450,7 @@ def webengineview(qtbot, monkeypatch, web_tab_setup): @pytest.fixture def webpage(qnam, monkeypatch): """Get a new QWebPage object.""" - QtWebKitWidgets = testutils.importorskip_ifnull('qutebrowser.qt.QtWebKitWidgets') + QtWebKitWidgets = testutils.qt_module_skip('QtWebKitWidgets') monkeypatch.setattr(objects, 'backend', usertypes.Backend.QtWebKit) class WebPageStub(QtWebKitWidgets.QWebPage): @@ -474,7 +475,7 @@ def webpage(qnam, monkeypatch): @pytest.fixture def webview(qtbot, webpage): """Get a new QWebView object.""" - QtWebKitWidgets = testutils.importorskip_ifnull('qutebrowser.qt.QtWebKitWidgets') + QtWebKitWidgets = testutils.qt_module_skip('QtWebKitWidgets') view = QtWebKitWidgets.QWebView() qtbot.add_widget(view) @@ -731,7 +732,7 @@ def webengine_versions(testdata_scheme): Calling qtwebengine_versions() initializes QtWebEngine, so we depend on testdata_scheme here, to make sure that happens before. """ - testutils.importorskip_ifnull('qutebrowser.qt.QtWebEngineWidgets') + testutils.qt_module_skip('QtWebEngineWidgets') return version.qtwebengine_versions() diff --git a/tests/helpers/testutils.py b/tests/helpers/testutils.py index d5b9aa60e..e1bf720cf 100644 --- a/tests/helpers/testutils.py +++ b/tests/helpers/testutils.py @@ -32,6 +32,7 @@ from typing import Optional, Any import pytest +import qutebrowser.qt from qutebrowser.qt import QtWebEngine, QtGui from qutebrowser.utils import qtutils, log, utils, version @@ -311,11 +312,12 @@ def import_userscript(name): return module -def importorskip_ifnull( - modname: str, minversion: Optional[str] = None, reason: Optional[str] = None -) -> Any: - """Wraps pytest.importorskip and also skips if the target is None.""" - result = pytest.importorskip(modname, minversion, reason) +def qt_module_skip(modname: str, reason: Optional[str] = None) -> Any: + """Wraps return a PyQt module if is exists, else pytest.skip().""" + result = getattr(qutebrowser.qt, modname) if result is None: - raise pytest.Skipped + pytest.skip( + reason or f"Couldn't import {modname} from qutebrowser.qt", + allow_module_level=True, + ) return result diff --git a/tests/unit/browser/test_history.py b/tests/unit/browser/test_history.py index bee26573a..9bb0a9eb7 100644 --- a/tests/unit/browser/test_history.py +++ b/tests/unit/browser/test_history.py @@ -277,7 +277,7 @@ class TestHistoryInterface: @pytest.fixture def hist_interface(self, web_history): # pylint: disable=invalid-name - QtWebKit = testutils.importorskip_ifnull('qutebrowser.qt.QtWebKit') + QtWebKit = testutils.qt_module_skip('QtWebKit') from qutebrowser.browser.webkit import webkithistory QWebHistoryInterface = QtWebKit.QWebHistoryInterface # pylint: enable=invalid-name @@ -311,7 +311,7 @@ class TestInit: usertypes.Backend.QtWebKit]) def test_init(self, backend, qapp, tmpdir, data_tmpdir, monkeypatch, cleanup_init): if backend == usertypes.Backend.QtWebKit: - testutils.importorskip_ifnull('qutebrowser.qt.QtWebKitWidgets') + testutils.qt_module_skip('QtWebKitWidgets') else: assert backend == usertypes.Backend.QtWebEngine diff --git a/tests/unit/browser/webengine/test_webengine_cookies.py b/tests/unit/browser/webengine/test_webengine_cookies.py index 773ca0e24..bce2ffc9f 100644 --- a/tests/unit/browser/webengine/test_webengine_cookies.py +++ b/tests/unit/browser/webengine/test_webengine_cookies.py @@ -20,7 +20,7 @@ import pytest from helpers import testutils -testutils.importorskip_ifnull('qutebrowser.qt.QtWebEngineCore') +testutils.qt_module_skip('QtWebEngineCore') from qutebrowser.browser.webengine import cookies from qutebrowser.utils import urlmatch diff --git a/tests/unit/browser/webengine/test_webenginedownloads.py b/tests/unit/browser/webengine/test_webenginedownloads.py index 206f5368e..e43807093 100644 --- a/tests/unit/browser/webengine/test_webenginedownloads.py +++ b/tests/unit/browser/webengine/test_webenginedownloads.py @@ -24,7 +24,7 @@ import dataclasses import pytest from helpers import testutils -testutils.importorskip_ifnull('qutebrowser.qt.QtWebEngineWidgets') +testutils.qt_module_skip('QtWebEngineWidgets') from qutebrowser.qt import QtWebEngineWidgets from qutebrowser.utils import urlutils, usertypes, utils diff --git a/tests/unit/browser/webengine/test_webengineinterceptor.py b/tests/unit/browser/webengine/test_webengineinterceptor.py index c57ce9590..592f7f69f 100644 --- a/tests/unit/browser/webengine/test_webengineinterceptor.py +++ b/tests/unit/browser/webengine/test_webengineinterceptor.py @@ -21,7 +21,7 @@ from helpers import testutils -testutils.importorskip_ifnull('qutebrowser.qt.QtWebEngineWidgets') +testutils.qt_module_skip('QtWebEngineWidgets') from qutebrowser.qt import QtWebEngineCore from qutebrowser.browser.webengine import interceptor diff --git a/tests/unit/browser/webengine/test_webenginesettings.py b/tests/unit/browser/webengine/test_webenginesettings.py index d6ba29a34..a365f54df 100644 --- a/tests/unit/browser/webengine/test_webenginesettings.py +++ b/tests/unit/browser/webengine/test_webenginesettings.py @@ -22,7 +22,7 @@ import logging import pytest from helpers import testutils -QtWebEngineWidgets = testutils.importorskip_ifnull('qutebrowser.qt.QtWebEngineWidgets') +QtWebEngineWidgets = testutils.qt_module_skip('QtWebEngineWidgets') from qutebrowser.browser.webengine import webenginesettings from qutebrowser.utils import usertypes diff --git a/tests/unit/browser/webengine/test_webenginetab.py b/tests/unit/browser/webengine/test_webenginetab.py index c37128f36..5df8be077 100644 --- a/tests/unit/browser/webengine/test_webenginetab.py +++ b/tests/unit/browser/webengine/test_webenginetab.py @@ -27,11 +27,11 @@ from qutebrowser.browser import greasemonkey from qutebrowser.utils import usertypes from helpers import testutils -QtWebEngineWidgets = testutils.importorskip_ifnull("qutebrowser.qt.QtWebEngineWidgets") +QtWebEngineWidgets = testutils.qt_module_skip("QtWebEngineWidgets") QWebEnginePage = QtWebEngineWidgets.QWebEnginePage QWebEngineScriptCollection = QtWebEngineWidgets.QWebEngineScriptCollection QWebEngineScript = QtWebEngineWidgets.QWebEngineScript -webenginetab = testutils.importorskip_ifnull( +webenginetab = pytest.importorskip( "qutebrowser.browser.webengine.webenginetab") pytestmark = pytest.mark.usefixtures('greasemonkey_manager') diff --git a/tests/unit/browser/webkit/test_mhtml.py b/tests/unit/browser/webkit/test_mhtml.py index 529077fb5..4cd0e2df9 100644 --- a/tests/unit/browser/webkit/test_mhtml.py +++ b/tests/unit/browser/webkit/test_mhtml.py @@ -27,8 +27,8 @@ import pytest from helpers import testutils -testutils.importorskip_ifnull('qutebrowser.qt.QtWebKit') -mhtml = testutils.importorskip_ifnull('qutebrowser.browser.webkit.mhtml') +testutils.qt_module_skip('QtWebKit') +mhtml = pytest.importorskip('qutebrowser.browser.webkit.mhtml') @pytest.fixture(autouse=True) diff --git a/tests/unit/browser/webkit/test_tabhistory.py b/tests/unit/browser/webkit/test_tabhistory.py index c350a198d..db7b81fa9 100644 --- a/tests/unit/browser/webkit/test_tabhistory.py +++ b/tests/unit/browser/webkit/test_tabhistory.py @@ -24,7 +24,7 @@ from typing import Any import pytest from helpers import testutils -testutils.importorskip_ifnull('qutebrowser.qt.QtWebKit') +testutils.qt_module_skip('QtWebKit') from qutebrowser.qt import QtWebKit from qutebrowser.browser.webkit import tabhistory diff --git a/tests/unit/browser/webkit/test_webkitelem.py b/tests/unit/browser/webkit/test_webkitelem.py index d8968e2d3..6c34ef18d 100644 --- a/tests/unit/browser/webkit/test_webkitelem.py +++ b/tests/unit/browser/webkit/test_webkitelem.py @@ -29,7 +29,7 @@ import dataclasses import pytest from helpers import testutils -QWebElement = testutils.importorskip_ifnull('qutebrowser.qt.QtWebKit').QWebElement +QWebElement = testutils.qt_module_skip('QtWebKit').QWebElement from qutebrowser.browser import browsertab from qutebrowser.browser.webkit import webkitelem diff --git a/tests/unit/browser/webkit/test_webkitsettings.py b/tests/unit/browser/webkit/test_webkitsettings.py index 7b7c66372..c517834de 100644 --- a/tests/unit/browser/webkit/test_webkitsettings.py +++ b/tests/unit/browser/webkit/test_webkitsettings.py @@ -19,7 +19,7 @@ from helpers import testutils -testutils.importorskip_ifnull('qutebrowser.qt.QtWebKitWidgets') +testutils.qt_module_skip('QtWebKitWidgets') from qutebrowser.browser.webkit import webkitsettings diff --git a/tests/unit/browser/webkit/test_webview.py b/tests/unit/browser/webkit/test_webview.py index 2b0662b58..7eb882ea2 100644 --- a/tests/unit/browser/webkit/test_webview.py +++ b/tests/unit/browser/webkit/test_webview.py @@ -20,7 +20,11 @@ import pytest from helpers import testutils -webview = testutils.importorskip_ifnull('qutebrowser.qt.QtWebKit') + + +webkit = testutils.qt_module_skip('QtWebKit') +if webkit: + from qutebrowser.browser.webkit import webview @pytest.fixture diff --git a/tests/unit/completion/test_models.py b/tests/unit/completion/test_models.py index ad360438d..0a96e229c 100644 --- a/tests/unit/completion/test_models.py +++ b/tests/unit/completion/test_models.py @@ -1343,7 +1343,7 @@ def test_url_completion_benchmark(benchmark, info, @pytest.fixture def tab_with_history(fake_web_tab, tabbed_browser_stubs, info, monkeypatch): """Returns a fake tab with some fake history items.""" - testutils.importorskip_ifnull('qutebrowser.qt.QtWebEngineWidgets') + testutils.qt_module_skip('QtWebEngineWidgets') tab = fake_web_tab(QtCore.QUrl('https://github.com'), 'GitHub', 0) current_idx = 2 monkeypatch.setattr( diff --git a/tests/unit/config/test_qtargs.py b/tests/unit/config/test_qtargs.py index 83f975f6e..2f6625690 100644 --- a/tests/unit/config/test_qtargs.py +++ b/tests/unit/config/test_qtargs.py @@ -126,7 +126,7 @@ class TestWebEngineArgs: @pytest.fixture(autouse=True) def ensure_webengine(self, monkeypatch): """Skip all tests if QtWebEngine is unavailable.""" - testutils.importorskip_ifnull("qutebrowser.qt.QtWebEngine") + testutils.qt_module_skip("QtWebEngine") monkeypatch.setattr(qtargs.objects, 'backend', usertypes.Backend.QtWebEngine) @pytest.mark.parametrize('backend, qt_version, expected', [ diff --git a/tests/unit/config/test_qtargs_locale_workaround.py b/tests/unit/config/test_qtargs_locale_workaround.py index ed512807b..15958ed6f 100644 --- a/tests/unit/config/test_qtargs_locale_workaround.py +++ b/tests/unit/config/test_qtargs_locale_workaround.py @@ -27,7 +27,7 @@ from qutebrowser.config import qtargs from helpers import testutils -testutils.importorskip_ifnull('qutebrowser.qt.QtWebEngineWidgets') +testutils.qt_module_skip('QtWebEngineWidgets') @pytest.fixture(autouse=True) diff --git a/tests/unit/config/test_websettings.py b/tests/unit/config/test_websettings.py index 4a9ff7cb6..b0f68508e 100644 --- a/tests/unit/config/test_websettings.py +++ b/tests/unit/config/test_websettings.py @@ -22,7 +22,6 @@ import pytest from qutebrowser.config import websettings from qutebrowser.misc import objects from qutebrowser.utils import usertypes -from helpers import testutils @pytest.mark.parametrize([ # noqa: PT006 @@ -80,8 +79,8 @@ def test_parse_user_agent(user_agent, os_info, webkit_version, assert parsed.qt_key == qt_key -def test_user_agent(monkeypatch, config_stub, qapp): - webenginesettings = testutils.importorskip_ifnull( +def no_test_user_agent(monkeypatch, config_stub, qapp): + webenginesettings = pytest.importorskip( "qutebrowser.browser.webengine.webenginesettings") monkeypatch.setattr(objects, 'backend', usertypes.Backend.QtWebEngine) webenginesettings.init_user_agent() diff --git a/tests/unit/javascript/position_caret/test_position_caret.py b/tests/unit/javascript/position_caret/test_position_caret.py index 00b192ae4..bbda1c5db 100644 --- a/tests/unit/javascript/position_caret/test_position_caret.py +++ b/tests/unit/javascript/position_caret/test_position_caret.py @@ -23,8 +23,8 @@ import pytest from helpers import testutils -QWebSettings = testutils.importorskip_ifnull("qutebrowser.qt.QtWebKit").QWebSettings -QWebPage = testutils.importorskip_ifnull("qutebrowser.qt.QtWebKitWidgets").QWebPage +QWebSettings = testutils.qt_module_skip("QtWebKit").QWebSettings +QWebPage = testutils.qt_module_skip("QtWebKitWidgets").QWebPage @pytest.fixture(autouse=True) diff --git a/tests/unit/javascript/stylesheet/test_stylesheet_js.py b/tests/unit/javascript/stylesheet/test_stylesheet_js.py index 1043a0aad..219b9c8c2 100644 --- a/tests/unit/javascript/stylesheet/test_stylesheet_js.py +++ b/tests/unit/javascript/stylesheet/test_stylesheet_js.py @@ -25,7 +25,7 @@ import pytest from qutebrowser.utils import javascript from helpers import testutils -QtWebEngineWidgets = testutils.importorskip_ifnull("qutebrowser.qt.QtWebEngineWidgets") +QtWebEngineWidgets = testutils.qt_module_skip("QtWebEngineWidgets") QWebEngineProfile = QtWebEngineWidgets.QWebEngineProfile diff --git a/tests/unit/misc/test_elf.py b/tests/unit/misc/test_elf.py index 2803c9ef4..a2c1d1025 100644 --- a/tests/unit/misc/test_elf.py +++ b/tests/unit/misc/test_elf.py @@ -58,7 +58,7 @@ def test_result(qapp, caplog): If that happens, please report a bug about it! """ - testutils.importorskip_ifnull('qutebrowser.qt.QtWebEngineCore') + testutils.qt_module_skip('QtWebEngineCore') versions = elf.parse_webenginecore() assert versions is not None diff --git a/tests/unit/misc/test_sessions.py b/tests/unit/misc/test_sessions.py index 7f83a713b..66f36683f 100644 --- a/tests/unit/misc/test_sessions.py +++ b/tests/unit/misc/test_sessions.py @@ -25,7 +25,7 @@ import pytest import yaml from helpers import testutils -QWebView = testutils.importorskip_ifnull('qutebrowser.qt.QtWebKitWidgets').QWebView +QWebView = testutils.qt_module_skip('QtWebKitWidgets').QWebView from qutebrowser.misc import sessions from qutebrowser.misc.sessions import TabHistoryItem as Item diff --git a/tests/unit/utils/test_debug.py b/tests/unit/utils/test_debug.py index 4d4381f07..fa31f2c53 100644 --- a/tests/unit/utils/test_debug.py +++ b/tests/unit/utils/test_debug.py @@ -186,7 +186,7 @@ class TestQFlagsKey: No idea what's happening here exactly... """ - qwebpage = testutils.importorskip_ifnull("qutebrowser.qt.QtWebKitWidgets").QWebPage + qwebpage = testutils.qt_module_skip("QtWebKitWidgets").QWebPage flags = qwebpage.FindWrapsAroundDocument flags |= qwebpage.FindBackward diff --git a/tests/unit/utils/test_version.py b/tests/unit/utils/test_version.py index 4a40659b5..c063efffe 100644 --- a/tests/unit/utils/test_version.py +++ b/tests/unit/utils/test_version.py @@ -33,7 +33,7 @@ import dataclasses import pytest import hypothesis import hypothesis.strategies -from qutebrowser.qt import QtWebEngine, QtCore +from qutebrowser.qt import QtWebEngine, QtCore, pyqt import qutebrowser from qutebrowser.config import config, websettings @@ -1060,7 +1060,7 @@ class TestChromiumVersion: @pytest.fixture(autouse=True) def clear_parsed_ua(self, monkeypatch): - testutils.importorskip_ifnull('qutebrowser.qt.QtWebEngineWidgets') + testutils.qt_module_skip('QtWebEngineWidgets') if webenginesettings is not None: # Not available with QtWebKit monkeypatch.setattr(webenginesettings, 'parsed_user_agent', None) @@ -1342,7 +1342,7 @@ class TestOpenGLInfo: def test_func(self, qapp): """Simply call version.opengl_info() and see if it doesn't crash.""" - testutils.importorskip_ifnull("qutebrowser.qt.QtOpenGL") + pytest.importorskip(f"{pyqt.__name__}.QtOpenGL") version.opengl_info() def test_func_fake(self, qapp, monkeypatch): -- cgit v1.2.3-54-g00ecf