From c58abf7ad18c56ca516c50780cd726eff3c4f44c Mon Sep 17 00:00:00 2001
From: symonk <jackofspaces@gmail.com>
Date: Fri, 30 Oct 2020 19:21:42 +0000
Subject: [PATCH] #7942 refactor stepwise tests to utilize pytester

---
 testing/test_stepwise.py | 79 +++++++++++++++++++++-------------------
 1 file changed, 41 insertions(+), 38 deletions(-)

diff --git a/testing/test_stepwise.py b/testing/test_stepwise.py
index bf8d94f1d..ff2ec16b7 100644
--- a/testing/test_stepwise.py
+++ b/testing/test_stepwise.py
@@ -1,11 +1,13 @@
 import pytest
+from _pytest.monkeypatch import MonkeyPatch
+from _pytest.pytester import Pytester
 
 
 @pytest.fixture
-def stepwise_testdir(testdir):
+def stepwise_pytester(pytester: Pytester) -> Pytester:
     # Rather than having to modify our testfile between tests, we introduce
     # a flag for whether or not the second test should fail.
-    testdir.makeconftest(
+    pytester.makeconftest(
         """
 def pytest_addoption(parser):
     group = parser.getgroup('general')
@@ -15,7 +17,7 @@ def pytest_addoption(parser):
     )
 
     # Create a simple test suite.
-    testdir.makepyfile(
+    pytester.makepyfile(
         test_a="""
 def test_success_before_fail():
     assert 1
@@ -34,7 +36,7 @@ def test_success_after_last_fail():
 """
     )
 
-    testdir.makepyfile(
+    pytester.makepyfile(
         test_b="""
 def test_success():
     assert 1
@@ -42,19 +44,19 @@ def test_success():
     )
 
     # customize cache directory so we don't use the tox's cache directory, which makes tests in this module flaky
-    testdir.makeini(
+    pytester.makeini(
         """
         [pytest]
         cache_dir = .cache
     """
     )
 
-    return testdir
+    return pytester
 
 
 @pytest.fixture
-def error_testdir(testdir):
-    testdir.makepyfile(
+def error_pytester(pytester: Pytester) -> Pytester:
+    pytester.makepyfile(
         test_a="""
 def test_error(nonexisting_fixture):
     assert 1
@@ -64,15 +66,15 @@ def test_success_after_fail():
 """
     )
 
-    return testdir
+    return pytester
 
 
 @pytest.fixture
-def broken_testdir(testdir):
-    testdir.makepyfile(
+def broken_pytester(pytester: Pytester) -> Pytester:
+    pytester.makepyfile(
         working_testfile="def test_proper(): assert 1", broken_testfile="foobar"
     )
-    return testdir
+    return pytester
 
 
 def _strip_resource_warnings(lines):
@@ -85,16 +87,15 @@ def _strip_resource_warnings(lines):
     ]
 
 
-def test_run_without_stepwise(stepwise_testdir):
-    result = stepwise_testdir.runpytest("-v", "--strict-markers", "--fail")
-
+def test_run_without_stepwise(stepwise_pytester: Pytester) -> None:
+    result = stepwise_pytester.runpytest("-v", "--strict-markers", "--fail")
     result.stdout.fnmatch_lines(["*test_success_before_fail PASSED*"])
     result.stdout.fnmatch_lines(["*test_fail_on_flag FAILED*"])
     result.stdout.fnmatch_lines(["*test_success_after_fail PASSED*"])
 
 
-def test_stepwise_output_summary(testdir):
-    testdir.makepyfile(
+def test_stepwise_output_summary(pytester: Pytester) -> None:
+    pytester.makepyfile(
         """
         import pytest
         @pytest.mark.parametrize("expected", [True, True, True, True, False])
@@ -102,17 +103,17 @@ def test_stepwise_output_summary(testdir):
             assert expected
         """
     )
-    result = testdir.runpytest("-v", "--stepwise")
+    result = pytester.runpytest("-v", "--stepwise")
     result.stdout.fnmatch_lines(["stepwise: no previously failed tests, not skipping."])
-    result = testdir.runpytest("-v", "--stepwise")
+    result = pytester.runpytest("-v", "--stepwise")
     result.stdout.fnmatch_lines(
         ["stepwise: skipping 4 already passed items.", "*1 failed, 4 deselected*"]
     )
 
 
-def test_fail_and_continue_with_stepwise(stepwise_testdir):
+def test_fail_and_continue_with_stepwise(stepwise_pytester: Pytester) -> None:
     # Run the tests with a failing second test.
-    result = stepwise_testdir.runpytest(
+    result = stepwise_pytester.runpytest(
         "-v", "--strict-markers", "--stepwise", "--fail"
     )
     assert _strip_resource_warnings(result.stderr.lines) == []
@@ -124,7 +125,7 @@ def test_fail_and_continue_with_stepwise(stepwise_testdir):
     assert "test_success_after_fail" not in stdout
 
     # "Fix" the test that failed in the last run and run it again.
-    result = stepwise_testdir.runpytest("-v", "--strict-markers", "--stepwise")
+    result = stepwise_pytester.runpytest("-v", "--strict-markers", "--stepwise")
     assert _strip_resource_warnings(result.stderr.lines) == []
 
     stdout = result.stdout.str()
@@ -135,8 +136,8 @@ def test_fail_and_continue_with_stepwise(stepwise_testdir):
 
 
 @pytest.mark.parametrize("stepwise_skip", ["--stepwise-skip", "--sw-skip"])
-def test_run_with_skip_option(stepwise_testdir, stepwise_skip):
-    result = stepwise_testdir.runpytest(
+def test_run_with_skip_option(stepwise_pytester: Pytester, stepwise_skip: str) -> None:
+    result = stepwise_pytester.runpytest(
         "-v", "--strict-markers", "--stepwise", stepwise_skip, "--fail", "--fail-last",
     )
     assert _strip_resource_warnings(result.stderr.lines) == []
@@ -149,8 +150,8 @@ def test_run_with_skip_option(stepwise_testdir, stepwise_skip):
     assert "test_success_after_last_fail" not in stdout
 
 
-def test_fail_on_errors(error_testdir):
-    result = error_testdir.runpytest("-v", "--strict-markers", "--stepwise")
+def test_fail_on_errors(error_pytester: Pytester) -> None:
+    result = error_pytester.runpytest("-v", "--strict-markers", "--stepwise")
 
     assert _strip_resource_warnings(result.stderr.lines) == []
     stdout = result.stdout.str()
@@ -159,8 +160,8 @@ def test_fail_on_errors(error_testdir):
     assert "test_success_after_fail" not in stdout
 
 
-def test_change_testfile(stepwise_testdir):
-    result = stepwise_testdir.runpytest(
+def test_change_testfile(stepwise_pytester: Pytester) -> None:
+    result = stepwise_pytester.runpytest(
         "-v", "--strict-markers", "--stepwise", "--fail", "test_a.py"
     )
     assert _strip_resource_warnings(result.stderr.lines) == []
@@ -170,7 +171,7 @@ def test_change_testfile(stepwise_testdir):
 
     # Make sure the second test run starts from the beginning, since the
     # test to continue from does not exist in testfile_b.
-    result = stepwise_testdir.runpytest(
+    result = stepwise_pytester.runpytest(
         "-v", "--strict-markers", "--stepwise", "test_b.py"
     )
     assert _strip_resource_warnings(result.stderr.lines) == []
@@ -180,17 +181,19 @@ def test_change_testfile(stepwise_testdir):
 
 
 @pytest.mark.parametrize("broken_first", [True, False])
-def test_stop_on_collection_errors(broken_testdir, broken_first):
+def test_stop_on_collection_errors(
+    broken_pytester: Pytester, broken_first: bool
+) -> None:
     """Stop during collection errors. Broken test first or broken test last
     actually surfaced a bug (#5444), so we test both situations."""
     files = ["working_testfile.py", "broken_testfile.py"]
     if broken_first:
         files.reverse()
-    result = broken_testdir.runpytest("-v", "--strict-markers", "--stepwise", *files)
+    result = broken_pytester.runpytest("-v", "--strict-markers", "--stepwise", *files)
     result.stdout.fnmatch_lines("*error during collection*")
 
 
-def test_xfail_handling(testdir, monkeypatch):
+def test_xfail_handling(pytester: Pytester, monkeypatch: MonkeyPatch) -> None:
     """Ensure normal xfail is ignored, and strict xfail interrupts the session in sw mode
 
     (#5547)
@@ -207,8 +210,8 @@ def test_xfail_handling(testdir, monkeypatch):
         def test_c(): pass
         def test_d(): pass
     """
-    testdir.makepyfile(contents.format(assert_value="0", strict="False"))
-    result = testdir.runpytest("--sw", "-v")
+    pytester.makepyfile(contents.format(assert_value="0", strict="False"))
+    result = pytester.runpytest("--sw", "-v")
     result.stdout.fnmatch_lines(
         [
             "*::test_a PASSED *",
@@ -219,8 +222,8 @@ def test_xfail_handling(testdir, monkeypatch):
         ]
     )
 
-    testdir.makepyfile(contents.format(assert_value="1", strict="True"))
-    result = testdir.runpytest("--sw", "-v")
+    pytester.makepyfile(contents.format(assert_value="1", strict="True"))
+    result = pytester.runpytest("--sw", "-v")
     result.stdout.fnmatch_lines(
         [
             "*::test_a PASSED *",
@@ -230,8 +233,8 @@ def test_xfail_handling(testdir, monkeypatch):
         ]
     )
 
-    testdir.makepyfile(contents.format(assert_value="0", strict="True"))
-    result = testdir.runpytest("--sw", "-v")
+    pytester.makepyfile(contents.format(assert_value="0", strict="True"))
+    result = pytester.runpytest("--sw", "-v")
     result.stdout.fnmatch_lines(
         [
             "*::test_b XFAIL *",