From 8ce32b0795e04a1e9a0c638130adcf6e7eaa72ea Mon Sep 17 00:00:00 2001 From: Matt Bachmann Date: Sat, 5 Mar 2016 12:23:13 -0500 Subject: [PATCH] When a regex pattern contains bytes instead of a string use escape_encode to turn it into a string before further processing. Thanks @nicoddemus for the review and tips! --- AUTHORS | 1 + CHANGELOG.rst | 6 ++++-- _pytest/python.py | 2 +- testing/acceptance_test.py | 14 ++++++++++++++ testing/python/metafunc.py | 5 +++++ 5 files changed, 25 insertions(+), 3 deletions(-) diff --git a/AUTHORS b/AUTHORS index b9868ef2a..4546b3178 100644 --- a/AUTHORS +++ b/AUTHORS @@ -59,6 +59,7 @@ Marc Schlaich Mark Abramowitz Markus Unterwaditzer Martijn Faassen +Matt Bachmann Michael Aquilina Michael Birtwell Michael Droettboom diff --git a/CHANGELOG.rst b/CHANGELOG.rst index bc68d34f0..8dbfec986 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -8,17 +8,19 @@ * Fix (`#469`_): junit parses report.nodeid incorrectly, when params IDs contain ``::``. Thanks `@tomviner`_ for the PR (`#1431`_). -* * Fix (`#578 `_): SyntaxErrors containing non-ascii lines at the point of failure generated an internal py.test error. Thanks `@asottile`_ for the report and `@nicoddemus`_ for the PR. -* +* Fix (`#1437`_): When passing in a bytestring regex pattern to parameterize + attempt to decode it as utf-8 ignoring errors. * + +.. _#1437: https://github.com/pytest-dev/pytest/issues/1437 .. _#469: https://github.com/pytest-dev/pytest/issues/469 .. _#1431: https://github.com/pytest-dev/pytest/pull/1431 diff --git a/_pytest/python.py b/_pytest/python.py index ec346f587..b5073d5b6 100644 --- a/_pytest/python.py +++ b/_pytest/python.py @@ -1115,7 +1115,7 @@ def _idval(val, argname, idx, idfn): elif isinstance(val, (float, int, str, bool, NoneType)): return str(val) elif isinstance(val, REGEX_TYPE): - return val.pattern + return _escape_bytes(val.pattern) if isinstance(val.pattern, bytes) else val.pattern elif enum is not None and isinstance(val, enum.Enum): return str(val) elif isclass(val) and hasattr(val, '__name__'): diff --git a/testing/acceptance_test.py b/testing/acceptance_test.py index 74db4425d..9bc3a191a 100644 --- a/testing/acceptance_test.py +++ b/testing/acceptance_test.py @@ -392,6 +392,20 @@ class TestGeneralUsage: monkeypatch.setitem(sys.modules, 'myplugin', mod) assert pytest.main(args=[str(tmpdir)], plugins=['myplugin']) == 0 + def test_parameterized_with_bytes_regex(self, testdir): + p = testdir.makepyfile(""" + import re + import pytest + @pytest.mark.parametrize('r', [re.compile(b'foo')]) + def test_stuff(r): + pass + """ + ) + res = testdir.runpytest(p) + res.stdout.fnmatch_lines([ + '*1 passed*' + ]) + class TestInvocationVariants: def test_earlyinit(self, testdir): diff --git a/testing/python/metafunc.py b/testing/python/metafunc.py index 21869cff9..faa687f40 100644 --- a/testing/python/metafunc.py +++ b/testing/python/metafunc.py @@ -170,6 +170,11 @@ class TestMetafunc: result = idmaker((py.builtin._totext("a"), "b"), [({}, b'\xc3\xb4')]) assert result == ['a0-\\xc3\\xb4'] + def test_idmaker_with_bytes_regex(self): + from _pytest.python import idmaker + result = idmaker(("a"), [(re.compile(b'foo'), 1.0)]) + assert result == ["foo"] + def test_idmaker_native_strings(self): from _pytest.python import idmaker totext = py.builtin._totext