Skip to content

Commit e86bc76

Browse files
committed
Merge branch 'release/0.2.1'
2 parents 7d3cc93 + 1c3717e commit e86bc76

File tree

6 files changed

+77
-1
lines changed

6 files changed

+77
-1
lines changed

README.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,3 +314,35 @@ async def my_handler(var: str = Depends(Path())):
314314
return web.json_response({"var": var})
315315

316316
```
317+
318+
319+
## Overridiing dependencies
320+
321+
Sometimes for tests you don't want to calculate actual functions
322+
and you want to pass another functions instead.
323+
324+
To do so, you can add "dependency_overrides" key to the aplication.
325+
It's a dict that is passed as additional context to dependency resolvers.
326+
327+
Here's an example.
328+
329+
```python
330+
def original_dep() -> int:
331+
return 1
332+
333+
class MyView(View):
334+
async def get(self, num: int = Depends(original_dep)):
335+
"""Nothing."""
336+
return web.json_response({"request": num})
337+
```
338+
339+
Imagine you have a handler that depends on some function,
340+
but instead of `1` you want to have `2` in your tests.
341+
342+
To do it, jsut add `dependency_overrides` somewhere,
343+
where you create your application. And make sure that keys
344+
of that dict are actual function that are being replaced.
345+
346+
```python
347+
my_app["dependency_overrides"] = {original_dep: 2}
348+
```

aiohttp_deps/initializer.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ async def __call__(self, request: web.Request) -> web.StreamResponse:
4444
{
4545
web.Request: request,
4646
web.Application: request.app,
47+
**request.app.get("dependency_overrides", {}),
4748
},
4849
) as resolver:
4950
return await self.original_handler(**(await resolver.resolve_kwargs()))

aiohttp_deps/view.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ async def _iter(self) -> StreamResponse:
4343
{
4444
web.Request: self.request,
4545
web.Application: self.request.app,
46+
**self.request.app.get("dependency_overrides", {}),
4647
},
4748
) as ctx:
4849
return await method(**(await ctx.resolve_kwargs())) # type: ignore

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name = "aiohttp-deps"
33
description = "Dependency injection for AioHTTP"
44
authors = ["Taskiq team <taskiq@no-reply.com>"]
55
maintainers = ["Taskiq team <taskiq@no-reply.com>"]
6-
version = "0.2.0"
6+
version = "0.2.1"
77
readme = "README.md"
88
license = "LICENSE"
99
classifiers = [

tests/test_func_dependencies.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,23 @@ async def handler(app: web.Application = Depends()):
3535
resp = await client.get("/")
3636
assert resp.status == 200
3737
assert "Application" in (await resp.json())["request"]
38+
39+
40+
@pytest.mark.anyio
41+
async def test_dependency_override(
42+
my_app: web.Application,
43+
aiohttp_client: ClientGenerator,
44+
):
45+
def original_dep() -> int:
46+
return 1
47+
48+
async def handler(num: int = Depends(original_dep)):
49+
return web.json_response({"request": num})
50+
51+
my_app.router.add_get("/", handler)
52+
my_app["dependency_overrides"] = {original_dep: 2}
53+
54+
client = await aiohttp_client(my_app)
55+
resp = await client.get("/")
56+
assert resp.status == 200
57+
assert (await resp.json())["request"] == 2

tests/test_view_dependencies.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,25 @@ async def get(self):
5353
client = await aiohttp_client(my_app)
5454
resp = await client.delete("/")
5555
assert resp.status == 405
56+
57+
58+
@pytest.mark.anyio
59+
async def test_dependency_override(
60+
my_app: web.Application,
61+
aiohttp_client: ClientGenerator,
62+
):
63+
def original_dep() -> int:
64+
return 1
65+
66+
class MyView(View):
67+
async def get(self, num: int = Depends(original_dep)):
68+
"""Nothing."""
69+
return web.json_response({"request": num})
70+
71+
my_app.router.add_view("/", MyView)
72+
my_app["dependency_overrides"] = {original_dep: 2}
73+
74+
client = await aiohttp_client(my_app)
75+
resp = await client.get("/")
76+
assert resp.status == 200
77+
assert (await resp.json())["request"] == 2

0 commit comments

Comments
 (0)