summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/unit/browser/webkit/test_tabhistory.py5
-rw-r--r--tests/unit/javascript/test_js_execution.py7
-rw-r--r--tests/unit/keyinput/key_data.py3
-rw-r--r--tests/unit/keyinput/test_basekeyparser.py2
-rw-r--r--tests/unit/keyinput/test_keyutils.py33
-rw-r--r--tests/unit/test_qt_machinery.py263
6 files changed, 194 insertions, 119 deletions
diff --git a/tests/unit/browser/webkit/test_tabhistory.py b/tests/unit/browser/webkit/test_tabhistory.py
index 047454e25..cd40af6e8 100644
--- a/tests/unit/browser/webkit/test_tabhistory.py
+++ b/tests/unit/browser/webkit/test_tabhistory.py
@@ -15,9 +15,6 @@
# You should have received a copy of the GNU General Public License
# along with qutebrowser. If not, see <https://www.gnu.org/licenses/>.
-# FIXME:qt6 (lint)
-# pylint: disable=no-name-in-module
-
"""Tests for webelement.tabhistory."""
import dataclasses
@@ -26,7 +23,9 @@ from typing import Any
import pytest
pytest.importorskip('qutebrowser.qt.webkit')
from qutebrowser.qt.core import QUrl, QPoint
+# pylint: disable=no-name-in-module
from qutebrowser.qt.webkit import QWebHistory
+# pylint: enable=no-name-in-module
from qutebrowser.browser.webkit import tabhistory
from qutebrowser.misc.sessions import TabHistoryItem as Item
diff --git a/tests/unit/javascript/test_js_execution.py b/tests/unit/javascript/test_js_execution.py
index 542b56975..fd2469148 100644
--- a/tests/unit/javascript/test_js_execution.py
+++ b/tests/unit/javascript/test_js_execution.py
@@ -15,9 +15,6 @@
# You should have received a copy of the GNU General Public License
# along with qutebrowser. If not, see <https://www.gnu.org/licenses/>.
-# FIXME:qt6 (lint)
-# pylint: disable=no-name-in-module
-
"""Check how Qt behaves when trying to execute JS."""
@@ -29,7 +26,7 @@ def test_simple_js_webkit(webview, js_enabled, expected):
"""With QtWebKit, evaluateJavaScript works when JS is on."""
# If we get there (because of the webview fixture) we can be certain
# QtWebKit is available
- from qutebrowser.qt.webkit import QWebSettings
+ from qutebrowser.qt.webkit import QWebSettings # pylint: disable=no-name-in-module
webview.settings().setAttribute(QWebSettings.WebAttribute.JavascriptEnabled, js_enabled)
result = webview.page().mainFrame().evaluateJavaScript('1 + 1')
assert result == expected
@@ -40,7 +37,7 @@ def test_element_js_webkit(webview, js_enabled, expected):
"""With QtWebKit, evaluateJavaScript on an element works with JS off."""
# If we get there (because of the webview fixture) we can be certain
# QtWebKit is available
- from qutebrowser.qt.webkit import QWebSettings
+ from qutebrowser.qt.webkit import QWebSettings # pylint: disable=no-name-in-module
webview.settings().setAttribute(QWebSettings.WebAttribute.JavascriptEnabled, js_enabled)
elem = webview.page().mainFrame().documentElement()
result = elem.evaluateJavaScript('1 + 1')
diff --git a/tests/unit/keyinput/key_data.py b/tests/unit/keyinput/key_data.py
index 3826d3ee9..5f151704a 100644
--- a/tests/unit/keyinput/key_data.py
+++ b/tests/unit/keyinput/key_data.py
@@ -24,6 +24,7 @@ import dataclasses
from typing import Optional
from qutebrowser.qt.core import Qt
+from qutebrowser.keyinput import keyutils
@dataclasses.dataclass(order=True)
@@ -606,7 +607,7 @@ KEYS = [
Key('unknown', 'Unknown', qtest=False),
# 0x0 is used by Qt for unknown keys...
- Key(attribute='', name='nil', member=0x0, qtest=False),
+ Key(attribute='', name='nil', member=keyutils._NIL_KEY, qtest=False),
]
diff --git a/tests/unit/keyinput/test_basekeyparser.py b/tests/unit/keyinput/test_basekeyparser.py
index 52e0a01df..0ae0702e9 100644
--- a/tests/unit/keyinput/test_basekeyparser.py
+++ b/tests/unit/keyinput/test_basekeyparser.py
@@ -171,7 +171,7 @@ class TestHandle:
assert not prompt_keyparser._count
def test_invalid_key(self, prompt_keyparser):
- keys = [Qt.Key.Key_B, 0x0]
+ keys = [Qt.Key.Key_B, keyutils._NIL_KEY]
for key in keys:
info = keyutils.KeyInfo(key, Qt.KeyboardModifier.NoModifier)
prompt_keyparser.handle(info.to_event())
diff --git a/tests/unit/keyinput/test_keyutils.py b/tests/unit/keyinput/test_keyutils.py
index 2c0740c20..c3b6dc236 100644
--- a/tests/unit/keyinput/test_keyutils.py
+++ b/tests/unit/keyinput/test_keyutils.py
@@ -31,6 +31,16 @@ from qutebrowser.keyinput import keyutils
from qutebrowser.utils import utils
+pyqt_enum_workaround_skip = pytest.mark.skipif(
+ isinstance(keyutils._NIL_KEY, int),
+ reason="Can't create QKey for unknown keys with this PyQt version"
+)
+try:
+ OE_KEY = Qt.Key(ord('Œ'))
+except ValueError:
+ OE_KEY = None # affected tests skipped
+
+
@pytest.fixture(params=key_data.KEYS, ids=lambda k: k.attribute)
def qt_key(request):
"""Get all existing keys from key_data.py.
@@ -156,10 +166,14 @@ class TestKeyToString:
(Qt.Key.Key_A,
Qt.KeyboardModifier.ControlModifier | Qt.KeyboardModifier.AltModifier | Qt.KeyboardModifier.MetaModifier | Qt.KeyboardModifier.ShiftModifier,
'<Meta+Ctrl+Alt+Shift+a>'),
- (ord('Œ'), Qt.KeyboardModifier.NoModifier, '<Œ>'),
- (ord('Œ'), Qt.KeyboardModifier.ShiftModifier, '<Shift+Œ>'),
- (ord('Œ'), Qt.KeyboardModifier.GroupSwitchModifier, '<AltGr+Œ>'),
- (ord('Œ'), Qt.KeyboardModifier.GroupSwitchModifier | Qt.KeyboardModifier.ShiftModifier, '<AltGr+Shift+Œ>'),
+
+ pytest.param(OE_KEY, Qt.KeyboardModifier.NoModifier, '<Œ>',
+ marks=pyqt_enum_workaround_skip),
+ pytest.param(OE_KEY, Qt.KeyboardModifier.ShiftModifier, '<Shift+Œ>',
+ marks=pyqt_enum_workaround_skip),
+ pytest.param(OE_KEY, Qt.KeyboardModifier.GroupSwitchModifier, '<AltGr+Œ>',
+ marks=pyqt_enum_workaround_skip),
+ pytest.param(OE_KEY, Qt.KeyboardModifier.GroupSwitchModifier | Qt.KeyboardModifier.ShiftModifier, '<AltGr+Shift+Œ>'),
(Qt.Key.Key_Shift, Qt.KeyboardModifier.ShiftModifier, '<Shift>'),
(Qt.Key.Key_Shift, Qt.KeyboardModifier.ShiftModifier | Qt.KeyboardModifier.ControlModifier, '<Ctrl+Shift>'),
@@ -212,10 +226,10 @@ def test_surrogates(key, modifiers, text, expected, pyqt_enum_workaround):
([Qt.Key.Key_Shift, 0x29df6], '<Shift><𩷶>'),
([0x1f468, 0x200d, 0x1f468, 0x200d, 0x1f466], '<👨><‍><👨><‍><👦>'),
])
-def test_surrogate_sequences(keys, expected, pyqt_enum_workaround):
- infos = [keyutils.KeyInfo(key) for key in keys]
- with pyqt_enum_workaround(keyutils.KeyParseError):
- seq = keyutils.KeySequence(*infos)
+@pyqt_enum_workaround_skip
+def test_surrogate_sequences(keys, expected):
+ infos = [keyutils.KeyInfo(Qt.Key(key)) for key in keys]
+ seq = keyutils.KeySequence(*infos)
assert str(seq) == expected
@@ -590,7 +604,8 @@ def test_key_info_to_qt():
(Qt.Key.Key_Return, False),
(Qt.Key.Key_Enter, False),
(Qt.Key.Key_Space, False),
- (0x0, False), # Used by Qt for unknown keys
+ # Used by Qt for unknown keys
+ pytest.param(keyutils._NIL_KEY, False, marks=pyqt_enum_workaround_skip),
(Qt.Key.Key_ydiaeresis, True),
(Qt.Key.Key_X, True),
diff --git a/tests/unit/test_qt_machinery.py b/tests/unit/test_qt_machinery.py
index 1618e9e6f..32f63043b 100644
--- a/tests/unit/test_qt_machinery.py
+++ b/tests/unit/test_qt_machinery.py
@@ -23,6 +23,7 @@ import html
import argparse
import typing
from typing import Any, Optional, List, Dict, Union
+import dataclasses
import pytest
@@ -214,7 +215,7 @@ def modules():
reason=machinery.SelectionReason.auto,
outcomes={
"PyQt6": "ImportError: Fake ImportError for PyQt6.",
- }
+ },
),
id="import-error",
),
@@ -230,111 +231,157 @@ def test_autoselect(
assert machinery._autoselect_wrapper() == expected
-@pytest.mark.parametrize(
- "args, env, expected",
- [
- # Defaults with no overrides
- (
- None,
- None,
- machinery.SelectionInfo(
- wrapper="PyQt5", reason=machinery.SelectionReason.default
+@dataclasses.dataclass
+class SelectWrapperCase:
+ name: str
+ expected: machinery.SelectionInfo
+ args: Optional[argparse.Namespace] = None
+ env: Optional[str] = None
+ override: Optional[str] = None
+
+ def __str__(self):
+ return self.name
+
+
+class TestSelectWrapper:
+ @pytest.mark.parametrize(
+ "tc",
+ [
+ # Only argument given
+ SelectWrapperCase(
+ "pyqt6-arg",
+ args=argparse.Namespace(qt_wrapper="PyQt6"),
+ expected=machinery.SelectionInfo(
+ wrapper="PyQt6", reason=machinery.SelectionReason.cli
+ ),
),
- ),
- (
- argparse.Namespace(qt_wrapper=None),
- None,
- machinery.SelectionInfo(
- wrapper="PyQt5", reason=machinery.SelectionReason.default
+ SelectWrapperCase(
+ "pyqt5-arg",
+ args=argparse.Namespace(qt_wrapper="PyQt5"),
+ expected=machinery.SelectionInfo(
+ wrapper="PyQt5", reason=machinery.SelectionReason.cli
+ ),
),
- ),
- (
- argparse.Namespace(qt_wrapper=None),
- "",
- machinery.SelectionInfo(
- wrapper="PyQt5", reason=machinery.SelectionReason.default
+ SelectWrapperCase(
+ "pyqt6-arg-empty-env",
+ args=argparse.Namespace(qt_wrapper="PyQt5"),
+ env="",
+ expected=machinery.SelectionInfo(
+ wrapper="PyQt5", reason=machinery.SelectionReason.cli
+ ),
),
- ),
- # Only argument given
- (
- argparse.Namespace(qt_wrapper="PyQt6"),
- None,
- machinery.SelectionInfo(
- wrapper="PyQt6", reason=machinery.SelectionReason.cli
+ # Only environment variable given
+ SelectWrapperCase(
+ "pyqt6-env",
+ env="PyQt6",
+ expected=machinery.SelectionInfo(
+ wrapper="PyQt6", reason=machinery.SelectionReason.env
+ ),
),
- ),
- (
- argparse.Namespace(qt_wrapper="PyQt5"),
- None,
- machinery.SelectionInfo(
- wrapper="PyQt5", reason=machinery.SelectionReason.cli
+ SelectWrapperCase(
+ "pyqt5-env",
+ env="PyQt5",
+ expected=machinery.SelectionInfo(
+ wrapper="PyQt5", reason=machinery.SelectionReason.env
+ ),
),
- ),
- (
- argparse.Namespace(qt_wrapper="PyQt5"),
- "",
- machinery.SelectionInfo(
- wrapper="PyQt5", reason=machinery.SelectionReason.cli
+ # Both given
+ SelectWrapperCase(
+ "pyqt5-arg-pyqt6-env",
+ args=argparse.Namespace(qt_wrapper="PyQt5"),
+ env="PyQt6",
+ expected=machinery.SelectionInfo(
+ wrapper="PyQt5", reason=machinery.SelectionReason.cli
+ ),
),
- ),
- # Only environment variable given
- (
- None,
- "PyQt6",
- machinery.SelectionInfo(
- wrapper="PyQt6", reason=machinery.SelectionReason.env
+ SelectWrapperCase(
+ "pyqt6-arg-pyqt5-env",
+ args=argparse.Namespace(qt_wrapper="PyQt6"),
+ env="PyQt5",
+ expected=machinery.SelectionInfo(
+ wrapper="PyQt6", reason=machinery.SelectionReason.cli
+ ),
),
- ),
- (
- None,
- "PyQt5",
- machinery.SelectionInfo(
- wrapper="PyQt5", reason=machinery.SelectionReason.env
+ SelectWrapperCase(
+ "pyqt6-arg-pyqt6-env",
+ args=argparse.Namespace(qt_wrapper="PyQt6"),
+ env="PyQt6",
+ expected=machinery.SelectionInfo(
+ wrapper="PyQt6", reason=machinery.SelectionReason.cli
+ ),
),
- ),
- # Both given
- (
- argparse.Namespace(qt_wrapper="PyQt5"),
- "PyQt6",
- machinery.SelectionInfo(
- wrapper="PyQt5", reason=machinery.SelectionReason.cli
+ # Override
+ SelectWrapperCase(
+ "override-only",
+ override="PyQt6",
+ expected=machinery.SelectionInfo(
+ wrapper="PyQt6", reason=machinery.SelectionReason.override
+ ),
),
- ),
- (
- argparse.Namespace(qt_wrapper="PyQt6"),
- "PyQt5",
- machinery.SelectionInfo(
- wrapper="PyQt6", reason=machinery.SelectionReason.cli
+ SelectWrapperCase(
+ "override-arg",
+ args=argparse.Namespace(qt_wrapper="PyQt5"),
+ override="PyQt6",
+ expected=machinery.SelectionInfo(
+ wrapper="PyQt5", reason=machinery.SelectionReason.cli
+ ),
),
- ),
- (
- argparse.Namespace(qt_wrapper="PyQt6"),
- "PyQt6",
- machinery.SelectionInfo(
- wrapper="PyQt6", reason=machinery.SelectionReason.cli
+ SelectWrapperCase(
+ "override-env",
+ env="PyQt5",
+ override="PyQt6",
+ expected=machinery.SelectionInfo(
+ wrapper="PyQt5", reason=machinery.SelectionReason.env
+ ),
),
- ),
- ],
-)
-def test_select_wrapper(
- args: Optional[argparse.Namespace],
- env: Optional[str],
- expected: machinery.SelectionInfo,
- monkeypatch: pytest.MonkeyPatch,
- undo_init: None,
-):
- if env is None:
- monkeypatch.delenv("QUTE_QT_WRAPPER", raising=False)
- else:
- monkeypatch.setenv("QUTE_QT_WRAPPER", env)
+ ],
+ ids=str,
+ )
+ def test_select(self, tc: SelectWrapperCase, monkeypatch: pytest.MonkeyPatch):
+ if tc.env is None:
+ monkeypatch.delenv("QUTE_QT_WRAPPER", raising=False)
+ else:
+ monkeypatch.setenv("QUTE_QT_WRAPPER", tc.env)
+
+ if tc.override is not None:
+ monkeypatch.setattr(machinery, "_WRAPPER_OVERRIDE", tc.override)
+
+ assert machinery._select_wrapper(tc.args) == tc.expected
+
+ @pytest.mark.parametrize(
+ "args, env",
+ [
+ (None, None),
+ (argparse.Namespace(qt_wrapper=None), None),
+ (argparse.Namespace(qt_wrapper=None), ""),
+ ],
+ )
+ def test_autoselect_by_default(
+ self,
+ args: Optional[argparse.Namespace],
+ env: Optional[str],
+ monkeypatch: pytest.MonkeyPatch,
+ ):
+ """Test that the default behavior is to autoselect a wrapper.
+
+ Autoselection itself is tested further down.
+ """
+ if env is None:
+ monkeypatch.delenv("QUTE_QT_WRAPPER", raising=False)
+ else:
+ monkeypatch.setenv("QUTE_QT_WRAPPER", env)
- assert machinery._select_wrapper(args) == expected
+ assert machinery._select_wrapper(args).reason == machinery.SelectionReason.auto
+ def test_after_qt_import(self, monkeypatch: pytest.MonkeyPatch):
+ monkeypatch.setitem(sys.modules, "PyQt6", None)
+ with pytest.warns(UserWarning, match="PyQt6 already imported"):
+ machinery._select_wrapper(args=None)
-def test_select_wrapper_after_qt_import(monkeypatch: pytest.MonkeyPatch):
- monkeypatch.setitem(sys.modules, "PyQt6", None)
- with pytest.warns(UserWarning, match="PyQt6 already imported"):
- machinery._select_wrapper(args=None)
+ def test_invalid_override(self, monkeypatch: pytest.MonkeyPatch):
+ monkeypatch.setattr(machinery, "_WRAPPER_OVERRIDE", "invalid")
+ with pytest.raises(AssertionError):
+ machinery._select_wrapper(args=None)
class TestInit:
@@ -359,15 +406,34 @@ class TestInit:
):
machinery.init(args=empty_args)
+ @pytest.fixture(params=["auto", "", None])
+ def qt_auto_env(
+ self,
+ request: pytest.FixtureRequest,
+ monkeypatch: pytest.MonkeyPatch,
+ ):
+ """Trigger wrapper autoselection via environment variable.
+
+ Autoselection should be used in three scenarios:
+
+ - The environment variable is set to "auto".
+ - The environment variable is set to an empty string.
+ - The environment variable is not set at all.
+
+ We run test_none_available_*() for all three scenarios.
+ """
+ if request.param is None:
+ monkeypatch.delenv("QUTE_QT_WRAPPER", raising=False)
+ else:
+ monkeypatch.setenv("QUTE_QT_WRAPPER", request.param)
+
def test_none_available_implicit(
self,
stubs: Any,
modules: Dict[str, bool],
monkeypatch: pytest.MonkeyPatch,
- undo_init: None,
+ qt_auto_env: None,
):
- # FIXME:qt6 Also try without this once auto is default
- monkeypatch.setenv("QUTE_QT_WRAPPER", "auto")
stubs.ImportFake(modules, monkeypatch).patch()
message_lines = [
@@ -391,10 +457,8 @@ class TestInit:
modules: Dict[str, bool],
monkeypatch: pytest.MonkeyPatch,
empty_args: argparse.Namespace,
- undo_init: None,
+ qt_auto_env: None,
):
- # FIXME:qt6 Also try without this once auto is default
- monkeypatch.setenv("QUTE_QT_WRAPPER", "auto")
stubs.ImportFake(modules, monkeypatch).patch()
info = machinery.init(args=empty_args)
@@ -403,7 +467,7 @@ class TestInit:
reason=machinery.SelectionReason.auto,
outcomes={
"PyQt6": "ImportError: Fake ImportError for PyQt6.",
- }
+ },
)
@pytest.mark.parametrize(
@@ -422,7 +486,6 @@ class TestInit:
true_vars: str,
explicit: bool,
empty_args: argparse.Namespace,
- undo_init: None,
):
info = machinery.SelectionInfo(
wrapper=selected_wrapper,