Skip to content

Commit bae1d1e

Browse files
committed
[feat] Detect multiple higher-scoped event loops requested in the same test.
Previously, the detection was limited to a function-scoped loop and a higher-scoped loop. Signed-off-by: Michael Seifert <[email protected]>
1 parent 8095cde commit bae1d1e

File tree

2 files changed

+18
-3
lines changed

2 files changed

+18
-3
lines changed

pytest_asyncio/plugin.py

+13-1
Original file line numberDiff line numberDiff line change
@@ -731,7 +731,19 @@ def pytest_generate_tests(metafunc: Metafunc) -> None:
731731
event_loop_fixture_id = event_loop_node.stash.get(_event_loop_fixture_id, None)
732732

733733
if event_loop_fixture_id:
734-
if "event_loop" in metafunc.fixturenames:
734+
collectors = _iter_collectors(metafunc.definition)
735+
collector_event_loop_fixture_ids = map(
736+
lambda c: c.stash.get(_event_loop_fixture_id, None), # type: ignore
737+
collectors,
738+
)
739+
possible_event_loop_fixture_ids = {"event_loop"} | set(
740+
collector_event_loop_fixture_ids
741+
)
742+
used_fixture_ids = {event_loop_fixture_id, *metafunc.fixturenames}
743+
used_event_loop_fixture_ids = possible_event_loop_fixture_ids.intersection(
744+
used_fixture_ids
745+
)
746+
if len(used_event_loop_fixture_ids) > 1:
735747
raise MultipleEventLoopsRequestedError(
736748
_MULTIPLE_LOOPS_REQUESTED_ERROR.format(
737749
test_name=metafunc.definition.nodeid,

tests/async_fixtures/test_autouse_fixtures.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,24 @@
11
from textwrap import dedent
22

3+
import pytest
34
from pytest import Pytester
45

56

7+
@pytest.mark.parametrize("autouse_fixture_scope", ("function", "module"))
68
def test_autouse_fixture_in_different_scope_triggers_multiple_event_loop_error(
79
pytester: Pytester,
10+
autouse_fixture_scope: str,
811
):
912
pytester.makepyfile(
1013
dedent(
11-
"""\
14+
f"""\
1215
import asyncio
1316
import pytest
1417
import pytest_asyncio
1518
1619
loop: asyncio.AbstractEventLoop
1720
18-
@pytest_asyncio.fixture(autouse=True)
21+
@pytest_asyncio.fixture(autouse=True, scope="{autouse_fixture_scope}")
1922
async def autouse_fixture():
2023
pass
2124

0 commit comments

Comments
 (0)