From df930155a25b84d2fb0b50d92fd5943d90987a24 Mon Sep 17 00:00:00 2001 From: Colin Dunklau Date: Sat, 29 Feb 2020 12:52:07 +0100 Subject: [PATCH 1/3] Show dependent async fixture failures --- testing/test_basic.py | 82 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/testing/test_basic.py b/testing/test_basic.py index 9afbc4c..43a8b48 100755 --- a/testing/test_basic.py +++ b/testing/test_basic.py @@ -494,6 +494,88 @@ def test_second(foo): assert_outcomes(rr, {"passed": 2}) +@skip_if_no_async_await() +def test_async_fixture_in_fixture(testdir, cmd_opts): + test_file = """ + import itertools + from twisted.internet import reactor, defer + import pytest + import pytest_twisted + + @pytest_twisted.async_fixture(name='increment') + async def fixture_increment(): + counts = itertools.count() + async def increment(): + return next(counts) + + return increment + + @pytest_twisted.async_fixture(name='doubleincrement') + async def fixture_doubleincrement(increment): + async def doubleincrement(): + n = await increment() + return n * 2 + + return doubleincrement + + @pytest_twisted.ensureDeferred + async def test_increment(increment): + first = await increment() + second = await increment() + assert (first, second) == (0, 1) + + @pytest_twisted.ensureDeferred + async def test_doubleincrement(doubleincrement): + first = await doubleincrement() + second = await doubleincrement() + assert (first, second) == (0, 2) + """ + testdir.makepyfile(test_file) + rr = testdir.run(sys.executable, "-m", "pytest", "-v", *cmd_opts) + assert_outcomes(rr, {"passed": 2}) + + +@skip_if_no_async_generators() +def test_async_yield_fixture_in_fixture(testdir, cmd_opts): + test_file = """ + import itertools + from twisted.internet import reactor, defer + import pytest + import pytest_twisted + + @pytest_twisted.async_yield_fixture(name='increment') + async def fixture_increment(): + counts = itertools.count() + async def increment(): + return next(counts) + + yield increment + + @pytest_twisted.async_yield_fixture(name='doubleincrement') + async def fixture_doubleincrement(increment): + async def doubleincrement(): + n = await increment() + return n * 2 + + yield doubleincrement + + @pytest_twisted.ensureDeferred + async def test_increment(increment): + first = await increment() + second = await increment() + assert (first, second) == (0, 1) + + @pytest_twisted.ensureDeferred + async def test_doubleincrement(doubleincrement): + first = await doubleincrement() + second = await doubleincrement() + assert (first, second) == (0, 2) + """ + testdir.makepyfile(test_file) + rr = testdir.run(sys.executable, "-m", "pytest", "-v", *cmd_opts) + assert_outcomes(rr, {"passed": 2}) + + def test_blockon_in_hook(testdir, cmd_opts, request): skip_if_reactor_not(request, "default") conftest_file = """ From 61acd1aa4f2e5189180e6fc90fbbf949884babd3 Mon Sep 17 00:00:00 2001 From: Colin Dunklau Date: Sat, 29 Feb 2020 13:06:08 +0100 Subject: [PATCH 2/3] Also test with normal fixture-produced functions --- testing/test_basic.py | 48 +++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/testing/test_basic.py b/testing/test_basic.py index 43a8b48..635ee6c 100755 --- a/testing/test_basic.py +++ b/testing/test_basic.py @@ -495,7 +495,13 @@ def test_second(foo): @skip_if_no_async_await() -def test_async_fixture_in_fixture(testdir, cmd_opts): +@pytest.mark.parametrize('innerasync', [ + pytest.param(truth, id='innerasync={}'.format(truth)) + for truth in [True, False] +]) +def test_async_fixture_in_fixture(testdir, cmd_opts, innerasync): + maybe_async = 'async ' if innerasync else '' + maybe_await = 'await ' if innerasync else '' test_file = """ import itertools from twisted.internet import reactor, defer @@ -505,38 +511,44 @@ def test_async_fixture_in_fixture(testdir, cmd_opts): @pytest_twisted.async_fixture(name='increment') async def fixture_increment(): counts = itertools.count() - async def increment(): + {maybe_async}def increment(): return next(counts) return increment @pytest_twisted.async_fixture(name='doubleincrement') async def fixture_doubleincrement(increment): - async def doubleincrement(): - n = await increment() + {maybe_async}def doubleincrement(): + n = {maybe_await}increment() return n * 2 return doubleincrement @pytest_twisted.ensureDeferred async def test_increment(increment): - first = await increment() - second = await increment() + first = {maybe_await}increment() + second = {maybe_await}increment() assert (first, second) == (0, 1) @pytest_twisted.ensureDeferred async def test_doubleincrement(doubleincrement): - first = await doubleincrement() - second = await doubleincrement() + first = {maybe_await}doubleincrement() + second = {maybe_await}doubleincrement() assert (first, second) == (0, 2) - """ + """.format(maybe_async=maybe_async, maybe_await=maybe_await) testdir.makepyfile(test_file) rr = testdir.run(sys.executable, "-m", "pytest", "-v", *cmd_opts) assert_outcomes(rr, {"passed": 2}) @skip_if_no_async_generators() -def test_async_yield_fixture_in_fixture(testdir, cmd_opts): +@pytest.mark.parametrize('innerasync', [ + pytest.param(truth, id='innerasync={}'.format(truth)) + for truth in [True, False] +]) +def test_async_yield_fixture_in_fixture(testdir, cmd_opts, innerasync): + maybe_async = 'async ' if innerasync else '' + maybe_await = 'await ' if innerasync else '' test_file = """ import itertools from twisted.internet import reactor, defer @@ -546,31 +558,31 @@ def test_async_yield_fixture_in_fixture(testdir, cmd_opts): @pytest_twisted.async_yield_fixture(name='increment') async def fixture_increment(): counts = itertools.count() - async def increment(): + {maybe_async}def increment(): return next(counts) yield increment @pytest_twisted.async_yield_fixture(name='doubleincrement') async def fixture_doubleincrement(increment): - async def doubleincrement(): - n = await increment() + {maybe_async}def doubleincrement(): + n = {maybe_await}increment() return n * 2 yield doubleincrement @pytest_twisted.ensureDeferred async def test_increment(increment): - first = await increment() - second = await increment() + first = {maybe_await}increment() + second = {maybe_await}increment() assert (first, second) == (0, 1) @pytest_twisted.ensureDeferred async def test_doubleincrement(doubleincrement): - first = await doubleincrement() - second = await doubleincrement() + first = {maybe_await}doubleincrement() + second = {maybe_await}doubleincrement() assert (first, second) == (0, 2) - """ + """.format(maybe_async=maybe_async, maybe_await=maybe_await) testdir.makepyfile(test_file) rr = testdir.run(sys.executable, "-m", "pytest", "-v", *cmd_opts) assert_outcomes(rr, {"passed": 2}) From bf0338fe9be1039a31ffc00bf0ac09c9715f63f5 Mon Sep 17 00:00:00 2001 From: Colin Dunklau Date: Sun, 1 Mar 2020 17:47:48 +0100 Subject: [PATCH 3/3] Add simpler tests that still reproduce the issue --- testing/test_basic.py | 58 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/testing/test_basic.py b/testing/test_basic.py index 635ee6c..2b1decd 100755 --- a/testing/test_basic.py +++ b/testing/test_basic.py @@ -494,6 +494,64 @@ def test_second(foo): assert_outcomes(rr, {"passed": 2}) +@skip_if_no_async_await() +def test_async_simple_fixture_in_fixture(testdir, cmd_opts): + test_file = """ + import itertools + from twisted.internet import reactor, defer + import pytest + import pytest_twisted + + @pytest_twisted.async_fixture(name='four') + async def fixture_four(): + return 4 + + @pytest_twisted.async_fixture(name='doublefour') + async def fixture_doublefour(four): + return 2 * four + + @pytest_twisted.ensureDeferred + async def test_four(four): + assert four == 4 + + @pytest_twisted.ensureDeferred + async def test_doublefour(doublefour): + assert doublefour == 8 + """ + testdir.makepyfile(test_file) + rr = testdir.run(sys.executable, "-m", "pytest", "-v", *cmd_opts) + assert_outcomes(rr, {"passed": 2}) + + +@skip_if_no_async_generators() +def test_async_yield_simple_fixture_in_fixture(testdir, cmd_opts): + test_file = """ + import itertools + from twisted.internet import reactor, defer + import pytest + import pytest_twisted + + @pytest_twisted.async_yield_fixture(name='four') + async def fixture_four(): + yield 4 + + @pytest_twisted.async_yield_fixture(name='doublefour') + async def fixture_doublefour(four): + yield 2 * four + + @pytest_twisted.ensureDeferred + async def test_four(four): + assert four == 4 + + @pytest_twisted.ensureDeferred + async def test_doublefour(doublefour): + assert doublefour == 8 + """ + testdir.makepyfile(test_file) + rr = testdir.run(sys.executable, "-m", "pytest", "-v", *cmd_opts) + assert_outcomes(rr, {"passed": 2}) + + @skip_if_no_async_await() @pytest.mark.parametrize('innerasync', [ pytest.param(truth, id='innerasync={}'.format(truth))