diff --git a/pyproject.toml b/pyproject.toml index 9a06ec21..27dae05d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,6 +31,8 @@ classifiers = [ dependencies = [ 'exceptiongroup>=1.1.3; python_version<"3.11"', ] +[project.entry-points.pytest11] +dishka = "dishka.integrations.pytest" [project.urls] "Source" = "https://github.com/reagento/dishka" diff --git a/src/dishka/integrations/pytest.py b/src/dishka/integrations/pytest.py new file mode 100644 index 00000000..3666bdd0 --- /dev/null +++ b/src/dishka/integrations/pytest.py @@ -0,0 +1,32 @@ +from inspect import Parameter +from typing import Any + +import pytest + +from dishka import Container +from .base import wrap_injection + +CONTAINER_NAME = "dishka_container" + + +def dishka_fixture(name: str, cls: Any): + def temp_fixture(dishka_container): + return dishka_container.get(cls) + + temp_fixture.__name__ = name + return pytest.fixture(temp_fixture) + + +def inject(func): + additional_params = [Parameter( + name=CONTAINER_NAME, + annotation=Container, + kind=Parameter.KEYWORD_ONLY, + )] + return wrap_injection( + func=func, + remove_depends=True, + container_getter=lambda _, p: p[CONTAINER_NAME], + additional_params=additional_params, + is_async=False, + ) diff --git a/tests/integrations/pytest/__init__.py b/tests/integrations/pytest/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/integrations/pytest/test_pytest.py b/tests/integrations/pytest/test_pytest.py new file mode 100644 index 00000000..d4e5b9f2 --- /dev/null +++ b/tests/integrations/pytest/test_pytest.py @@ -0,0 +1,35 @@ +import pytest + +from dishka import FromDishka, Provider, Scope, make_container +from dishka.integrations.pytest import dishka_fixture, inject + + +@pytest.fixture(scope="session") +def dishka_container(): + provider = Provider(scope=Scope.APP) + provider.provide(source=lambda: 42, provides=int) + container = make_container(provider) + yield container + container.close() + + +@inject +def test_inject_test(value: FromDishka[int]) -> None: + assert value == 42 + + +@pytest.fixture() +@inject +def some_fixture(value: FromDishka[int]): + return value + + +def test_inject_fixture(some_fixture) -> None: + assert some_fixture == 42 + + +explicit_fixture = dishka_fixture("explicit_fixture", int) + + +def test_explicit_fixture(explicit_fixture) -> None: + assert explicit_fixture == 42