From 8092421727e8b6c3f5d61ea12c9c627f301e24d3 Mon Sep 17 00:00:00 2001 From: Roman Mogylatov Date: Wed, 18 Nov 2020 11:13:31 -0500 Subject: [PATCH] Add simple FastAPI example --- docs/main/changelog.rst | 4 +++ .../fastapi-simple/fastapi_di_example.py | 29 +++++++++++++++++++ examples/miniapps/fastapi-simple/tests.py | 25 ++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 examples/miniapps/fastapi-simple/fastapi_di_example.py create mode 100644 examples/miniapps/fastapi-simple/tests.py diff --git a/docs/main/changelog.rst b/docs/main/changelog.rst index c74a981d..5a0ba594 100644 --- a/docs/main/changelog.rst +++ b/docs/main/changelog.rst @@ -7,6 +7,10 @@ that were made in every particular version. From version 0.7.6 *Dependency Injector* framework strictly follows `Semantic versioning`_ +Develop +------- +- Add simple ``FastAPI`` example. + 4.4.1 ----- - Improve ``FastAPI`` integration: handle ``Depends(Provide[...])``. diff --git a/examples/miniapps/fastapi-simple/fastapi_di_example.py b/examples/miniapps/fastapi-simple/fastapi_di_example.py new file mode 100644 index 00000000..d6c3b1f1 --- /dev/null +++ b/examples/miniapps/fastapi-simple/fastapi_di_example.py @@ -0,0 +1,29 @@ +import sys + +from fastapi import FastAPI, Depends +from dependency_injector import containers, providers +from dependency_injector.wiring import inject, Provide + + +class Service: + async def process(self) -> str: + return 'Ok' + + +class Container(containers.DeclarativeContainer): + + service = providers.Factory(Service) + + +app = FastAPI() + + +@app.api_route('/') +@inject +async def index(service: Service = Depends(Provide[Container.service])): + result = await service.process() + return {'result': result} + + +container = Container() +container.wire(modules=[sys.modules[__name__]]) diff --git a/examples/miniapps/fastapi-simple/tests.py b/examples/miniapps/fastapi-simple/tests.py new file mode 100644 index 00000000..dc4f6203 --- /dev/null +++ b/examples/miniapps/fastapi-simple/tests.py @@ -0,0 +1,25 @@ +from unittest import mock + +import pytest +from httpx import AsyncClient + +from fastapi_di_example import app, container, Service + + +@pytest.fixture +def client(event_loop): + client = AsyncClient(app=app, base_url='http://test') + yield client + event_loop.run_until_complete(client.aclose()) + + +@pytest.mark.asyncio +async def test_index(client): + service_mock = mock.AsyncMock(spec=Service) + service_mock.process.return_value = 'Foo' + + with container.service.override(service_mock): + response = await client.get('/') + + assert response.status_code == 200 + assert response.json() == {'result': 'Foo'}