From 14919c4bbbeca42a1822858ee31f928c0b2e35dd Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Thu, 6 Oct 2022 11:44:05 +0200 Subject: [PATCH] fix #10342: put location into warning exceptions as the warning systems own warn_explicit looses the information we add them explicitly to the warning exceptions --- src/_pytest/warning_types.py | 20 +++++++++++--------- testing/test_warning_types.py | 8 ++++++++ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/_pytest/warning_types.py b/src/_pytest/warning_types.py index 88a513991..388949bed 100644 --- a/src/_pytest/warning_types.py +++ b/src/_pytest/warning_types.py @@ -158,12 +158,14 @@ def warn_explicit_for(method: FunctionType, message: PytestWarning) -> None: filename = inspect.getfile(method) module = method.__module__ mod_globals = method.__globals__ - - warnings.warn_explicit( - message, - type(message), - filename=filename, - module=module, - registry=mod_globals.setdefault("__warningregistry__", {}), - lineno=lineno, - ) + try: + warnings.warn_explicit( + message, + type(message), + filename=filename, + module=module, + registry=mod_globals.setdefault("__warningregistry__", {}), + lineno=lineno, + ) + except Warning as w: + raise type(w)(f"{w}\n at {filename}:{lineno}") from None diff --git a/testing/test_warning_types.py b/testing/test_warning_types.py index b49cc68f9..5f69439ef 100644 --- a/testing/test_warning_types.py +++ b/testing/test_warning_types.py @@ -36,3 +36,11 @@ def test_pytest_warnings_repr_integration_test(pytester: Pytester) -> None: ) result = pytester.runpytest() result.stdout.fnmatch_lines(["E pytest.PytestWarning: some warning"]) + + +@pytest.mark.filterwarnings("error") +def test_warn_explicit_for_annotates_errors_with_location(): + with pytest.raises(Warning, match="(?m)test\n at .*python_api.py:\\d+"): + warning_types.warn_explicit_for( + pytest.raises, warning_types.PytestWarning("test") # type: ignore + )