Skip to content

Commit d84e6e3

Browse files
committed
assertion/rewrite: fix test crash on assert failure with terminalreporter disabled
The `config.get_terminal_writer()` in `assertrepr_compare` (=> the function injected by assertion rewriting for every `assert`) requires the `terminalreporter` plugin, so it crashed when the plugin is disabled. Fix #14377.
1 parent 198b765 commit d84e6e3

3 files changed

Lines changed: 30 additions & 1 deletion

File tree

src/_pytest/assertion/__init__.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,11 @@ def pytest_sessionfinish(session: Session) -> None:
205205
def pytest_assertrepr_compare(
206206
config: Config, op: str, left: Any, right: Any
207207
) -> list[str] | None:
208-
highlighter = config.get_terminal_writer()._highlight
208+
if config.pluginmanager.has_plugin("terminalreporter"):
209+
highlighter = config.get_terminal_writer()._highlight
210+
else:
211+
# Keep it plaintext when not using terminalrepoterer (#14377).
212+
highlighter = util.dummy_highlighter
209213
return util.assertrepr_compare(
210214
op=op,
211215
left=left,

testing/test_assertion.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,13 @@ class TerminalWriter:
2424
def _highlight(self, source, lexer="python"):
2525
return source
2626

27+
class PluginManager:
28+
def has_plugin(self, name: str) -> bool:
29+
return True
30+
2731
class Config:
32+
pluginmanager = PluginManager()
33+
2834
def get_terminal_writer(self):
2935
return TerminalWriter()
3036

testing/test_assertrewrite.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2404,3 +2404,22 @@ def test_saferepr_unbounded(self):
24042404
_saferepr(self.Help)
24052405
== f"<class '{Path(__file__).stem}.{self.__class__.__name__}.Help'>"
24062406
)
2407+
2408+
2409+
def test_assertion_failure_when_terminalreporter_is_disabled(
2410+
pytester: Pytester,
2411+
) -> None:
2412+
"""Assertion rewriting doesn't crash when the terminalreporter plugin is
2413+
disabled (#14378)."""
2414+
pytester.makepyfile(
2415+
"""
2416+
import pytest
2417+
2418+
def test():
2419+
with pytest.raises(AssertionError) as excinfo:
2420+
assert 0 == 1
2421+
assert excinfo.value.args[0] == 'assert 0 == 1'
2422+
"""
2423+
)
2424+
reprec = pytester.inline_run("-p", "no:terminalreporter")
2425+
reprec.assertoutcome(passed=1)

0 commit comments

Comments
 (0)