From b7560a88084cb7812059a616c5ec757b46bb45b0 Mon Sep 17 00:00:00 2001 From: Bruno Oliveira Date: Tue, 4 Sep 2018 16:48:21 -0300 Subject: [PATCH] Keep backward compatibility for code as kw in Node.warn --- src/_pytest/nodes.py | 12 ++++++++++-- testing/test_config.py | 11 ++++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/_pytest/nodes.py b/src/_pytest/nodes.py index 53d22dc22..f70ad6a54 100644 --- a/src/_pytest/nodes.py +++ b/src/_pytest/nodes.py @@ -136,7 +136,7 @@ class Node(object): def __repr__(self): return "<%s %r>" % (self.__class__.__name__, getattr(self, "name", None)) - def warn(self, code_or_warning, message=None): + def warn(self, code_or_warning=None, message=None, code=None): """Issue a warning for this item. Warnings will be displayed after the test session, unless explicitly suppressed. @@ -164,12 +164,20 @@ class Node(object): :param Union[Warning,str] code_or_warning: warning instance or warning code (legacy). :param Union[str,None] message: message to display when called in the legacy form. + :param str code: code for the warning, in legacy form when using keyword arguments. :return: """ if message is None: + if code_or_warning is None: + raise ValueError("code_or_warning must be given") self._std_warn(code_or_warning) else: - self._legacy_warn(code_or_warning, message) + if code_or_warning and code: + raise ValueError( + "code_or_warning and code cannot both be passed to this function" + ) + code = code_or_warning or code + self._legacy_warn(code, message) def _legacy_warn(self, code, message): """ diff --git a/testing/test_config.py b/testing/test_config.py index fac780a05..8d67d7e9d 100644 --- a/testing/test_config.py +++ b/testing/test_config.py @@ -809,18 +809,23 @@ class TestLegacyWarning(object): ) @pytest.mark.filterwarnings("default") - def test_warn_on_test_item_from_request(self, testdir, request): + @pytest.mark.parametrize("use_kw", [True, False]) + def test_warn_on_test_item_from_request(self, testdir, use_kw): + code_kw = "code=" if use_kw else "" + message_kw = "message=" if use_kw else "" testdir.makepyfile( """ import pytest @pytest.fixture def fix(request): - request.node.warn("T1", "hello") + request.node.warn({code_kw}"T1", {message_kw}"hello") def test_hello(fix): pass - """ + """.format( + code_kw=code_kw, message_kw=message_kw + ) ) result = testdir.runpytest("--disable-pytest-warnings") assert "hello" not in result.stdout.str()