|
3 | 3 |
|
4 | 4 | import pytest
|
5 | 5 |
|
| 6 | +import pytest_twisted |
| 7 | + |
| 8 | + |
| 9 | +ASYNC_AWAIT = sys.version_info >= (3, 5) |
| 10 | + |
6 | 11 |
|
7 | 12 | def assert_outcomes(run_result, outcomes):
|
8 | 13 | formatted_output = format_run_result_output_for_assert(run_result)
|
@@ -35,6 +40,13 @@ def skip_if_reactor_not(request, expected_reactor):
|
35 | 40 | pytest.skip("reactor is {} not {}".format(actual_reactor, expected_reactor))
|
36 | 41 |
|
37 | 42 |
|
| 43 | +def skip_if_no_async_await(): |
| 44 | + return pytest.mark.skipif( |
| 45 | + not ASYNC_AWAIT, |
| 46 | + reason="async/await syntax not supported on Python <3.5", |
| 47 | + ) |
| 48 | + |
| 49 | + |
38 | 50 | @pytest.fixture
|
39 | 51 | def cmd_opts(request):
|
40 | 52 | reactor = request.config.getoption("reactor", "default")
|
@@ -126,6 +138,28 @@ def test_succeed(foo):
|
126 | 138 | assert_outcomes(rr, {"passed": 2, "failed": 1})
|
127 | 139 |
|
128 | 140 |
|
| 141 | +@skip_if_no_async_await() |
| 142 | +def test_async_await(testdir, cmd_opts): |
| 143 | + test_file = """ |
| 144 | + from twisted.internet import reactor, defer |
| 145 | + import pytest |
| 146 | + import pytest_twisted |
| 147 | +
|
| 148 | + @pytest.fixture(scope="module", params=["fs", "imap", "web"]) |
| 149 | + def foo(request): |
| 150 | + return request.param |
| 151 | +
|
| 152 | + @pytest_twisted.ensureDeferred |
| 153 | + async def test_succeed(foo): |
| 154 | + await defer.succeed(foo) |
| 155 | + if foo == "web": |
| 156 | + raise RuntimeError("baz") |
| 157 | + """ |
| 158 | + testdir.makepyfile(test_file) |
| 159 | + rr = testdir.run(sys.executable, "-m", "pytest", "-v", *cmd_opts) |
| 160 | + assert_outcomes(rr, {"passed": 2, "failed": 1}) |
| 161 | + |
| 162 | + |
129 | 163 | def test_twisted_greenlet(testdir, cmd_opts):
|
130 | 164 | test_file = """
|
131 | 165 | import pytest, greenlet
|
@@ -171,6 +205,32 @@ def test_succeed(foo):
|
171 | 205 | assert_outcomes(rr, {"passed": 2, "failed": 1})
|
172 | 206 |
|
173 | 207 |
|
| 208 | +@skip_if_no_async_await() |
| 209 | +def test_blockon_in_fixture_async(testdir, cmd_opts): |
| 210 | + test_file = """ |
| 211 | + from twisted.internet import reactor, defer |
| 212 | + import pytest |
| 213 | + import pytest_twisted |
| 214 | +
|
| 215 | + @pytest.fixture(scope="module", params=["fs", "imap", "web"]) |
| 216 | + def foo(request): |
| 217 | + d1, d2 = defer.Deferred(), defer.Deferred() |
| 218 | + reactor.callLater(0.01, d1.callback, 1) |
| 219 | + reactor.callLater(0.02, d2.callback, request.param) |
| 220 | + pytest_twisted.blockon(d1) |
| 221 | + return d2 |
| 222 | +
|
| 223 | + @pytest_twisted.ensureDeferred |
| 224 | + async def test_succeed(foo): |
| 225 | + x = await foo |
| 226 | + if x == "web": |
| 227 | + raise RuntimeError("baz") |
| 228 | + """ |
| 229 | + testdir.makepyfile(test_file) |
| 230 | + rr = testdir.run(sys.executable, "-m", "pytest", "-v", *cmd_opts) |
| 231 | + assert_outcomes(rr, {"passed": 2, "failed": 1}) |
| 232 | + |
| 233 | + |
174 | 234 | def test_blockon_in_hook(testdir, cmd_opts, request):
|
175 | 235 | skip_if_reactor_not(request, "default")
|
176 | 236 | conftest_file = """
|
|
0 commit comments