Coverage for tests/async/test_depends.py: 100%
378 statements
« prev ^ index » next coverage.py v7.17.3, created at 2026-11-13 05:19 +0000
« prev ^ index » next coverage.py v7.17.3, created at 2026-11-13 05:19 +0000
1import logging 1abcdefghijklmnopqrst
2from collections.abc import AsyncGenerator 1abcdefghijklmnopqrst
3from contextlib import asynccontextmanager 1abcdefghijklmnopqrst
4from dataclasses import dataclass 1abcdefghijklmnopqrst
5from functools import partial 1abcdefghijklmnopqrst
6from typing import Annotated 1abcdefghijklmnopqrst
7from unittest.mock import Mock 1abcdefghijklmnopqrst
9import pytest 1abcdefghijklmnopqrst
11from fast_depends import Depends, inject 1abcdefghijklmnopqrst
12from fast_depends.exceptions import ValidationError 1abcdefghijklmnopqrst
13from tests.marks import serializer 1abcdefghijklmnopqrst
16@pytest.mark.anyio 1abcdefghijklmnopqrst
17async def test_depends() -> None: 1abcdefghijklmnopqrst
18 async def dep_func(b, a=3): 1abcdefghijklmnopqrst
19 return a + b 1abcdefghijklmnopqrst
21 @inject 1abcdefghijklmnopqrst
22 async def some_func(b: int, c=Depends(dep_func)): 1abcdefghijklmnopqrst
23 return b + c 1abcdefghijklmnopqrst
25 assert (await some_func(2)) == 7 1abcdefghijklmnopqrst
28@pytest.mark.anyio 1abcdefghijklmnopqrst
29async def test_ignore_depends_if_setted_manual() -> None: 1abcdefghijklmnopqrst
30 mock = Mock() 1abcdefghijklmnopqrst
32 async def dep_func(a, b) -> int: 1abcdefghijklmnopqrst
33 mock(a, b) 1abcdefghijklmnopqrst
34 return a + b 1abcdefghijklmnopqrst
36 @inject 1abcdefghijklmnopqrst
37 async def some_func(c=Depends(dep_func)) -> int: 1abcdefghijklmnopqrst
38 return c 1abcdefghijklmnopqrst
40 assert (await some_func(c=2)) == 2 1abcdefghijklmnopqrst
41 assert not mock.called 1abcdefghijklmnopqrst
43 assert (await some_func(1, 2)) == 3 1abcdefghijklmnopqrst
44 mock.assert_called_once_with(1, 2) 1abcdefghijklmnopqrst
47@pytest.mark.anyio 1abcdefghijklmnopqrst
48async def test_empty_main_body() -> None: 1abcdefghijklmnopqrst
49 async def dep_func(a): 1abcdefghijklmnopqrst
50 return a 1abcdefghijklmnopqrst
52 @inject 1abcdefghijklmnopqrst
53 async def some_func(c=Depends(dep_func)): 1abcdefghijklmnopqrst
54 return c 1abcdefghijklmnopqrst
56 assert await some_func("1") == "1" 1abcdefghijklmnopqrst
59@pytest.mark.anyio 1abcdefghijklmnopqrst
60async def test_empty_main_body_multiple_args() -> None: 1abcdefghijklmnopqrst
61 def dep2(b): 1abcdefghijklmnopqrst
62 return b 1abcdefghijklmnopqrst
64 async def dep(a): 1abcdefghijklmnopqrst
65 return a 1abcdefghijklmnopqrst
67 @inject() 1abcdefghijklmnopqrst
68 async def handler(d=Depends(dep2), c=Depends(dep)): 1abcdefghijklmnopqrst
69 return d, c 1abcdefghijklmnopqrst
71 assert await handler(a=1, b=2) == (2, 1) 1abcdefghijklmnopqrst
72 assert await handler(1, b=2) == (2, 1) 1abcdefghijklmnopqrst
73 assert await handler(1, a=2) == (1, 2) 1abcdefghijklmnopqrst
74 assert await handler(1, 2) == (1, 1) # all dependencies takes the first arg 1abcdefghijklmnopqrst
77@pytest.mark.anyio 1abcdefghijklmnopqrst
78async def test_sync_depends() -> None: 1abcdefghijklmnopqrst
79 def sync_dep_func(a): 1abcdefghijklmnopqrst
80 return a 1abcdefghijklmnopqrst
82 @inject 1abcdefghijklmnopqrst
83 async def some_func(a: int, b: int, c=Depends(sync_dep_func)): 1abcdefghijklmnopqrst
84 return a + b + c 1abcdefghijklmnopqrst
86 assert await some_func(1, 2) == 4 1abcdefghijklmnopqrst
89@pytest.mark.anyio 1abcdefghijklmnopqrst
90async def test_depends_annotated() -> None: 1abcdefghijklmnopqrst
91 async def dep_func(a): 1abcdefghijklmnopqrst
92 return a 1abcdefghijklmnopqrst
94 D = Annotated[int, Depends(dep_func)] 1abcdefghijklmnopqrst
96 @inject 1abcdefghijklmnopqrst
97 async def some_func(a: int, b: int, c: D): 1abcdefghijklmnopqrst
98 assert isinstance(c, int) 1abcdefghijklmnopqrst
99 return a + b + c 1abcdefghijklmnopqrst
101 @inject 1abcdefghijklmnopqrst
102 async def another_func(a: int, c: D): 1abcdefghijklmnopqrst
103 return a + c 1abcdefghijklmnopqrst
105 assert await some_func(1, 2) == 4 1abcdefghijklmnopqrst
106 assert (await another_func(3)) == 6 1abcdefghijklmnopqrst
109@pytest.mark.anyio 1abcdefghijklmnopqrst
110async def test_async_depends_annotated_str_partial() -> None: 1abcdefghijklmnopqrst
111 async def adep_func(a): 1abcdefghijklmnopqrst
112 return a 1abcdefghijklmnopqrst
114 @inject 1abcdefghijklmnopqrst
115 async def some_func( 1abcdefghijklmnopqrst
116 a: int,
117 b: int,
118 c: Annotated["float", Depends(adep_func)],
119 ):
120 return a + b + c 1abcdefghijklmnopqrst
122 @inject 1abcdefghijklmnopqrst
123 async def another_func( 1abcdefghijklmnopqrst
124 a: int,
125 c: Annotated["float", Depends(adep_func)],
126 ):
127 return a + c 1abcdefghijklmnopqrst
129 assert await some_func(1, 2) == 4 1abcdefghijklmnopqrst
130 assert (await another_func(3)) == 6 1abcdefghijklmnopqrst
133@pytest.mark.anyio 1abcdefghijklmnopqrst
134async def test_cache() -> None: 1abcdefghijklmnopqrst
135 mock = Mock() 1abcdefghijklmnopqrst
137 async def nested_dep_func(): 1abcdefghijklmnopqrst
138 mock() 1abcdefghijklmnopqrst
139 return 1000 1abcdefghijklmnopqrst
141 async def dep_func(a=Depends(nested_dep_func)): 1abcdefghijklmnopqrst
142 return a 1abcdefghijklmnopqrst
144 @inject 1abcdefghijklmnopqrst
145 async def some_func(a=Depends(dep_func), b=Depends(nested_dep_func)): 1abcdefghijklmnopqrst
146 assert a is b 1abcdefghijklmnopqrst
147 return a + b 1abcdefghijklmnopqrst
149 assert await some_func() 1abcdefghijklmnopqrst
150 mock.assert_called_once() 1abcdefghijklmnopqrst
153@pytest.mark.anyio 1abcdefghijklmnopqrst
154async def test_not_cache() -> None: 1abcdefghijklmnopqrst
155 mock = Mock() 1abcdefghijklmnopqrst
157 async def nested_dep_func(): 1abcdefghijklmnopqrst
158 mock() 1abcdefghijklmnopqrst
159 return 1000 1abcdefghijklmnopqrst
161 async def dep_func(a=Depends(nested_dep_func, use_cache=False)): 1abcdefghijklmnopqrst
162 return a 1abcdefghijklmnopqrst
164 @inject 1abcdefghijklmnopqrst
165 async def some_func( 1abcdefghijklmnopqrst
166 a=Depends(dep_func, use_cache=False),
167 b=Depends(nested_dep_func, use_cache=False),
168 ):
169 assert a is b 1abcdefghijklmnopqrst
170 return a + b 1abcdefghijklmnopqrst
172 assert await some_func() 1abcdefghijklmnopqrst
173 assert mock.call_count == 2 1abcdefghijklmnopqrst
176@pytest.mark.anyio 1abcdefghijklmnopqrst
177async def test_yield() -> None: 1abcdefghijklmnopqrst
178 mock = Mock() 1abcdefghijklmnopqrst
180 async def dep_func(): 1abcdefghijklmnopqrst
181 mock() 1abcdefghijklmnopqrst
182 yield 1000 1abcdefghijklmnopqrst
183 mock.exit() 1abcdefghijklmnopqrst
185 @inject 1abcdefghijklmnopqrst
186 async def some_func(a=Depends(dep_func)): 1abcdefghijklmnopqrst
187 assert mock.called 1abcdefghijklmnopqrst
188 assert not mock.exit.called 1abcdefghijklmnopqrst
189 return a 1abcdefghijklmnopqrst
191 assert await some_func() 1abcdefghijklmnopqrst
192 mock.assert_called_once() 1abcdefghijklmnopqrst
193 mock.exit.assert_called_once() 1abcdefghijklmnopqrst
196@pytest.mark.anyio 1abcdefghijklmnopqrst
197async def test_sync_yield() -> None: 1abcdefghijklmnopqrst
198 mock = Mock() 1abcdefghijklmnopqrst
200 def sync_dep_func(): 1abcdefghijklmnopqrst
201 mock() 1abcdefghijklmnopqrst
202 yield 1000 1abcdefghijklmnopqrst
203 mock.exit() 1abcdefghijklmnopqrst
205 @inject 1abcdefghijklmnopqrst
206 async def some_func(a=Depends(sync_dep_func)): 1abcdefghijklmnopqrst
207 assert mock.called 1abcdefghijklmnopqrst
208 assert not mock.exit.called 1abcdefghijklmnopqrst
209 return a 1abcdefghijklmnopqrst
211 assert await some_func() 1abcdefghijklmnopqrst
212 mock.assert_called_once() 1abcdefghijklmnopqrst
213 mock.exit.assert_called_once() 1abcdefghijklmnopqrst
216@pytest.mark.anyio 1abcdefghijklmnopqrst
217async def test_sync_yield_exception() -> None: 1abcdefghijklmnopqrst
218 mock = Mock() 1abcdefghijklmnopqrst
220 def sync_dep_func(): 1abcdefghijklmnopqrst
221 mock() 1abcdefghijklmnopqrst
222 yield 1000 1abcdefghijklmnopqrst
223 raise ValueError() 1abcdefghijklmnopqrst
225 @inject 1abcdefghijklmnopqrst
226 async def some_func(a=Depends(sync_dep_func)): 1abcdefghijklmnopqrst
227 assert mock.called 1abcdefghijklmnopqrst
228 assert not mock.exit.called 1abcdefghijklmnopqrst
229 return a 1abcdefghijklmnopqrst
231 with pytest.raises(ValueError): 1abcdefghijklmnopqrst
232 await some_func() 1abcdefghijklmnopqrst
234 mock.assert_called_once() 1abcdefghijklmnopqrst
235 assert not mock.exit.called 1abcdefghijklmnopqrst
238@pytest.mark.anyio 1abcdefghijklmnopqrst
239async def test_sync_yield_exception_start() -> None: 1abcdefghijklmnopqrst
240 mock = Mock() 1abcdefghijklmnopqrst
242 def sync_dep_func(): 1abcdefghijklmnopqrst
243 raise ValueError() 1abcdefghijklmnopqrst
245 @inject 1abcdefghijklmnopqrst
246 async def some_func(a=Depends(sync_dep_func)): # pragma: no cover 1abcdefghijklmnopqrst
247 mock()
248 return a
250 with pytest.raises(ValueError): 1abcdefghijklmnopqrst
251 await some_func() 1abcdefghijklmnopqrst
253 assert not mock.called 1abcdefghijklmnopqrst
256@pytest.mark.anyio 1abcdefghijklmnopqrst
257async def test_sync_yield_exception_main() -> None: 1abcdefghijklmnopqrst
258 mock = Mock() 1abcdefghijklmnopqrst
260 def sync_dep_func(): 1abcdefghijklmnopqrst
261 mock() 1abcdefghijklmnopqrst
262 try: 1abcdefghijklmnopqrst
263 yield 1000 1abcdefghijklmnopqrst
264 finally:
265 mock.exit() 1abcdefghijklmnopqrst
267 @inject 1abcdefghijklmnopqrst
268 async def some_func(a=Depends(sync_dep_func)): 1abcdefghijklmnopqrst
269 assert mock.called 1abcdefghijklmnopqrst
270 assert not mock.exit.called 1abcdefghijklmnopqrst
271 raise ValueError() 1abcdefghijklmnopqrst
273 with pytest.raises(ValueError): 1abcdefghijklmnopqrst
274 await some_func() 1abcdefghijklmnopqrst
276 mock.assert_called_once() 1abcdefghijklmnopqrst
277 mock.exit.assert_called_once() 1abcdefghijklmnopqrst
280@pytest.mark.anyio 1abcdefghijklmnopqrst
281async def test_nested_yield_with_inject() -> None: 1abcdefghijklmnopqrst
282 async def dep_c(): 1abcdefghijklmnopqrst
283 yield ["foo"] 1abcdefghijklmnopqrst
285 @inject 1abcdefghijklmnopqrst
286 async def dep_b(c=Depends(dep_c)): 1abcdefghijklmnopqrst
287 yield c 1abcdefghijklmnopqrst
289 @inject 1abcdefghijklmnopqrst
290 async def a(b=Depends(dep_b)): 1abcdefghijklmnopqrst
291 return b[0] 1abcdefghijklmnopqrst
293 assert await a() == "foo" 1abcdefghijklmnopqrst
296@pytest.mark.anyio 1abcdefghijklmnopqrst
297async def test_class_depends() -> None: 1abcdefghijklmnopqrst
298 class MyDep: 1abcdefghijklmnopqrst
299 def __init__(self, a: int): 1abcdefghijklmnopqrst
300 self.a = a 1abcdefghijklmnopqrst
302 @inject 1abcdefghijklmnopqrst
303 async def some_func(a=Depends(MyDep)): 1abcdefghijklmnopqrst
304 assert isinstance(a, MyDep) 1abcdefghijklmnopqrst
305 assert a.a == 3 1abcdefghijklmnopqrst
306 return a 1abcdefghijklmnopqrst
308 await some_func(3) 1abcdefghijklmnopqrst
311@pytest.mark.anyio 1abcdefghijklmnopqrst
312async def test_callable_class_depends() -> None: 1abcdefghijklmnopqrst
313 class MyDep: 1abcdefghijklmnopqrst
314 def __init__(self, a: int): 1abcdefghijklmnopqrst
315 self.a = a 1abcdefghijklmnopqrst
317 def __call__(self) -> int: 1abcdefghijklmnopqrst
318 return self.a 1abcdefghijklmnopqrst
320 @inject 1abcdefghijklmnopqrst
321 async def some_func(a=Depends(MyDep(3))): # noqa: B008 1abcdefghijklmnopqrst
322 assert a == 3 1abcdefghijklmnopqrst
323 return a 1abcdefghijklmnopqrst
325 await some_func() 1abcdefghijklmnopqrst
328@pytest.mark.anyio 1abcdefghijklmnopqrst
329async def test_async_callable_class_depends() -> None: 1abcdefghijklmnopqrst
330 class MyDep: 1abcdefghijklmnopqrst
331 def __init__(self, a: int): 1abcdefghijklmnopqrst
332 self.a = a 1abcdefghijklmnopqrst
334 async def call(self) -> int: 1abcdefghijklmnopqrst
335 return self.a 1abcdefghijklmnopqrst
337 @inject 1abcdefghijklmnopqrst
338 async def some_func(a=Depends(MyDep(3).call)): # noqa: B008 1abcdefghijklmnopqrst
339 assert a == 3 1abcdefghijklmnopqrst
340 return a 1abcdefghijklmnopqrst
342 await some_func() 1abcdefghijklmnopqrst
345@pytest.mark.anyio 1abcdefghijklmnopqrst
346async def test_not_cast_main() -> None: 1abcdefghijklmnopqrst
347 @dataclass 1abcdefghijklmnopqrst
348 class A: 1abcdefghijklmnopqrst
349 a: int 1abcdefghijkls
351 async def dep() -> A: 1abcdefghijklmnopqrst
352 return A(a=1) 1abcdefghijklmnopqrst
354 async def get_logger() -> logging.Logger: 1abcdefghijklmnopqrst
355 return logging.getLogger(__file__) 1abcdefghijklmnopqrst
357 @inject(cast=False) 1abcdefghijklmnopqrst
358 async def some_func( 1abcdefghijklmnopqrst
359 b: str,
360 a: A = Depends(dep),
361 logger: logging.Logger = Depends(get_logger),
362 ) -> str:
363 assert a.a == 1 1abcdefghijklmnopqrst
364 assert logger 1abcdefghijklmnopqrst
365 return b 1abcdefghijklmnopqrst
367 assert (await some_func(1)) == 1 1abcdefghijklmnopqrst
370@pytest.mark.anyio 1abcdefghijklmnopqrst
371async def test_extra() -> None: 1abcdefghijklmnopqrst
372 mock = Mock() 1abcdefghijklmnopqrst
374 async def dep(): 1abcdefghijklmnopqrst
375 mock.async_call() 1abcdefghijklmnopqrst
377 def sync_dep(): 1abcdefghijklmnopqrst
378 mock.sync_call() 1abcdefghijklmnopqrst
380 @inject(extra_dependencies=(Depends(dep), Depends(sync_dep))) 1abcdefghijklmnopqrst
381 async def some_func(): 1abcdefghijklmnopqrst
382 mock() 1abcdefghijklmnopqrst
384 await some_func(1) 1abcdefghijklmnopqrst
385 mock.assert_called_once() 1abcdefghijklmnopqrst
386 mock.async_call.assert_called_once() 1abcdefghijklmnopqrst
387 mock.sync_call.assert_called_once() 1abcdefghijklmnopqrst
390@pytest.mark.anyio 1abcdefghijklmnopqrst
391async def test_generator() -> None: 1abcdefghijklmnopqrst
392 mock = Mock() 1abcdefghijklmnopqrst
394 def sync_simple_func(): 1abcdefghijklmnopqrst
395 mock.sync_call() 1abcdefghijklmnopqrst
397 async def async_simple_func(): 1abcdefghijklmnopqrst
398 mock.async_call() 1abcdefghijklmnopqrst
400 async def gen_func(): 1abcdefghijklmnopqrst
401 mock.start() 1abcdefghijklmnopqrst
402 yield 1abcdefghijklmnopqrst
403 mock.end() 1abcdefghijklmnopqrst
405 @inject 1abcdefghijklmnopqrst
406 async def simple_func( 1abcdefghijklmnopqrst
407 a: str,
408 d=Depends(async_simple_func),
409 d2=Depends(sync_simple_func),
410 d3=Depends(gen_func),
411 ):
412 for _ in range(2): 1abcdefghijklmnopqrst
413 yield a 1abcdefghijklmnopqrst
415 async for i in simple_func("1"): 1abcdefghijklmnopqrst
416 mock.start.assert_called_once() 1abcdefghijklmnopqrst
417 assert not mock.end.called 1abcdefghijklmnopqrst
418 assert i == "1" 1abcdefghijklmnopqrst
420 mock.sync_call.assert_called_once() 1abcdefghijklmnopqrst
421 mock.async_call.assert_called_once() 1abcdefghijklmnopqrst
422 mock.end.assert_called_once() 1abcdefghijklmnopqrst
425@pytest.mark.anyio 1abcdefghijklmnopqrst
426async def test_partial() -> None: 1abcdefghijklmnopqrst
427 async def dep(a): 1abcdefghijklmnopqrst
428 return a 1abcdefghijklmnopqrst
430 @inject 1abcdefghijklmnopqrst
431 async def func(a=Depends(partial(dep, 10))): # noqa D008 1abcdefghijklmnopqrst
432 return a 1abcdefghijklmnopqrst
434 assert await func() == 10 1abcdefghijklmnopqrst
437@serializer 1abcdefghijklmnopqrst
438@pytest.mark.anyio 1abcdefghijklmnopqrst
439class TestSerializer: 1abcdefghijklmnopqrst
440 @pytest.mark.anyio 1abcdefghijklmnopqrst
441 async def test_not_cast(self) -> None: 1abcdefghijklmnopqrst
442 @dataclass 1abcdefghijklmnopqr
443 class A: 1abcdefghijklmnopqr
444 a: int 1abcdefghijkl
446 async def dep1() -> A: 1abcdefghijklmnopqr
447 return {"a": 1} 1abcdefghijklmnopqr
449 async def dep2() -> A: 1abcdefghijklmnopqr
450 return {"a": 1} 1abcdefghijklmnopqr
452 async def dep3() -> A: 1abcdefghijklmnopqr
453 return 1 1abcdefghijklmnopqr
455 async def get_logger() -> logging.Logger: 1abcdefghijklmnopqr
456 return logging.getLogger(__file__) 1abcdefghijklmnopqr
458 @inject 1abcdefghijklmnopqr
459 async def some_func( 1abcdefghijklmnopqr
460 b,
461 a1: A = Depends(dep1, cast=False, cast_result=True),
462 a2: A = Depends(dep2, cast=True, cast_result=False),
463 a3: A = Depends(dep3, cast=False, cast_result=False),
464 logger: logging.Logger = Depends(get_logger),
465 ):
466 assert a1.a == 1 1abcdefghijklmnopqr
467 assert a2.a == 1 1abcdefghijklmnopqr
468 assert a3 == 1 1abcdefghijklmnopqr
469 assert logger 1abcdefghijklmnopqr
470 return b 1abcdefghijklmnopqr
472 assert (await some_func(1)) == 1 1abcdefghijklmnopqr
474 async def test_depends_error(self) -> None: 1abcdefghijklmnopqrst
475 async def dep_func(b: dict, a: int = 3) -> float: # pragma: no cover 1abcdefghijklmnopqr
476 return a + b
478 async def another_dep_func(b: int, a: int = 3) -> dict: # pragma: no cover 1abcdefghijklmnopqr
479 return a + b
481 @inject 1abcdefghijklmnopqr
482 async def some_func( 1abcdefghijklmnopqr
483 b: int, c=Depends(dep_func), d=Depends(another_dep_func) 1abcdefghijklmnopqr
484 ) -> int: # pragma: no cover 1abcdefghijkl
485 assert c is None
486 return b
488 with pytest.raises(ValidationError): 1abcdefghijklmnopqr
489 assert await some_func("2") 1abcdefghijklmnopqr
491 async def test_depends_response_cast(self) -> None: 1abcdefghijklmnopqrst
492 async def dep_func(a): 1abcdefghijklmnopqr
493 return a 1abcdefghijklmnopqr
495 @inject 1abcdefghijklmnopqr
496 async def some_func(a: int, b: int, c: int = Depends(dep_func)) -> float: 1abcdefghijklmnopqr
497 assert isinstance(c, int) 1abcdefghijklmnopqr
498 return a + b + c 1abcdefghijklmnopqr
500 assert await some_func("1", "2") 1abcdefghijklmnopqr
502 async def test_async_depends_annotated_str(self) -> None: 1abcdefghijklmnopqrst
503 async def dep_func(a): 1abcdefghijklmnopqr
504 return a 1abcdefghijklmnopqr
506 @inject 1abcdefghijklmnopqr
507 async def some_func( 1abcdefghijklmnopqr
508 a: int,
509 b: int,
510 c: "Annotated[int, Depends(dep_func)]",
511 ) -> float:
512 assert isinstance(c, int) 1abcdefghijklmnopqr
513 return a + b + c 1abcdefghijklmnopqr
515 @inject 1abcdefghijklmnopqr
516 async def another_func( 1abcdefghijklmnopqr
517 a: int,
518 c: "Annotated[int, Depends(dep_func)]",
519 ):
520 return a + c 1abcdefghijklmnopqr
522 assert await some_func("1", "2") 1abcdefghijklmnopqr
523 assert await another_func("3") == 6.0 1abcdefghijklmnopqr
526@pytest.mark.anyio 1abcdefghijklmnopqrst
527async def test_default_key_value() -> None: 1abcdefghijklmnopqrst
528 async def dep(a: str = "a"): 1abcdefghijklmnopqrst
529 return a 1abcdefghijklmnopqrst
531 @inject(cast=False) 1abcdefghijklmnopqrst
532 async def func(a=Depends(dep)): 1abcdefghijklmnopqrst
533 return a 1abcdefghijklmnopqrst
535 assert await func() == "a" 1abcdefghijklmnopqrst
538@pytest.mark.anyio 1abcdefghijklmnopqrst
539async def test_asynccontextmanager() -> None: 1abcdefghijklmnopqrst
540 async def dep(a: str): 1abcdefghijklmnopqrst
541 return a 1abcdefghijklmnopqrst
543 @asynccontextmanager 1abcdefghijklmnopqrst
544 @inject 1abcdefghijklmnopqrst
545 async def func(a: str, b: str = Depends(dep)): 1abcdefghijklmnopqrst
546 yield a == b 1abcdefghijklmnopqrst
548 async with func("a") as is_equal: 1abcdefghijklmnopqrst
549 assert is_equal 1abcdefghijklmnopqrst
552@pytest.mark.anyio 1abcdefghijklmnopqrst
553async def test_solve_wrapper() -> None: 1abcdefghijklmnopqrst
554 @inject 1abcdefghijklmnopqrst
555 async def dep1(a: int): 1abcdefghijklmnopqrst
556 yield a + 1 1abcdefghijklmnopqrst
558 async def dep2(a: int): 1abcdefghijklmnopqrst
559 yield a + 2 1abcdefghijklmnopqrst
561 @inject 1abcdefghijklmnopqrst
562 async def func(a: int, b: int = Depends(dep1), c: int = Depends(dep2)): 1abcdefghijklmnopqrst
563 return a, b, c 1abcdefghijklmnopqrst
565 assert await func(1) == (1, 2, 3) 1abcdefghijklmnopqrst
568@pytest.mark.anyio 1abcdefghijklmnopqrst
569async def test_asyncgenerator_iter() -> None: 1abcdefghijklmnopqrst
570 # ref: https://github.com/Lancetnik/FastDepends/issues/165
572 async def simple_dependency(a: int, b: int = 3) -> int: 1abcdefghijklmnopqrst
573 return a + b 1abcdefghijklmnopqrst
575 @inject 1abcdefghijklmnopqrst
576 async def method( 1abcdefghijklmnopqrst
577 a: int, d: int = Depends(simple_dependency)
578 ) -> AsyncGenerator[int, None]:
579 for i in range(a + d): 1abcdefghijklmnopqrst
580 yield i 1abcdefghijklmnopqrst
582 iterator = method(5) 1abcdefghijklmnopqrst
584 assert len([v async for v in iterator]) == 13 1abcdefghijklmnopqrst
585 assert len([v async for v in iterator]) == 0 1abcdefghijklmnopqrst