Merge pull request #7970 from cmecklenborg/pytester_refactor_test_assertion
Migrate test_assertion.py from testdir to pytester
This commit is contained in:
		
						commit
						0cd190f037
					
				| 
						 | 
				
			
			@ -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