diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 184974cf2..81752237e 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -16,7 +16,7 @@ parse==1.6.6 parse-type==0.3.4 py==1.4.31 pytest==2.9.2 -pytest-bdd==2.16.1 +pytest-bdd==2.17.0 pytest-catchlog==1.2.2 pytest-cov==2.2.1 pytest-faulthandler==1.3.0 diff --git a/pytest.ini b/pytest.ini index e51475465..76372ff81 100644 --- a/pytest.ini +++ b/pytest.ini @@ -12,7 +12,6 @@ markers = frozen: Tests which can only be run if sys.frozen is True. integration: Tests which test a bigger portion of code end2end: End to end tests which run qutebrowser as subprocess - pyqt531_or_newer: Needs PyQt 5.3.1 or newer. xfail_norun: xfail the test with out running it ci: Tests which should only run on CI. flaky_once: Try to rerun this test once if it fails diff --git a/tests/conftest.py b/tests/conftest.py index c5e6aa08f..0fc79419c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -21,9 +21,11 @@ """The qutebrowser test suite conftest file.""" +import re import os import sys import warnings +import operator import pytest import hypothesis @@ -35,6 +37,8 @@ from helpers.fixtures import * # pylint: disable=wildcard-import from PyQt5.QtCore import PYQT_VERSION +from qutebrowser.utils import qtutils + # Set hypothesis settings hypothesis.settings.register_profile('default', @@ -54,8 +58,6 @@ def _apply_platform_markers(item): "Can't be run when frozen"), ('frozen', not getattr(sys, 'frozen', False), "Can only run when frozen"), - ('pyqt531_or_newer', PYQT_VERSION < 0x050301, - "Needs PyQt 5.3.1 or newer"), ('ci', 'CI' not in os.environ, "Only runs on CI."), ] @@ -183,3 +185,43 @@ def pytest_sessionfinish(exitstatus): status_file = os.path.join(cache_dir, 'pytest_status') with open(status_file, 'w', encoding='ascii') as f: f.write(str(exitstatus)) + + +def pytest_bdd_apply_tag(tag, function): + version_re = re.compile(""" + (?Pqt|pyqt) + (?P==|>|>=|<|<=|!=) + (?P\d+\.\d+\.\d+) + """, re.VERBOSE) + + match = version_re.match(tag) + if not match: + # Use normal tag mapping + return None + + operators = { + '==': operator.eq, + '>': operator.gt, + '<': operator.lt, + '>=': operator.ge, + '<=': operator.le, + '!=': operator.ne, + } + + package = match.group('package') + op = operators[match.group('operator')] + version = match.group('version') + + if package == 'qt': + mark = pytest.mark.skipif(qtutils.version_check(version, op), + reason='Needs ' + tag) + elif package == 'pyqt': + major, minor, patch = [int(e) for e in version.split('.')] + hex_version = (major << 16) | (minor << 8) | patch + mark = pytest.mark.skipif(not op(PYQT_VERSION, hex_version), + reason='Needs ' + tag) + # else: + raise ValueError("Invalid package {}".format(package)) + + mark(function) + return True diff --git a/tests/end2end/features/prompts.feature b/tests/end2end/features/prompts.feature index 381b87088..667ebba9a 100644 --- a/tests/end2end/features/prompts.feature +++ b/tests/end2end/features/prompts.feature @@ -40,7 +40,7 @@ Feature: Prompts And I run :leave-mode Then the javascript message "confirm reply: false" should be logged - @pyqt531_or_newer + @pyqt>=5.3.1 Scenario: Javascript prompt When I open data/prompt/jsprompt.html And I click the button @@ -49,7 +49,7 @@ Feature: Prompts And I run :prompt-accept Then the javascript message "Prompt reply: prompt test" should be logged - @pyqt531_or_newer + @pyqt>=5.3.1 Scenario: Rejected javascript prompt When I open data/prompt/jsprompt.html And I click the button @@ -61,7 +61,7 @@ Feature: Prompts # Shift-Insert with prompt (issue 1299) - @pyqt531_or_newer + @pyqt>=5.3.1 Scenario: Pasting via shift-insert in prompt mode When selection is supported And I put "insert test" into the primary selection @@ -72,7 +72,7 @@ Feature: Prompts And I run :prompt-accept Then the javascript message "Prompt reply: insert test" should be logged - @pyqt531_or_newer + @pyqt>=5.3.1 Scenario: Using content -> ignore-javascript-prompt When I set content -> ignore-javascript-prompt to true And I open data/prompt/jsprompt.html