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`.
  • Loading branch information
blueyed authored Nov 3, 2019
1 parent 017a0dd commit aade7ed
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 20 deletions.
40 changes: 21 additions & 19 deletions src/_pytest/pytester.py
Original file line number Diff line number Diff line change
Expand Up @@ -1421,10 +1421,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, short_msg="remains unmatched: {!r}".format(line)
)
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 @@ -1450,18 +1450,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, short_msg=msg)
10 changes: 9 additions & 1 deletion testing/test_pytester.py
Original file line number Diff line number Diff line change
Expand Up @@ -545,7 +545,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 @@ -557,6 +557,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 aade7ed

Please sign in to comment.