pytester: LineMatcher: assert Sequence when matching in order

This can be helpful when passing a set accidentally.
This commit is contained in:
Daniel Hahler 2019-03-15 04:14:07 +01:00
parent 33d4c96aa2
commit 5e27ea5528
3 changed files with 19 additions and 0 deletions

View File

@ -0,0 +1 @@
pytester's ``LineMatcher`` asserts that the passed lines are a sequence.

View File

@ -25,6 +25,7 @@ from _pytest.assertion.rewrite import AssertionRewritingHook
from _pytest.capture import MultiCapture
from _pytest.capture import SysCapture
from _pytest.compat import safe_str
from _pytest.compat import Sequence
from _pytest.main import EXIT_INTERRUPTED
from _pytest.main import EXIT_OK
from _pytest.main import Session
@ -1325,6 +1326,7 @@ class LineMatcher(object):
will be logged to stdout when a match occurs
"""
assert isinstance(lines2, Sequence)
lines2 = self._getlines(lines2)
lines1 = self.lines[:]
nextline = None

View File

@ -17,6 +17,7 @@ from _pytest.main import EXIT_OK
from _pytest.main import EXIT_TESTSFAILED
from _pytest.pytester import CwdSnapshot
from _pytest.pytester import HookRecorder
from _pytest.pytester import LineMatcher
from _pytest.pytester import SysModulesSnapshot
from _pytest.pytester import SysPathsSnapshot
@ -453,3 +454,18 @@ def test_testdir_run_timeout_expires(testdir):
)
with pytest.raises(testdir.TimeoutExpired):
testdir.runpytest_subprocess(testfile, timeout=1)
def test_linematcher_with_nonlist():
"""Test LineMatcher with regard to passing in a set (accidentally)."""
lm = LineMatcher([])
with pytest.raises(AssertionError):
lm.fnmatch_lines(set())
with pytest.raises(AssertionError):
lm.fnmatch_lines({})
lm.fnmatch_lines([])
lm.fnmatch_lines(())
assert lm._getlines({}) == {}
assert lm._getlines(set()) == set()