Skip to content

Commit

Permalink
pytester: reset log output in _match_lines (#70)
Browse files Browse the repository at this point in the history
This is necessary for when using e.g. `no_fnmatch_line` after it.
Factor it out into `_fail`.

(cherry picked from commit aade7ed)

Ref: pytest-dev#5914 (comment)
  • Loading branch information
blueyed committed Nov 20, 2019
1 parent 7e5ad31 commit 2228ccb
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 18 deletions.
1 change: 1 addition & 0 deletions changelog/5914.bugfix.rst
@@ -0,0 +1 @@
pytester: fix ``no_fnmatch_line`` when used after positive matching.
38 changes: 21 additions & 17 deletions src/_pytest/pytester.py
Expand Up @@ -1438,8 +1438,10 @@ def _match_lines(self, lines2, match_func, match_nickname):
self._log("{:>{width}}".format("and:", width=wnick), repr(nextline))
extralines.append(nextline)
else:
self._log("remains unmatched: {!r}".format(line))
pytest.fail(self._log_text.lstrip())
msg = "remains unmatched: {!r}".format(line)
self._log(msg)
self._fail(msg)
self._log_output = []

def no_fnmatch_line(self, pat):
"""Ensure captured lines do not match the given pattern, using ``fnmatch.fnmatch``.
Expand All @@ -1465,18 +1467,20 @@ def _no_match_line(self, pat, match_func, match_nickname):
__tracebackhide__ = True
nomatch_printed = False
wnick = len(match_nickname) + 1
try:
for line in self.lines:
if match_func(line, pat):
self._log("%s:" % match_nickname, repr(pat))
self._log("{:>{width}}".format("with:", width=wnick), repr(line))
pytest.fail(self._log_text.lstrip())
else:
if not nomatch_printed:
self._log(
"{:>{width}}".format("nomatch:", width=wnick), repr(pat)
)
nomatch_printed = True
self._log("{:>{width}}".format("and:", width=wnick), repr(line))
finally:
self._log_output = []
for line in self.lines:
if match_func(line, pat):
msg = "{}: {!r}".format(match_nickname, pat)
self._log(msg)
self._log("{:>{width}}".format("with:", width=wnick), repr(line))
self._fail(msg)
else:
if not nomatch_printed:
self._log("{:>{width}}".format("nomatch:", width=wnick), repr(pat))
nomatch_printed = True
self._log("{:>{width}}".format("and:", width=wnick), repr(line))
self._log_output = []

def _fail(self, msg):
log_text = self._log_text
self._log_output = []
pytest.fail(log_text)
10 changes: 9 additions & 1 deletion testing/test_pytester.py
Expand Up @@ -530,7 +530,7 @@ def test_no_matching(function):
]
else:
assert obtained == [
"nomatch: '{}'".format(good_pattern),
" nomatch: '{}'".format(good_pattern),
" and: 'cachedir: .pytest_cache'",
" and: 'collecting ... collected 1 item'",
" and: ''",
Expand All @@ -542,6 +542,14 @@ def test_no_matching(function):
func(bad_pattern) # bad pattern does not match any line: passes


def test_no_matching_after_match():
lm = LineMatcher(["1", "2", "3"])
lm.fnmatch_lines(["1", "3"])
with pytest.raises(pytest.fail.Exception) as e:
lm.no_fnmatch_line("*")
assert str(e.value).splitlines() == ["fnmatch: '*'", " with: '1'"]


def test_pytester_addopts(request, monkeypatch):
monkeypatch.setenv("PYTEST_ADDOPTS", "--orig-unused")

Expand Down

0 comments on commit 2228ccb

Please sign in to comment.