Migrate test_assertion.py from testdir to pytester
This commit is contained in:
parent
8f52fc777a
commit
47ff911c8f
|
@ -12,6 +12,7 @@ import pytest
|
|||
from _pytest import outcomes
|
||||
from _pytest.assertion import truncate
|
||||
from _pytest.assertion import util
|
||||
from _pytest.pytester import Pytester
|
||||
|
||||
|
||||
def mock_config(verbose=0):
|
||||
|
@ -27,9 +28,12 @@ def mock_config(verbose=0):
|
|||
class TestImportHookInstallation:
|
||||
@pytest.mark.parametrize("initial_conftest", [True, False])
|
||||
@pytest.mark.parametrize("mode", ["plain", "rewrite"])
|
||||
def test_conftest_assertion_rewrite(self, testdir, initial_conftest, mode):
|
||||
def test_conftest_assertion_rewrite(
|
||||
self, pytester: Pytester, initial_conftest, mode
|
||||
) -> None:
|
||||
"""Test that conftest files are using assertion rewrite on import (#1619)."""
|
||||
testdir.tmpdir.join("foo/tests").ensure(dir=1)
|
||||
pytester.mkdir("foo")
|
||||
pytester.mkdir("foo/tests")
|
||||
conftest_path = "conftest.py" if initial_conftest else "foo/conftest.py"
|
||||
contents = {
|
||||
conftest_path: """
|
||||
|
@ -45,8 +49,8 @@ class TestImportHookInstallation:
|
|||
check_first([10, 30], 30)
|
||||
""",
|
||||
}
|
||||
testdir.makepyfile(**contents)
|
||||
result = testdir.runpytest_subprocess("--assert=%s" % mode)
|
||||
pytester.makepyfile(**contents)
|
||||
result = pytester.runpytest_subprocess("--assert=%s" % mode)
|
||||
if mode == "plain":
|
||||
expected = "E AssertionError"
|
||||
elif mode == "rewrite":
|
||||
|
@ -55,21 +59,21 @@ class TestImportHookInstallation:
|
|||
assert 0
|
||||
result.stdout.fnmatch_lines([expected])
|
||||
|
||||
def test_rewrite_assertions_pytester_plugin(self, testdir):
|
||||
def test_rewrite_assertions_pytester_plugin(self, pytester: Pytester) -> None:
|
||||
"""
|
||||
Assertions in the pytester plugin must also benefit from assertion
|
||||
rewriting (#1920).
|
||||
"""
|
||||
testdir.makepyfile(
|
||||
pytester.makepyfile(
|
||||
"""
|
||||
pytest_plugins = ['pytester']
|
||||
def test_dummy_failure(testdir): # how meta!
|
||||
testdir.makepyfile('def test(): assert 0')
|
||||
r = testdir.inline_run()
|
||||
def test_dummy_failure(pytester): # how meta!
|
||||
pytester.makepyfile('def test(): assert 0')
|
||||
r = pytester.inline_run()
|
||||
r.assertoutcome(passed=1)
|
||||
"""
|
||||
)
|
||||
result = testdir.runpytest_subprocess()
|
||||
result = pytester.runpytest_subprocess()
|
||||
result.stdout.fnmatch_lines(
|
||||
[
|
||||
"> r.assertoutcome(passed=1)",
|
||||
|
@ -89,7 +93,7 @@ class TestImportHookInstallation:
|
|||
)
|
||||
|
||||
@pytest.mark.parametrize("mode", ["plain", "rewrite"])
|
||||
def test_pytest_plugins_rewrite(self, testdir, mode):
|
||||
def test_pytest_plugins_rewrite(self, pytester: Pytester, mode) -> None:
|
||||
contents = {
|
||||
"conftest.py": """
|
||||
pytest_plugins = ['ham']
|
||||
|
@ -107,8 +111,8 @@ class TestImportHookInstallation:
|
|||
check_first([10, 30], 30)
|
||||
""",
|
||||
}
|
||||
testdir.makepyfile(**contents)
|
||||
result = testdir.runpytest_subprocess("--assert=%s" % mode)
|
||||
pytester.makepyfile(**contents)
|
||||
result = pytester.runpytest_subprocess("--assert=%s" % mode)
|
||||
if mode == "plain":
|
||||
expected = "E AssertionError"
|
||||
elif mode == "rewrite":
|
||||
|
@ -118,7 +122,9 @@ class TestImportHookInstallation:
|
|||
result.stdout.fnmatch_lines([expected])
|
||||
|
||||
@pytest.mark.parametrize("mode", ["str", "list"])
|
||||
def test_pytest_plugins_rewrite_module_names(self, testdir, mode):
|
||||
def test_pytest_plugins_rewrite_module_names(
|
||||
self, pytester: Pytester, mode
|
||||
) -> None:
|
||||
"""Test that pluginmanager correct marks pytest_plugins variables
|
||||
for assertion rewriting if they are defined as plain strings or
|
||||
list of strings (#1888).
|
||||
|
@ -138,11 +144,13 @@ class TestImportHookInstallation:
|
|||
assert 'ham' in pytestconfig.pluginmanager.rewrite_hook._must_rewrite
|
||||
""",
|
||||
}
|
||||
testdir.makepyfile(**contents)
|
||||
result = testdir.runpytest_subprocess("--assert=rewrite")
|
||||
pytester.makepyfile(**contents)
|
||||
result = pytester.runpytest_subprocess("--assert=rewrite")
|
||||
assert result.ret == 0
|
||||
|
||||
def test_pytest_plugins_rewrite_module_names_correctly(self, testdir):
|
||||
def test_pytest_plugins_rewrite_module_names_correctly(
|
||||
self, pytester: Pytester
|
||||
) -> None:
|
||||
"""Test that we match files correctly when they are marked for rewriting (#2939)."""
|
||||
contents = {
|
||||
"conftest.py": """\
|
||||
|
@ -156,16 +164,18 @@ class TestImportHookInstallation:
|
|||
assert pytestconfig.pluginmanager.rewrite_hook.find_spec('hamster') is None
|
||||
""",
|
||||
}
|
||||
testdir.makepyfile(**contents)
|
||||
result = testdir.runpytest_subprocess("--assert=rewrite")
|
||||
pytester.makepyfile(**contents)
|
||||
result = pytester.runpytest_subprocess("--assert=rewrite")
|
||||
assert result.ret == 0
|
||||
|
||||
@pytest.mark.parametrize("mode", ["plain", "rewrite"])
|
||||
def test_installed_plugin_rewrite(self, testdir, mode, monkeypatch):
|
||||
def test_installed_plugin_rewrite(
|
||||
self, pytester: Pytester, mode, monkeypatch
|
||||
) -> None:
|
||||
monkeypatch.delenv("PYTEST_DISABLE_PLUGIN_AUTOLOAD", raising=False)
|
||||
# Make sure the hook is installed early enough so that plugins
|
||||
# installed via setuptools are rewritten.
|
||||
testdir.tmpdir.join("hampkg").ensure(dir=1)
|
||||
pytester.mkdir("hampkg")
|
||||
contents = {
|
||||
"hampkg/__init__.py": """\
|
||||
import pytest
|
||||
|
@ -219,8 +229,8 @@ class TestImportHookInstallation:
|
|||
check_first([10, 30], 30)
|
||||
""",
|
||||
}
|
||||
testdir.makepyfile(**contents)
|
||||
result = testdir.run(
|
||||
pytester.makepyfile(**contents)
|
||||
result = pytester.run(
|
||||
sys.executable, "mainwrapper.py", "-s", "--assert=%s" % mode
|
||||
)
|
||||
if mode == "plain":
|
||||
|
@ -231,8 +241,8 @@ class TestImportHookInstallation:
|
|||
assert 0
|
||||
result.stdout.fnmatch_lines([expected])
|
||||
|
||||
def test_rewrite_ast(self, testdir):
|
||||
testdir.tmpdir.join("pkg").ensure(dir=1)
|
||||
def test_rewrite_ast(self, pytester: Pytester) -> None:
|
||||
pytester.mkdir("pkg")
|
||||
contents = {
|
||||
"pkg/__init__.py": """
|
||||
import pytest
|
||||
|
@ -265,8 +275,8 @@ class TestImportHookInstallation:
|
|||
pkg.other.tool()
|
||||
""",
|
||||
}
|
||||
testdir.makepyfile(**contents)
|
||||
result = testdir.runpytest_subprocess("--assert=rewrite")
|
||||
pytester.makepyfile(**contents)
|
||||
result = pytester.runpytest_subprocess("--assert=rewrite")
|
||||
result.stdout.fnmatch_lines(
|
||||
[
|
||||
">*assert a == b*",
|
||||
|
@ -285,8 +295,8 @@ class TestImportHookInstallation:
|
|||
|
||||
|
||||
class TestBinReprIntegration:
|
||||
def test_pytest_assertrepr_compare_called(self, testdir):
|
||||
testdir.makeconftest(
|
||||
def test_pytest_assertrepr_compare_called(self, pytester: Pytester) -> None:
|
||||
pytester.makeconftest(
|
||||
"""
|
||||
import pytest
|
||||
values = []
|
||||
|
@ -298,7 +308,7 @@ class TestBinReprIntegration:
|
|||
return values
|
||||
"""
|
||||
)
|
||||
testdir.makepyfile(
|
||||
pytester.makepyfile(
|
||||
"""
|
||||
def test_hello():
|
||||
assert 0 == 1
|
||||
|
@ -306,7 +316,7 @@ class TestBinReprIntegration:
|
|||
assert list == [("==", 0, 1)]
|
||||
"""
|
||||
)
|
||||
result = testdir.runpytest("-v")
|
||||
result = pytester.runpytest("-v")
|
||||
result.stdout.fnmatch_lines(["*test_hello*FAIL*", "*test_check*PASS*"])
|
||||
|
||||
|
||||
|
@ -320,7 +330,7 @@ def callequal(left: Any, right: Any, verbose: int = 0) -> Optional[List[str]]:
|
|||
|
||||
|
||||
class TestAssert_reprcompare:
|
||||
def test_different_types(self):
|
||||
def test_different_types(self) -> None:
|
||||
assert callequal([0, 1], "foo") is None
|
||||
|
||||
def test_summary(self) -> None:
|
||||
|
@ -329,7 +339,7 @@ class TestAssert_reprcompare:
|
|||
summary = lines[0]
|
||||
assert len(summary) < 65
|
||||
|
||||
def test_text_diff(self):
|
||||
def test_text_diff(self) -> None:
|
||||
assert callequal("spam", "eggs") == [
|
||||
"'spam' == 'eggs'",
|
||||
"- eggs",
|
||||
|
@ -357,7 +367,7 @@ class TestAssert_reprcompare:
|
|||
assert "- eggs" in diff
|
||||
assert "+ spam" in diff
|
||||
|
||||
def test_bytes_diff_normal(self):
|
||||
def test_bytes_diff_normal(self) -> None:
|
||||
"""Check special handling for bytes diff (#5260)"""
|
||||
diff = callequal(b"spam", b"eggs")
|
||||
|
||||
|
@ -367,7 +377,7 @@ class TestAssert_reprcompare:
|
|||
"Use -v to get the full diff",
|
||||
]
|
||||
|
||||
def test_bytes_diff_verbose(self):
|
||||
def test_bytes_diff_verbose(self) -> None:
|
||||
"""Check special handling for bytes diff (#5260)"""
|
||||
diff = callequal(b"spam", b"eggs", verbose=1)
|
||||
assert diff == [
|
||||
|
@ -445,7 +455,7 @@ class TestAssert_reprcompare:
|
|||
assert expl is not None
|
||||
assert len(expl) > 1
|
||||
|
||||
def test_list_wrap_for_multiple_lines(self):
|
||||
def test_list_wrap_for_multiple_lines(self) -> None:
|
||||
long_d = "d" * 80
|
||||
l1 = ["a", "b", "c"]
|
||||
l2 = ["a", "b", "c", long_d]
|
||||
|
@ -475,7 +485,7 @@ class TestAssert_reprcompare:
|
|||
" ]",
|
||||
]
|
||||
|
||||
def test_list_wrap_for_width_rewrap_same_length(self):
|
||||
def test_list_wrap_for_width_rewrap_same_length(self) -> None:
|
||||
long_a = "a" * 30
|
||||
long_b = "b" * 30
|
||||
long_c = "c" * 30
|
||||
|
@ -494,7 +504,7 @@ class TestAssert_reprcompare:
|
|||
" ]",
|
||||
]
|
||||
|
||||
def test_list_dont_wrap_strings(self):
|
||||
def test_list_dont_wrap_strings(self) -> None:
|
||||
long_a = "a" * 10
|
||||
l1 = ["a"] + [long_a for _ in range(0, 7)]
|
||||
l2 = ["should not get wrapped"]
|
||||
|
@ -517,7 +527,7 @@ class TestAssert_reprcompare:
|
|||
" ]",
|
||||
]
|
||||
|
||||
def test_dict_wrap(self):
|
||||
def test_dict_wrap(self) -> None:
|
||||
d1 = {"common": 1, "env": {"env1": 1, "env2": 2}}
|
||||
d2 = {"common": 1, "env": {"env1": 1}}
|
||||
|
||||
|
@ -581,7 +591,7 @@ class TestAssert_reprcompare:
|
|||
assert "Omitting" not in lines[1]
|
||||
assert lines[2] == "{'b': 1}"
|
||||
|
||||
def test_dict_different_items(self):
|
||||
def test_dict_different_items(self) -> None:
|
||||
lines = callequal({"a": 0}, {"b": 1, "c": 2}, verbose=2)
|
||||
assert lines == [
|
||||
"{'a': 0} == {'b': 1, 'c': 2}",
|
||||
|
@ -605,7 +615,7 @@ class TestAssert_reprcompare:
|
|||
"+ {'b': 1, 'c': 2}",
|
||||
]
|
||||
|
||||
def test_sequence_different_items(self):
|
||||
def test_sequence_different_items(self) -> None:
|
||||
lines = callequal((1, 2), (3, 4, 5), verbose=2)
|
||||
assert lines == [
|
||||
"(1, 2) == (3, 4, 5)",
|
||||
|
@ -714,7 +724,7 @@ class TestAssert_reprcompare:
|
|||
" Probably an object has a faulty __repr__.)",
|
||||
]
|
||||
|
||||
def test_one_repr_empty(self):
|
||||
def test_one_repr_empty(self) -> None:
|
||||
"""The faulty empty string repr did trigger an unbound local error in _diff_text."""
|
||||
|
||||
class A(str):
|
||||
|
@ -729,14 +739,14 @@ class TestAssert_reprcompare:
|
|||
assert expl is not None
|
||||
assert "raised in repr()" not in " ".join(expl)
|
||||
|
||||
def test_unicode(self):
|
||||
def test_unicode(self) -> None:
|
||||
assert callequal("£€", "£") == [
|
||||
"'£€' == '£'",
|
||||
"- £",
|
||||
"+ £€",
|
||||
]
|
||||
|
||||
def test_nonascii_text(self):
|
||||
def test_nonascii_text(self) -> None:
|
||||
"""
|
||||
:issue: 877
|
||||
non ascii python2 str caused a UnicodeDecodeError
|
||||
|
@ -749,7 +759,7 @@ class TestAssert_reprcompare:
|
|||
expl = callequal(A(), "1")
|
||||
assert expl == ["ÿ == '1'", "- 1"]
|
||||
|
||||
def test_format_nonascii_explanation(self):
|
||||
def test_format_nonascii_explanation(self) -> None:
|
||||
assert util.format_explanation("λ")
|
||||
|
||||
def test_mojibake(self) -> None:
|
||||
|
@ -766,9 +776,9 @@ class TestAssert_reprcompare:
|
|||
|
||||
class TestAssert_reprcompare_dataclass:
|
||||
@pytest.mark.skipif(sys.version_info < (3, 7), reason="Dataclasses in Python3.7+")
|
||||
def test_dataclasses(self, testdir):
|
||||
p = testdir.copy_example("dataclasses/test_compare_dataclasses.py")
|
||||
result = testdir.runpytest(p)
|
||||
def test_dataclasses(self, pytester: Pytester) -> None:
|
||||
p = pytester.copy_example("dataclasses/test_compare_dataclasses.py")
|
||||
result = pytester.runpytest(p)
|
||||
result.assert_outcomes(failed=1, passed=0)
|
||||
result.stdout.fnmatch_lines(
|
||||
[
|
||||
|
@ -785,9 +795,9 @@ class TestAssert_reprcompare_dataclass:
|
|||
)
|
||||
|
||||
@pytest.mark.skipif(sys.version_info < (3, 7), reason="Dataclasses in Python3.7+")
|
||||
def test_recursive_dataclasses(self, testdir):
|
||||
p = testdir.copy_example("dataclasses/test_compare_recursive_dataclasses.py")
|
||||
result = testdir.runpytest(p)
|
||||
def test_recursive_dataclasses(self, pytester: Pytester) -> None:
|
||||
p = pytester.copy_example("dataclasses/test_compare_recursive_dataclasses.py")
|
||||
result = pytester.runpytest(p)
|
||||
result.assert_outcomes(failed=1, passed=0)
|
||||
result.stdout.fnmatch_lines(
|
||||
[
|
||||
|
@ -804,9 +814,9 @@ class TestAssert_reprcompare_dataclass:
|
|||
)
|
||||
|
||||
@pytest.mark.skipif(sys.version_info < (3, 7), reason="Dataclasses in Python3.7+")
|
||||
def test_recursive_dataclasses_verbose(self, testdir):
|
||||
p = testdir.copy_example("dataclasses/test_compare_recursive_dataclasses.py")
|
||||
result = testdir.runpytest(p, "-vv")
|
||||
def test_recursive_dataclasses_verbose(self, pytester: Pytester) -> None:
|
||||
p = pytester.copy_example("dataclasses/test_compare_recursive_dataclasses.py")
|
||||
result = pytester.runpytest(p, "-vv")
|
||||
result.assert_outcomes(failed=1, passed=0)
|
||||
result.stdout.fnmatch_lines(
|
||||
[
|
||||
|
@ -837,9 +847,9 @@ class TestAssert_reprcompare_dataclass:
|
|||
)
|
||||
|
||||
@pytest.mark.skipif(sys.version_info < (3, 7), reason="Dataclasses in Python3.7+")
|
||||
def test_dataclasses_verbose(self, testdir):
|
||||
p = testdir.copy_example("dataclasses/test_compare_dataclasses_verbose.py")
|
||||
result = testdir.runpytest(p, "-vv")
|
||||
def test_dataclasses_verbose(self, pytester: Pytester) -> None:
|
||||
p = pytester.copy_example("dataclasses/test_compare_dataclasses_verbose.py")
|
||||
result = pytester.runpytest(p, "-vv")
|
||||
result.assert_outcomes(failed=1, passed=0)
|
||||
result.stdout.fnmatch_lines(
|
||||
[
|
||||
|
@ -851,19 +861,21 @@ class TestAssert_reprcompare_dataclass:
|
|||
)
|
||||
|
||||
@pytest.mark.skipif(sys.version_info < (3, 7), reason="Dataclasses in Python3.7+")
|
||||
def test_dataclasses_with_attribute_comparison_off(self, testdir):
|
||||
p = testdir.copy_example(
|
||||
def test_dataclasses_with_attribute_comparison_off(
|
||||
self, pytester: Pytester
|
||||
) -> None:
|
||||
p = pytester.copy_example(
|
||||
"dataclasses/test_compare_dataclasses_field_comparison_off.py"
|
||||
)
|
||||
result = testdir.runpytest(p, "-vv")
|
||||
result = pytester.runpytest(p, "-vv")
|
||||
result.assert_outcomes(failed=0, passed=1)
|
||||
|
||||
@pytest.mark.skipif(sys.version_info < (3, 7), reason="Dataclasses in Python3.7+")
|
||||
def test_comparing_two_different_data_classes(self, testdir):
|
||||
p = testdir.copy_example(
|
||||
def test_comparing_two_different_data_classes(self, pytester: Pytester) -> None:
|
||||
p = pytester.copy_example(
|
||||
"dataclasses/test_compare_two_different_dataclasses.py"
|
||||
)
|
||||
result = testdir.runpytest(p, "-vv")
|
||||
result = pytester.runpytest(p, "-vv")
|
||||
result.assert_outcomes(failed=0, passed=1)
|
||||
|
||||
|
||||
|
@ -939,7 +951,7 @@ class TestAssert_reprcompare_attrsclass:
|
|||
assert "Omitting" not in lines[2]
|
||||
assert lines[3] == "['field_a']"
|
||||
|
||||
def test_attrs_with_attribute_comparison_off(self):
|
||||
def test_attrs_with_attribute_comparison_off(self) -> None:
|
||||
@attr.s
|
||||
class SimpleDataObject:
|
||||
field_a = attr.ib()
|
||||
|
@ -957,7 +969,7 @@ class TestAssert_reprcompare_attrsclass:
|
|||
for line in lines[3:]:
|
||||
assert "field_b" not in line
|
||||
|
||||
def test_comparing_two_different_attrs_classes(self):
|
||||
def test_comparing_two_different_attrs_classes(self) -> None:
|
||||
@attr.s
|
||||
class SimpleDataObjectOne:
|
||||
field_a = attr.ib()
|
||||
|
@ -976,48 +988,48 @@ class TestAssert_reprcompare_attrsclass:
|
|||
|
||||
|
||||
class TestFormatExplanation:
|
||||
def test_special_chars_full(self, testdir):
|
||||
def test_special_chars_full(self, pytester: Pytester) -> None:
|
||||
# Issue 453, for the bug this would raise IndexError
|
||||
testdir.makepyfile(
|
||||
pytester.makepyfile(
|
||||
"""
|
||||
def test_foo():
|
||||
assert '\\n}' == ''
|
||||
"""
|
||||
)
|
||||
result = testdir.runpytest()
|
||||
result = pytester.runpytest()
|
||||
assert result.ret == 1
|
||||
result.stdout.fnmatch_lines(["*AssertionError*"])
|
||||
|
||||
def test_fmt_simple(self):
|
||||
def test_fmt_simple(self) -> None:
|
||||
expl = "assert foo"
|
||||
assert util.format_explanation(expl) == "assert foo"
|
||||
|
||||
def test_fmt_where(self):
|
||||
def test_fmt_where(self) -> None:
|
||||
expl = "\n".join(["assert 1", "{1 = foo", "} == 2"])
|
||||
res = "\n".join(["assert 1 == 2", " + where 1 = foo"])
|
||||
assert util.format_explanation(expl) == res
|
||||
|
||||
def test_fmt_and(self):
|
||||
def test_fmt_and(self) -> None:
|
||||
expl = "\n".join(["assert 1", "{1 = foo", "} == 2", "{2 = bar", "}"])
|
||||
res = "\n".join(["assert 1 == 2", " + where 1 = foo", " + and 2 = bar"])
|
||||
assert util.format_explanation(expl) == res
|
||||
|
||||
def test_fmt_where_nested(self):
|
||||
def test_fmt_where_nested(self) -> None:
|
||||
expl = "\n".join(["assert 1", "{1 = foo", "{foo = bar", "}", "} == 2"])
|
||||
res = "\n".join(["assert 1 == 2", " + where 1 = foo", " + where foo = bar"])
|
||||
assert util.format_explanation(expl) == res
|
||||
|
||||
def test_fmt_newline(self):
|
||||
def test_fmt_newline(self) -> None:
|
||||
expl = "\n".join(['assert "foo" == "bar"', "~- foo", "~+ bar"])
|
||||
res = "\n".join(['assert "foo" == "bar"', " - foo", " + bar"])
|
||||
assert util.format_explanation(expl) == res
|
||||
|
||||
def test_fmt_newline_escaped(self):
|
||||
def test_fmt_newline_escaped(self) -> None:
|
||||
expl = "\n".join(["assert foo == bar", "baz"])
|
||||
res = "assert foo == bar\\nbaz"
|
||||
assert util.format_explanation(expl) == res
|
||||
|
||||
def test_fmt_newline_before_where(self):
|
||||
def test_fmt_newline_before_where(self) -> None:
|
||||
expl = "\n".join(
|
||||
[
|
||||
"the assertion message here",
|
||||
|
@ -1038,7 +1050,7 @@ class TestFormatExplanation:
|
|||
)
|
||||
assert util.format_explanation(expl) == res
|
||||
|
||||
def test_fmt_multi_newline_before_where(self):
|
||||
def test_fmt_multi_newline_before_where(self) -> None:
|
||||
expl = "\n".join(
|
||||
[
|
||||
"the assertion",
|
||||
|
@ -1072,12 +1084,12 @@ class TestTruncateExplanation:
|
|||
result = truncate._truncate_explanation(expl, max_lines=8, max_chars=100)
|
||||
assert result == expl
|
||||
|
||||
def test_doesnt_truncate_at_when_input_is_5_lines_and_LT_max_chars(self):
|
||||
def test_doesnt_truncate_at_when_input_is_5_lines_and_LT_max_chars(self) -> None:
|
||||
expl = ["a" * 100 for x in range(5)]
|
||||
result = truncate._truncate_explanation(expl, max_lines=8, max_chars=8 * 80)
|
||||
assert result == expl
|
||||
|
||||
def test_truncates_at_8_lines_when_given_list_of_empty_strings(self):
|
||||
def test_truncates_at_8_lines_when_given_list_of_empty_strings(self) -> None:
|
||||
expl = ["" for x in range(50)]
|
||||
result = truncate._truncate_explanation(expl, max_lines=8, max_chars=100)
|
||||
assert result != expl
|
||||
|
@ -1087,7 +1099,7 @@ class TestTruncateExplanation:
|
|||
last_line_before_trunc_msg = result[-self.LINES_IN_TRUNCATION_MSG - 1]
|
||||
assert last_line_before_trunc_msg.endswith("...")
|
||||
|
||||
def test_truncates_at_8_lines_when_first_8_lines_are_LT_max_chars(self):
|
||||
def test_truncates_at_8_lines_when_first_8_lines_are_LT_max_chars(self) -> None:
|
||||
expl = ["a" for x in range(100)]
|
||||
result = truncate._truncate_explanation(expl, max_lines=8, max_chars=8 * 80)
|
||||
assert result != expl
|
||||
|
@ -1097,7 +1109,7 @@ class TestTruncateExplanation:
|
|||
last_line_before_trunc_msg = result[-self.LINES_IN_TRUNCATION_MSG - 1]
|
||||
assert last_line_before_trunc_msg.endswith("...")
|
||||
|
||||
def test_truncates_at_8_lines_when_first_8_lines_are_EQ_max_chars(self):
|
||||
def test_truncates_at_8_lines_when_first_8_lines_are_EQ_max_chars(self) -> None:
|
||||
expl = ["a" * 80 for x in range(16)]
|
||||
result = truncate._truncate_explanation(expl, max_lines=8, max_chars=8 * 80)
|
||||
assert result != expl
|
||||
|
@ -1107,7 +1119,7 @@ class TestTruncateExplanation:
|
|||
last_line_before_trunc_msg = result[-self.LINES_IN_TRUNCATION_MSG - 1]
|
||||
assert last_line_before_trunc_msg.endswith("...")
|
||||
|
||||
def test_truncates_at_4_lines_when_first_4_lines_are_GT_max_chars(self):
|
||||
def test_truncates_at_4_lines_when_first_4_lines_are_GT_max_chars(self) -> None:
|
||||
expl = ["a" * 250 for x in range(10)]
|
||||
result = truncate._truncate_explanation(expl, max_lines=8, max_chars=999)
|
||||
assert result != expl
|
||||
|
@ -1117,7 +1129,7 @@ class TestTruncateExplanation:
|
|||
last_line_before_trunc_msg = result[-self.LINES_IN_TRUNCATION_MSG - 1]
|
||||
assert last_line_before_trunc_msg.endswith("...")
|
||||
|
||||
def test_truncates_at_1_line_when_first_line_is_GT_max_chars(self):
|
||||
def test_truncates_at_1_line_when_first_line_is_GT_max_chars(self) -> None:
|
||||
expl = ["a" * 250 for x in range(1000)]
|
||||
result = truncate._truncate_explanation(expl, max_lines=8, max_chars=100)
|
||||
assert result != expl
|
||||
|
@ -1127,13 +1139,13 @@ class TestTruncateExplanation:
|
|||
last_line_before_trunc_msg = result[-self.LINES_IN_TRUNCATION_MSG - 1]
|
||||
assert last_line_before_trunc_msg.endswith("...")
|
||||
|
||||
def test_full_output_truncated(self, monkeypatch, testdir):
|
||||
def test_full_output_truncated(self, monkeypatch, pytester: Pytester) -> None:
|
||||
"""Test against full runpytest() output."""
|
||||
|
||||
line_count = 7
|
||||
line_len = 100
|
||||
expected_truncated_lines = 2
|
||||
testdir.makepyfile(
|
||||
pytester.makepyfile(
|
||||
r"""
|
||||
def test_many_lines():
|
||||
a = list([str(i)[0] * %d for i in range(%d)])
|
||||
|
@ -1146,7 +1158,7 @@ class TestTruncateExplanation:
|
|||
)
|
||||
monkeypatch.delenv("CI", raising=False)
|
||||
|
||||
result = testdir.runpytest()
|
||||
result = pytester.runpytest()
|
||||
# without -vv, truncate the message showing a few diff lines only
|
||||
result.stdout.fnmatch_lines(
|
||||
[
|
||||
|
@ -1157,23 +1169,23 @@ class TestTruncateExplanation:
|
|||
]
|
||||
)
|
||||
|
||||
result = testdir.runpytest("-vv")
|
||||
result = pytester.runpytest("-vv")
|
||||
result.stdout.fnmatch_lines(["* 6*"])
|
||||
|
||||
monkeypatch.setenv("CI", "1")
|
||||
result = testdir.runpytest()
|
||||
result = pytester.runpytest()
|
||||
result.stdout.fnmatch_lines(["* 6*"])
|
||||
|
||||
|
||||
def test_python25_compile_issue257(testdir):
|
||||
testdir.makepyfile(
|
||||
def test_python25_compile_issue257(pytester: Pytester) -> None:
|
||||
pytester.makepyfile(
|
||||
"""
|
||||
def test_rewritten():
|
||||
assert 1 == 2
|
||||
# some comment
|
||||
"""
|
||||
)
|
||||
result = testdir.runpytest()
|
||||
result = pytester.runpytest()
|
||||
assert result.ret == 1
|
||||
result.stdout.fnmatch_lines(
|
||||
"""
|
||||
|
@ -1183,14 +1195,14 @@ def test_python25_compile_issue257(testdir):
|
|||
)
|
||||
|
||||
|
||||
def test_rewritten(testdir):
|
||||
testdir.makepyfile(
|
||||
def test_rewritten(pytester: Pytester) -> None:
|
||||
pytester.makepyfile(
|
||||
"""
|
||||
def test_rewritten():
|
||||
assert "@py_builtins" in globals()
|
||||
"""
|
||||
)
|
||||
assert testdir.runpytest().ret == 0
|
||||
assert pytester.runpytest().ret == 0
|
||||
|
||||
|
||||
def test_reprcompare_notin() -> None:
|
||||
|
@ -1202,7 +1214,7 @@ def test_reprcompare_notin() -> None:
|
|||
]
|
||||
|
||||
|
||||
def test_reprcompare_whitespaces():
|
||||
def test_reprcompare_whitespaces() -> None:
|
||||
assert callequal("\r\n", "\n") == [
|
||||
r"'\r\n' == '\n'",
|
||||
r"Strings contain only whitespace, escaping them using repr()",
|
||||
|
@ -1212,8 +1224,8 @@ def test_reprcompare_whitespaces():
|
|||
]
|
||||
|
||||
|
||||
def test_pytest_assertrepr_compare_integration(testdir):
|
||||
testdir.makepyfile(
|
||||
def test_pytest_assertrepr_compare_integration(pytester: Pytester) -> None:
|
||||
pytester.makepyfile(
|
||||
"""
|
||||
def test_hello():
|
||||
x = set(range(100))
|
||||
|
@ -1222,7 +1234,7 @@ def test_pytest_assertrepr_compare_integration(testdir):
|
|||
assert x == y
|
||||
"""
|
||||
)
|
||||
result = testdir.runpytest()
|
||||
result = pytester.runpytest()
|
||||
result.stdout.fnmatch_lines(
|
||||
[
|
||||
"*def test_hello():*",
|
||||
|
@ -1234,8 +1246,8 @@ def test_pytest_assertrepr_compare_integration(testdir):
|
|||
)
|
||||
|
||||
|
||||
def test_sequence_comparison_uses_repr(testdir):
|
||||
testdir.makepyfile(
|
||||
def test_sequence_comparison_uses_repr(pytester: Pytester) -> None:
|
||||
pytester.makepyfile(
|
||||
"""
|
||||
def test_hello():
|
||||
x = set("hello x")
|
||||
|
@ -1243,7 +1255,7 @@ def test_sequence_comparison_uses_repr(testdir):
|
|||
assert x == y
|
||||
"""
|
||||
)
|
||||
result = testdir.runpytest()
|
||||
result = pytester.runpytest()
|
||||
result.stdout.fnmatch_lines(
|
||||
[
|
||||
"*def test_hello():*",
|
||||
|
@ -1256,19 +1268,20 @@ def test_sequence_comparison_uses_repr(testdir):
|
|||
)
|
||||
|
||||
|
||||
def test_assertrepr_loaded_per_dir(testdir):
|
||||
testdir.makepyfile(test_base=["def test_base(): assert 1 == 2"])
|
||||
a = testdir.mkdir("a")
|
||||
a_test = a.join("test_a.py")
|
||||
a_test.write("def test_a(): assert 1 == 2")
|
||||
a_conftest = a.join("conftest.py")
|
||||
a_conftest.write('def pytest_assertrepr_compare(): return ["summary a"]')
|
||||
b = testdir.mkdir("b")
|
||||
b_test = b.join("test_b.py")
|
||||
b_test.write("def test_b(): assert 1 == 2")
|
||||
b_conftest = b.join("conftest.py")
|
||||
b_conftest.write('def pytest_assertrepr_compare(): return ["summary b"]')
|
||||
result = testdir.runpytest()
|
||||
def test_assertrepr_loaded_per_dir(pytester: Pytester) -> None:
|
||||
pytester.makepyfile(test_base=["def test_base(): assert 1 == 2"])
|
||||
a = pytester.mkdir("a")
|
||||
a.joinpath("test_a.py").write_text("def test_a(): assert 1 == 2")
|
||||
a.joinpath("conftest.py").write_text(
|
||||
'def pytest_assertrepr_compare(): return ["summary a"]'
|
||||
)
|
||||
b = pytester.mkdir("b")
|
||||
b.joinpath("test_b.py").write_text("def test_b(): assert 1 == 2")
|
||||
b.joinpath("conftest.py").write_text(
|
||||
'def pytest_assertrepr_compare(): return ["summary b"]'
|
||||
)
|
||||
|
||||
result = pytester.runpytest()
|
||||
result.stdout.fnmatch_lines(
|
||||
[
|
||||
"*def test_base():*",
|
||||
|
@ -1281,34 +1294,34 @@ def test_assertrepr_loaded_per_dir(testdir):
|
|||
)
|
||||
|
||||
|
||||
def test_assertion_options(testdir):
|
||||
testdir.makepyfile(
|
||||
def test_assertion_options(pytester: Pytester) -> None:
|
||||
pytester.makepyfile(
|
||||
"""
|
||||
def test_hello():
|
||||
x = 3
|
||||
assert x == 4
|
||||
"""
|
||||
)
|
||||
result = testdir.runpytest()
|
||||
result = pytester.runpytest()
|
||||
assert "3 == 4" in result.stdout.str()
|
||||
result = testdir.runpytest_subprocess("--assert=plain")
|
||||
result = pytester.runpytest_subprocess("--assert=plain")
|
||||
result.stdout.no_fnmatch_line("*3 == 4*")
|
||||
|
||||
|
||||
def test_triple_quoted_string_issue113(testdir):
|
||||
testdir.makepyfile(
|
||||
def test_triple_quoted_string_issue113(pytester: Pytester) -> None:
|
||||
pytester.makepyfile(
|
||||
"""
|
||||
def test_hello():
|
||||
assert "" == '''
|
||||
'''"""
|
||||
)
|
||||
result = testdir.runpytest("--fulltrace")
|
||||
result = pytester.runpytest("--fulltrace")
|
||||
result.stdout.fnmatch_lines(["*1 failed*"])
|
||||
result.stdout.no_fnmatch_line("*SyntaxError*")
|
||||
|
||||
|
||||
def test_traceback_failure(testdir):
|
||||
p1 = testdir.makepyfile(
|
||||
def test_traceback_failure(pytester: Pytester) -> None:
|
||||
p1 = pytester.makepyfile(
|
||||
"""
|
||||
def g():
|
||||
return 2
|
||||
|
@ -1318,7 +1331,7 @@ def test_traceback_failure(testdir):
|
|||
f(3)
|
||||
"""
|
||||
)
|
||||
result = testdir.runpytest(p1, "--tb=long")
|
||||
result = pytester.runpytest(p1, "--tb=long")
|
||||
result.stdout.fnmatch_lines(
|
||||
[
|
||||
"*test_traceback_failure.py F*",
|
||||
|
@ -1340,7 +1353,7 @@ def test_traceback_failure(testdir):
|
|||
]
|
||||
)
|
||||
|
||||
result = testdir.runpytest(p1) # "auto"
|
||||
result = pytester.runpytest(p1) # "auto"
|
||||
result.stdout.fnmatch_lines(
|
||||
[
|
||||
"*test_traceback_failure.py F*",
|
||||
|
@ -1362,9 +1375,9 @@ def test_traceback_failure(testdir):
|
|||
)
|
||||
|
||||
|
||||
def test_exception_handling_no_traceback(testdir):
|
||||
def test_exception_handling_no_traceback(pytester: Pytester) -> None:
|
||||
"""Handle chain exceptions in tasks submitted by the multiprocess module (#1984)."""
|
||||
p1 = testdir.makepyfile(
|
||||
p1 = pytester.makepyfile(
|
||||
"""
|
||||
from multiprocessing import Pool
|
||||
|
||||
|
@ -1380,8 +1393,8 @@ def test_exception_handling_no_traceback(testdir):
|
|||
multitask_job()
|
||||
"""
|
||||
)
|
||||
testdir.syspathinsert()
|
||||
result = testdir.runpytest(p1, "--tb=long")
|
||||
pytester.syspathinsert()
|
||||
result = pytester.runpytest(p1, "--tb=long")
|
||||
result.stdout.fnmatch_lines(
|
||||
[
|
||||
"====* FAILURES *====",
|
||||
|
@ -1419,27 +1432,27 @@ def test_exception_handling_no_traceback(testdir):
|
|||
),
|
||||
],
|
||||
)
|
||||
def test_warn_missing(testdir, cmdline_args, warning_output):
|
||||
testdir.makepyfile("")
|
||||
def test_warn_missing(pytester: Pytester, cmdline_args, warning_output) -> None:
|
||||
pytester.makepyfile("")
|
||||
|
||||
result = testdir.run(sys.executable, *cmdline_args)
|
||||
result = pytester.run(sys.executable, *cmdline_args)
|
||||
result.stdout.fnmatch_lines(warning_output)
|
||||
|
||||
|
||||
def test_recursion_source_decode(testdir):
|
||||
testdir.makepyfile(
|
||||
def test_recursion_source_decode(pytester: Pytester) -> None:
|
||||
pytester.makepyfile(
|
||||
"""
|
||||
def test_something():
|
||||
pass
|
||||
"""
|
||||
)
|
||||
testdir.makeini(
|
||||
pytester.makeini(
|
||||
"""
|
||||
[pytest]
|
||||
python_files = *.py
|
||||
"""
|
||||
)
|
||||
result = testdir.runpytest("--collect-only")
|
||||
result = pytester.runpytest("--collect-only")
|
||||
result.stdout.fnmatch_lines(
|
||||
"""
|
||||
<Module*>
|
||||
|
@ -1447,15 +1460,15 @@ def test_recursion_source_decode(testdir):
|
|||
)
|
||||
|
||||
|
||||
def test_AssertionError_message(testdir):
|
||||
testdir.makepyfile(
|
||||
def test_AssertionError_message(pytester: Pytester) -> None:
|
||||
pytester.makepyfile(
|
||||
"""
|
||||
def test_hello():
|
||||
x,y = 1,2
|
||||
assert 0, (x,y)
|
||||
"""
|
||||
)
|
||||
result = testdir.runpytest()
|
||||
result = pytester.runpytest()
|
||||
result.stdout.fnmatch_lines(
|
||||
"""
|
||||
*def test_hello*
|
||||
|
@ -1465,15 +1478,15 @@ def test_AssertionError_message(testdir):
|
|||
)
|
||||
|
||||
|
||||
def test_diff_newline_at_end(testdir):
|
||||
testdir.makepyfile(
|
||||
def test_diff_newline_at_end(pytester: Pytester) -> None:
|
||||
pytester.makepyfile(
|
||||
r"""
|
||||
def test_diff():
|
||||
assert 'asdf' == 'asdf\n'
|
||||
"""
|
||||
)
|
||||
|
||||
result = testdir.runpytest()
|
||||
result = pytester.runpytest()
|
||||
result.stdout.fnmatch_lines(
|
||||
r"""
|
||||
*assert 'asdf' == 'asdf\n'
|
||||
|
@ -1485,67 +1498,67 @@ def test_diff_newline_at_end(testdir):
|
|||
|
||||
|
||||
@pytest.mark.filterwarnings("default")
|
||||
def test_assert_tuple_warning(testdir):
|
||||
def test_assert_tuple_warning(pytester: Pytester) -> None:
|
||||
msg = "assertion is always true"
|
||||
testdir.makepyfile(
|
||||
pytester.makepyfile(
|
||||
"""
|
||||
def test_tuple():
|
||||
assert(False, 'you shall not pass')
|
||||
"""
|
||||
)
|
||||
result = testdir.runpytest()
|
||||
result = pytester.runpytest()
|
||||
result.stdout.fnmatch_lines([f"*test_assert_tuple_warning.py:2:*{msg}*"])
|
||||
|
||||
# tuples with size != 2 should not trigger the warning
|
||||
testdir.makepyfile(
|
||||
pytester.makepyfile(
|
||||
"""
|
||||
def test_tuple():
|
||||
assert ()
|
||||
"""
|
||||
)
|
||||
result = testdir.runpytest()
|
||||
result = pytester.runpytest()
|
||||
assert msg not in result.stdout.str()
|
||||
|
||||
|
||||
def test_assert_indirect_tuple_no_warning(testdir):
|
||||
testdir.makepyfile(
|
||||
def test_assert_indirect_tuple_no_warning(pytester: Pytester) -> None:
|
||||
pytester.makepyfile(
|
||||
"""
|
||||
def test_tuple():
|
||||
tpl = ('foo', 'bar')
|
||||
assert tpl
|
||||
"""
|
||||
)
|
||||
result = testdir.runpytest()
|
||||
result = pytester.runpytest()
|
||||
output = "\n".join(result.stdout.lines)
|
||||
assert "WR1" not in output
|
||||
|
||||
|
||||
def test_assert_with_unicode(testdir):
|
||||
testdir.makepyfile(
|
||||
def test_assert_with_unicode(pytester: Pytester) -> None:
|
||||
pytester.makepyfile(
|
||||
"""\
|
||||
def test_unicode():
|
||||
assert '유니코드' == 'Unicode'
|
||||
"""
|
||||
)
|
||||
result = testdir.runpytest()
|
||||
result = pytester.runpytest()
|
||||
result.stdout.fnmatch_lines(["*AssertionError*"])
|
||||
|
||||
|
||||
def test_raise_unprintable_assertion_error(testdir):
|
||||
testdir.makepyfile(
|
||||
def test_raise_unprintable_assertion_error(pytester: Pytester) -> None:
|
||||
pytester.makepyfile(
|
||||
r"""
|
||||
def test_raise_assertion_error():
|
||||
raise AssertionError('\xff')
|
||||
"""
|
||||
)
|
||||
result = testdir.runpytest()
|
||||
result = pytester.runpytest()
|
||||
result.stdout.fnmatch_lines(
|
||||
[r"> raise AssertionError('\xff')", "E AssertionError: *"]
|
||||
)
|
||||
|
||||
|
||||
def test_raise_assertion_error_raisin_repr(testdir):
|
||||
testdir.makepyfile(
|
||||
def test_raise_assertion_error_raisin_repr(pytester: Pytester) -> None:
|
||||
pytester.makepyfile(
|
||||
"""
|
||||
class RaisingRepr(object):
|
||||
def __repr__(self):
|
||||
|
@ -1554,14 +1567,14 @@ def test_raise_assertion_error_raisin_repr(testdir):
|
|||
raise AssertionError(RaisingRepr())
|
||||
"""
|
||||
)
|
||||
result = testdir.runpytest()
|
||||
result = pytester.runpytest()
|
||||
result.stdout.fnmatch_lines(
|
||||
["E AssertionError: <unprintable AssertionError object>"]
|
||||
)
|
||||
|
||||
|
||||
def test_issue_1944(testdir):
|
||||
testdir.makepyfile(
|
||||
def test_issue_1944(pytester: Pytester) -> None:
|
||||
pytester.makepyfile(
|
||||
"""
|
||||
def f():
|
||||
return
|
||||
|
@ -1569,7 +1582,7 @@ def test_issue_1944(testdir):
|
|||
assert f() == 10
|
||||
"""
|
||||
)
|
||||
result = testdir.runpytest()
|
||||
result = pytester.runpytest()
|
||||
result.stdout.fnmatch_lines(["*1 error*"])
|
||||
assert (
|
||||
"AttributeError: 'Module' object has no attribute '_obj'"
|
||||
|
@ -1577,7 +1590,7 @@ def test_issue_1944(testdir):
|
|||
)
|
||||
|
||||
|
||||
def test_exit_from_assertrepr_compare(monkeypatch):
|
||||
def test_exit_from_assertrepr_compare(monkeypatch) -> None:
|
||||
def raise_exit(obj):
|
||||
outcomes.exit("Quitting debugger")
|
||||
|
||||
|
@ -1587,16 +1600,16 @@ def test_exit_from_assertrepr_compare(monkeypatch):
|
|||
callequal(1, 1)
|
||||
|
||||
|
||||
def test_assertion_location_with_coverage(testdir):
|
||||
def test_assertion_location_with_coverage(pytester: Pytester) -> None:
|
||||
"""This used to report the wrong location when run with coverage (#5754)."""
|
||||
p = testdir.makepyfile(
|
||||
p = pytester.makepyfile(
|
||||
"""
|
||||
def test():
|
||||
assert False, 1
|
||||
assert False, 2
|
||||
"""
|
||||
)
|
||||
result = testdir.runpytest(str(p))
|
||||
result = pytester.runpytest(str(p))
|
||||
result.stdout.fnmatch_lines(
|
||||
[
|
||||
"> assert False, 1",
|
||||
|
|
Loading…
Reference in New Issue