diff options
Diffstat (limited to 'tests/unit/utils/test_version.py')
-rw-r--r-- | tests/unit/utils/test_version.py | 116 |
1 files changed, 82 insertions, 34 deletions
diff --git a/tests/unit/utils/test_version.py b/tests/unit/utils/test_version.py index f846c91ac..a53b4bdce 100644 --- a/tests/unit/utils/test_version.py +++ b/tests/unit/utils/test_version.py @@ -40,6 +40,11 @@ from qutebrowser.utils import version, usertypes, utils, standarddir from qutebrowser.misc import pastebin, objects, elf from qutebrowser.browser import pdfjs +try: + from qutebrowser.browser.webengine import webenginesettings +except ImportError: + webenginesettings = None + @pytest.mark.parametrize('os_release, expected', [ # No file @@ -314,9 +319,9 @@ def test_distribution(tmpdir, monkeypatch, os_release, expected): id='arch', parsed=version.Distribution.arch, version=None, pretty='Arch Linux'), False) ]) -def test_is_sandboxed(monkeypatch, distribution, expected): +def test_is_flatpak(monkeypatch, distribution, expected): monkeypatch.setattr(version, "distribution", lambda: distribution) - assert version.is_sandboxed() == expected + assert version.is_flatpak() == expected class GitStrSubprocessFake: @@ -357,14 +362,14 @@ class TestGitStr: @pytest.fixture def commit_file_mock(self, mocker): - """Fixture providing a mock for utils.read_file for git-commit-id. + """Fixture providing a mock for resources.read_file for git-commit-id. On fixture teardown, it makes sure it got called with git-commit-id as argument. """ mocker.patch('qutebrowser.utils.version.subprocess', side_effect=AssertionError) - m = mocker.patch('qutebrowser.utils.version.utils.read_file') + m = mocker.patch('qutebrowser.utils.version.resources.read_file') yield m m.assert_called_with('git-commit-id') @@ -413,7 +418,7 @@ class TestGitStr: """Test with things raising OSError.""" m = mocker.patch('qutebrowser.utils.version.os') m.path.join.side_effect = OSError - mocker.patch('qutebrowser.utils.version.utils.read_file', + mocker.patch('qutebrowser.utils.version.resources.read_file', side_effect=OSError) with caplog.at_level(logging.ERROR, 'misc'): assert version._git_str() is None @@ -926,6 +931,25 @@ class TestWebEngineVersions: def test_str(self, version, expected): assert str(version) == expected + @pytest.mark.parametrize('version, expected', [ + ( + version.WebEngineVersions( + webengine=utils.VersionNumber(5, 15, 2), + chromium=None, + source='test'), + None, + ), + ( + version.WebEngineVersions( + webengine=utils.VersionNumber(5, 15, 2), + chromium='87.0.4280.144', + source='test'), + 87, + ), + ]) + def test_chromium_major(self, version, expected): + assert version.chromium_major == expected + def test_from_ua(self): ua = websettings.UserAgent( os_info='X11; Linux x86_64', @@ -956,10 +980,13 @@ class TestWebEngineVersions: ('5.14.2', '77.0.3865.129'), ('5.15.1', '80.0.3987.163'), ('5.15.2', '83.0.4103.122'), + ('5.15.3', '87.0.4280.144'), + ('5.15.4', '87.0.4280.144'), + ('5.15.5', '87.0.4280.144'), ]) def test_from_pyqt(self, qt_version, chromium_version): expected = version.WebEngineVersions( - webengine=utils.parse_version(qt_version), + webengine=utils.VersionNumber.parse(qt_version), chromium=chromium_version, source='PyQt', ) @@ -982,15 +1009,8 @@ class TestWebEngineVersions: versions = version.WebEngineVersions.from_pyqt(pyqt_webengine_version) - if pyqt_webengine_version == '5.15.3': - # Transient situation - we expect to get QtWebEngine 5.15.3 soon, - # so this will line up again. - assert versions.chromium == '87.0.4280.144' - pytest.xfail("Transient situation") - else: - from qutebrowser.browser.webengine import webenginesettings - webenginesettings.init_user_agent() - expected = webenginesettings.parsed_user_agent.upstream_browser_version + webenginesettings.init_user_agent() + expected = webenginesettings.parsed_user_agent.upstream_browser_version assert versions.chromium == expected @@ -1029,26 +1049,24 @@ class TestChromiumVersion: @pytest.fixture(autouse=True) def clear_parsed_ua(self, monkeypatch): pytest.importorskip('PyQt5.QtWebEngineWidgets') - if version.webenginesettings is not None: + if webenginesettings is not None: # Not available with QtWebKit - monkeypatch.setattr(version.webenginesettings, 'parsed_user_agent', None) + monkeypatch.setattr(webenginesettings, 'parsed_user_agent', None) def test_fake_ua(self, monkeypatch, caplog): ver = '77.0.3865.98' - version.webenginesettings._init_user_agent_str( - _QTWE_USER_AGENT.format(ver)) + webenginesettings._init_user_agent_str(_QTWE_USER_AGENT.format(ver)) assert version.qtwebengine_versions().chromium == ver def test_prefers_saved_user_agent(self, monkeypatch): - version.webenginesettings._init_user_agent_str(_QTWE_USER_AGENT) + webenginesettings._init_user_agent_str(_QTWE_USER_AGENT.format('87')) class FakeProfile: def defaultProfile(self): raise AssertionError("Should not be called") - monkeypatch.setattr(version.webenginesettings, 'QWebEngineProfile', - FakeProfile()) + monkeypatch.setattr(webenginesettings, 'QWebEngineProfile', FakeProfile()) version.qtwebengine_versions() @@ -1079,18 +1097,34 @@ class TestChromiumVersion: import_fake.patch() @pytest.fixture - def patch_importlib_no_package(self, monkeypatch): - """Simulate importlib not finding PyQtWebEngine-Qt.""" - try: - import importlib.metadata as importlib_metadata - except ImportError: - importlib_metadata = pytest.importorskip("importlib_metadata") - - def _fake_version(name): - assert name == 'PyQtWebEngine-Qt' - raise importlib_metadata.PackageNotFoundError(name) + def importlib_patcher(self, monkeypatch): + """Patch the importlib module.""" + def _patch(*, qt, qt5): + try: + import importlib.metadata as importlib_metadata + except ImportError: + importlib_metadata = pytest.importorskip("importlib_metadata") + + def _fake_version(name): + if name == 'PyQtWebEngine-Qt': + outcome = qt + elif name == 'PyQtWebEngine-Qt5': + outcome = qt5 + else: + raise utils.Unreachable(outcome) + + if outcome is None: + raise importlib_metadata.PackageNotFoundError(name) + return outcome + + monkeypatch.setattr(importlib_metadata, 'version', _fake_version) + + return _patch - monkeypatch.setattr(importlib_metadata, 'version', _fake_version) + @pytest.fixture + def patch_importlib_no_package(self, importlib_patcher): + """Simulate importlib not finding PyQtWebEngine-Qt[5].""" + importlib_patcher(qt=None, qt5=None) @pytest.mark.parametrize('patches, sources', [ (['elf_fail'], ['importlib', 'PyQt', 'Qt']), @@ -1114,6 +1148,21 @@ class TestChromiumVersion: versions = version.qtwebengine_versions(avoid_init=True) assert versions.source in sources + @pytest.mark.parametrize('qt, qt5, expected', [ + (None, '5.15.4', utils.VersionNumber(5, 15, 4)), + ('5.15.3', None, utils.VersionNumber(5, 15, 3)), + ('5.15.3', '5.15.4', utils.VersionNumber(5, 15, 4)), # -Qt5 takes precedence + ]) + def test_importlib(self, qt, qt5, expected, patch_elf_fail, importlib_patcher): + """Test the importlib version logic with different Qt packages. + + With PyQtWebEngine 5.15.4, PyQtWebEngine-Qt was renamed to PyQtWebEngine-Qt5. + """ + importlib_patcher(qt=qt, qt5=qt5) + versions = version.qtwebengine_versions(avoid_init=True) + assert versions.source == 'importlib' + assert versions.webengine == expected + @dataclasses.dataclass class VersionParams: @@ -1203,7 +1252,6 @@ def test_version_info(params, stubs, monkeypatch, config_stub): if params.with_webkit: patches['qWebKitVersion'] = lambda: 'WEBKIT VERSION' patches['objects.backend'] = usertypes.Backend.QtWebKit - patches['webenginesettings'] = None substitutions['backend'] = 'new QtWebKit (WebKit WEBKIT VERSION)' else: monkeypatch.delattr(version, 'qtutils.qWebKitVersion', raising=False) |