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

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

8 

9import pytest 1abcdefghijklmnopqrst

10 

11from fast_depends import Depends, inject 1abcdefghijklmnopqrst

12from fast_depends.exceptions import ValidationError 1abcdefghijklmnopqrst

13from tests.marks import serializer 1abcdefghijklmnopqrst

14 

15 

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

20 

21 @inject 1abcdefghijklmnopqrst

22 async def some_func(b: int, c=Depends(dep_func)): 1abcdefghijklmnopqrst

23 return b + c 1abcdefghijklmnopqrst

24 

25 assert (await some_func(2)) == 7 1abcdefghijklmnopqrst

26 

27 

28@pytest.mark.anyio 1abcdefghijklmnopqrst

29async def test_ignore_depends_if_setted_manual() -> None: 1abcdefghijklmnopqrst

30 mock = Mock() 1abcdefghijklmnopqrst

31 

32 async def dep_func(a, b) -> int: 1abcdefghijklmnopqrst

33 mock(a, b) 1abcdefghijklmnopqrst

34 return a + b 1abcdefghijklmnopqrst

35 

36 @inject 1abcdefghijklmnopqrst

37 async def some_func(c=Depends(dep_func)) -> int: 1abcdefghijklmnopqrst

38 return c 1abcdefghijklmnopqrst

39 

40 assert (await some_func(c=2)) == 2 1abcdefghijklmnopqrst

41 assert not mock.called 1abcdefghijklmnopqrst

42 

43 assert (await some_func(1, 2)) == 3 1abcdefghijklmnopqrst

44 mock.assert_called_once_with(1, 2) 1abcdefghijklmnopqrst

45 

46 

47@pytest.mark.anyio 1abcdefghijklmnopqrst

48async def test_empty_main_body() -> None: 1abcdefghijklmnopqrst

49 async def dep_func(a): 1abcdefghijklmnopqrst

50 return a 1abcdefghijklmnopqrst

51 

52 @inject 1abcdefghijklmnopqrst

53 async def some_func(c=Depends(dep_func)): 1abcdefghijklmnopqrst

54 return c 1abcdefghijklmnopqrst

55 

56 assert await some_func("1") == "1" 1abcdefghijklmnopqrst

57 

58 

59@pytest.mark.anyio 1abcdefghijklmnopqrst

60async def test_empty_main_body_multiple_args() -> None: 1abcdefghijklmnopqrst

61 def dep2(b): 1abcdefghijklmnopqrst

62 return b 1abcdefghijklmnopqrst

63 

64 async def dep(a): 1abcdefghijklmnopqrst

65 return a 1abcdefghijklmnopqrst

66 

67 @inject() 1abcdefghijklmnopqrst

68 async def handler(d=Depends(dep2), c=Depends(dep)): 1abcdefghijklmnopqrst

69 return d, c 1abcdefghijklmnopqrst

70 

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

75 

76 

77@pytest.mark.anyio 1abcdefghijklmnopqrst

78async def test_sync_depends() -> None: 1abcdefghijklmnopqrst

79 def sync_dep_func(a): 1abcdefghijklmnopqrst

80 return a 1abcdefghijklmnopqrst

81 

82 @inject 1abcdefghijklmnopqrst

83 async def some_func(a: int, b: int, c=Depends(sync_dep_func)): 1abcdefghijklmnopqrst

84 return a + b + c 1abcdefghijklmnopqrst

85 

86 assert await some_func(1, 2) == 4 1abcdefghijklmnopqrst

87 

88 

89@pytest.mark.anyio 1abcdefghijklmnopqrst

90async def test_depends_annotated() -> None: 1abcdefghijklmnopqrst

91 async def dep_func(a): 1abcdefghijklmnopqrst

92 return a 1abcdefghijklmnopqrst

93 

94 D = Annotated[int, Depends(dep_func)] 1abcdefghijklmnopqrst

95 

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

100 

101 @inject 1abcdefghijklmnopqrst

102 async def another_func(a: int, c: D): 1abcdefghijklmnopqrst

103 return a + c 1abcdefghijklmnopqrst

104 

105 assert await some_func(1, 2) == 4 1abcdefghijklmnopqrst

106 assert (await another_func(3)) == 6 1abcdefghijklmnopqrst

107 

108 

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

113 

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

121 

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

128 

129 assert await some_func(1, 2) == 4 1abcdefghijklmnopqrst

130 assert (await another_func(3)) == 6 1abcdefghijklmnopqrst

131 

132 

133@pytest.mark.anyio 1abcdefghijklmnopqrst

134async def test_cache() -> None: 1abcdefghijklmnopqrst

135 mock = Mock() 1abcdefghijklmnopqrst

136 

137 async def nested_dep_func(): 1abcdefghijklmnopqrst

138 mock() 1abcdefghijklmnopqrst

139 return 1000 1abcdefghijklmnopqrst

140 

141 async def dep_func(a=Depends(nested_dep_func)): 1abcdefghijklmnopqrst

142 return a 1abcdefghijklmnopqrst

143 

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

148 

149 assert await some_func() 1abcdefghijklmnopqrst

150 mock.assert_called_once() 1abcdefghijklmnopqrst

151 

152 

153@pytest.mark.anyio 1abcdefghijklmnopqrst

154async def test_not_cache() -> None: 1abcdefghijklmnopqrst

155 mock = Mock() 1abcdefghijklmnopqrst

156 

157 async def nested_dep_func(): 1abcdefghijklmnopqrst

158 mock() 1abcdefghijklmnopqrst

159 return 1000 1abcdefghijklmnopqrst

160 

161 async def dep_func(a=Depends(nested_dep_func, use_cache=False)): 1abcdefghijklmnopqrst

162 return a 1abcdefghijklmnopqrst

163 

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

171 

172 assert await some_func() 1abcdefghijklmnopqrst

173 assert mock.call_count == 2 1abcdefghijklmnopqrst

174 

175 

176@pytest.mark.anyio 1abcdefghijklmnopqrst

177async def test_yield() -> None: 1abcdefghijklmnopqrst

178 mock = Mock() 1abcdefghijklmnopqrst

179 

180 async def dep_func(): 1abcdefghijklmnopqrst

181 mock() 1abcdefghijklmnopqrst

182 yield 1000 1abcdefghijklmnopqrst

183 mock.exit() 1abcdefghijklmnopqrst

184 

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

190 

191 assert await some_func() 1abcdefghijklmnopqrst

192 mock.assert_called_once() 1abcdefghijklmnopqrst

193 mock.exit.assert_called_once() 1abcdefghijklmnopqrst

194 

195 

196@pytest.mark.anyio 1abcdefghijklmnopqrst

197async def test_sync_yield() -> None: 1abcdefghijklmnopqrst

198 mock = Mock() 1abcdefghijklmnopqrst

199 

200 def sync_dep_func(): 1abcdefghijklmnopqrst

201 mock() 1abcdefghijklmnopqrst

202 yield 1000 1abcdefghijklmnopqrst

203 mock.exit() 1abcdefghijklmnopqrst

204 

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

210 

211 assert await some_func() 1abcdefghijklmnopqrst

212 mock.assert_called_once() 1abcdefghijklmnopqrst

213 mock.exit.assert_called_once() 1abcdefghijklmnopqrst

214 

215 

216@pytest.mark.anyio 1abcdefghijklmnopqrst

217async def test_sync_yield_exception() -> None: 1abcdefghijklmnopqrst

218 mock = Mock() 1abcdefghijklmnopqrst

219 

220 def sync_dep_func(): 1abcdefghijklmnopqrst

221 mock() 1abcdefghijklmnopqrst

222 yield 1000 1abcdefghijklmnopqrst

223 raise ValueError() 1abcdefghijklmnopqrst

224 

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

230 

231 with pytest.raises(ValueError): 1abcdefghijklmnopqrst

232 await some_func() 1abcdefghijklmnopqrst

233 

234 mock.assert_called_once() 1abcdefghijklmnopqrst

235 assert not mock.exit.called 1abcdefghijklmnopqrst

236 

237 

238@pytest.mark.anyio 1abcdefghijklmnopqrst

239async def test_sync_yield_exception_start() -> None: 1abcdefghijklmnopqrst

240 mock = Mock() 1abcdefghijklmnopqrst

241 

242 def sync_dep_func(): 1abcdefghijklmnopqrst

243 raise ValueError() 1abcdefghijklmnopqrst

244 

245 @inject 1abcdefghijklmnopqrst

246 async def some_func(a=Depends(sync_dep_func)): # pragma: no cover 1abcdefghijklmnopqrst

247 mock() 

248 return a 

249 

250 with pytest.raises(ValueError): 1abcdefghijklmnopqrst

251 await some_func() 1abcdefghijklmnopqrst

252 

253 assert not mock.called 1abcdefghijklmnopqrst

254 

255 

256@pytest.mark.anyio 1abcdefghijklmnopqrst

257async def test_sync_yield_exception_main() -> None: 1abcdefghijklmnopqrst

258 mock = Mock() 1abcdefghijklmnopqrst

259 

260 def sync_dep_func(): 1abcdefghijklmnopqrst

261 mock() 1abcdefghijklmnopqrst

262 try: 1abcdefghijklmnopqrst

263 yield 1000 1abcdefghijklmnopqrst

264 finally: 

265 mock.exit() 1abcdefghijklmnopqrst

266 

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

272 

273 with pytest.raises(ValueError): 1abcdefghijklmnopqrst

274 await some_func() 1abcdefghijklmnopqrst

275 

276 mock.assert_called_once() 1abcdefghijklmnopqrst

277 mock.exit.assert_called_once() 1abcdefghijklmnopqrst

278 

279 

280@pytest.mark.anyio 1abcdefghijklmnopqrst

281async def test_nested_yield_with_inject() -> None: 1abcdefghijklmnopqrst

282 async def dep_c(): 1abcdefghijklmnopqrst

283 yield ["foo"] 1abcdefghijklmnopqrst

284 

285 @inject 1abcdefghijklmnopqrst

286 async def dep_b(c=Depends(dep_c)): 1abcdefghijklmnopqrst

287 yield c 1abcdefghijklmnopqrst

288 

289 @inject 1abcdefghijklmnopqrst

290 async def a(b=Depends(dep_b)): 1abcdefghijklmnopqrst

291 return b[0] 1abcdefghijklmnopqrst

292 

293 assert await a() == "foo" 1abcdefghijklmnopqrst

294 

295 

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

301 

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

307 

308 await some_func(3) 1abcdefghijklmnopqrst

309 

310 

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

316 

317 def __call__(self) -> int: 1abcdefghijklmnopqrst

318 return self.a 1abcdefghijklmnopqrst

319 

320 @inject 1abcdefghijklmnopqrst

321 async def some_func(a=Depends(MyDep(3))): # noqa: B008 1abcdefghijklmnopqrst

322 assert a == 3 1abcdefghijklmnopqrst

323 return a 1abcdefghijklmnopqrst

324 

325 await some_func() 1abcdefghijklmnopqrst

326 

327 

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

333 

334 async def call(self) -> int: 1abcdefghijklmnopqrst

335 return self.a 1abcdefghijklmnopqrst

336 

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

341 

342 await some_func() 1abcdefghijklmnopqrst

343 

344 

345@pytest.mark.anyio 1abcdefghijklmnopqrst

346async def test_not_cast_main() -> None: 1abcdefghijklmnopqrst

347 @dataclass 1abcdefghijklmnopqrst

348 class A: 1abcdefghijklmnopqrst

349 a: int 1abcdefghijkls

350 

351 async def dep() -> A: 1abcdefghijklmnopqrst

352 return A(a=1) 1abcdefghijklmnopqrst

353 

354 async def get_logger() -> logging.Logger: 1abcdefghijklmnopqrst

355 return logging.getLogger(__file__) 1abcdefghijklmnopqrst

356 

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

366 

367 assert (await some_func(1)) == 1 1abcdefghijklmnopqrst

368 

369 

370@pytest.mark.anyio 1abcdefghijklmnopqrst

371async def test_extra() -> None: 1abcdefghijklmnopqrst

372 mock = Mock() 1abcdefghijklmnopqrst

373 

374 async def dep(): 1abcdefghijklmnopqrst

375 mock.async_call() 1abcdefghijklmnopqrst

376 

377 def sync_dep(): 1abcdefghijklmnopqrst

378 mock.sync_call() 1abcdefghijklmnopqrst

379 

380 @inject(extra_dependencies=(Depends(dep), Depends(sync_dep))) 1abcdefghijklmnopqrst

381 async def some_func(): 1abcdefghijklmnopqrst

382 mock() 1abcdefghijklmnopqrst

383 

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

388 

389 

390@pytest.mark.anyio 1abcdefghijklmnopqrst

391async def test_generator() -> None: 1abcdefghijklmnopqrst

392 mock = Mock() 1abcdefghijklmnopqrst

393 

394 def sync_simple_func(): 1abcdefghijklmnopqrst

395 mock.sync_call() 1abcdefghijklmnopqrst

396 

397 async def async_simple_func(): 1abcdefghijklmnopqrst

398 mock.async_call() 1abcdefghijklmnopqrst

399 

400 async def gen_func(): 1abcdefghijklmnopqrst

401 mock.start() 1abcdefghijklmnopqrst

402 yield 1abcdefghijklmnopqrst

403 mock.end() 1abcdefghijklmnopqrst

404 

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

414 

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

419 

420 mock.sync_call.assert_called_once() 1abcdefghijklmnopqrst

421 mock.async_call.assert_called_once() 1abcdefghijklmnopqrst

422 mock.end.assert_called_once() 1abcdefghijklmnopqrst

423 

424 

425@pytest.mark.anyio 1abcdefghijklmnopqrst

426async def test_partial() -> None: 1abcdefghijklmnopqrst

427 async def dep(a): 1abcdefghijklmnopqrst

428 return a 1abcdefghijklmnopqrst

429 

430 @inject 1abcdefghijklmnopqrst

431 async def func(a=Depends(partial(dep, 10))): # noqa D008 1abcdefghijklmnopqrst

432 return a 1abcdefghijklmnopqrst

433 

434 assert await func() == 10 1abcdefghijklmnopqrst

435 

436 

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

445 

446 async def dep1() -> A: 1abcdefghijklmnopqr

447 return {"a": 1} 1abcdefghijklmnopqr

448 

449 async def dep2() -> A: 1abcdefghijklmnopqr

450 return {"a": 1} 1abcdefghijklmnopqr

451 

452 async def dep3() -> A: 1abcdefghijklmnopqr

453 return 1 1abcdefghijklmnopqr

454 

455 async def get_logger() -> logging.Logger: 1abcdefghijklmnopqr

456 return logging.getLogger(__file__) 1abcdefghijklmnopqr

457 

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

471 

472 assert (await some_func(1)) == 1 1abcdefghijklmnopqr

473 

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 

477 

478 async def another_dep_func(b: int, a: int = 3) -> dict: # pragma: no cover 1abcdefghijklmnopqr

479 return a + b 

480 

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 

487 

488 with pytest.raises(ValidationError): 1abcdefghijklmnopqr

489 assert await some_func("2") 1abcdefghijklmnopqr

490 

491 async def test_depends_response_cast(self) -> None: 1abcdefghijklmnopqrst

492 async def dep_func(a): 1abcdefghijklmnopqr

493 return a 1abcdefghijklmnopqr

494 

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

499 

500 assert await some_func("1", "2") 1abcdefghijklmnopqr

501 

502 async def test_async_depends_annotated_str(self) -> None: 1abcdefghijklmnopqrst

503 async def dep_func(a): 1abcdefghijklmnopqr

504 return a 1abcdefghijklmnopqr

505 

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

514 

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

521 

522 assert await some_func("1", "2") 1abcdefghijklmnopqr

523 assert await another_func("3") == 6.0 1abcdefghijklmnopqr

524 

525 

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

530 

531 @inject(cast=False) 1abcdefghijklmnopqrst

532 async def func(a=Depends(dep)): 1abcdefghijklmnopqrst

533 return a 1abcdefghijklmnopqrst

534 

535 assert await func() == "a" 1abcdefghijklmnopqrst

536 

537 

538@pytest.mark.anyio 1abcdefghijklmnopqrst

539async def test_asynccontextmanager() -> None: 1abcdefghijklmnopqrst

540 async def dep(a: str): 1abcdefghijklmnopqrst

541 return a 1abcdefghijklmnopqrst

542 

543 @asynccontextmanager 1abcdefghijklmnopqrst

544 @inject 1abcdefghijklmnopqrst

545 async def func(a: str, b: str = Depends(dep)): 1abcdefghijklmnopqrst

546 yield a == b 1abcdefghijklmnopqrst

547 

548 async with func("a") as is_equal: 1abcdefghijklmnopqrst

549 assert is_equal 1abcdefghijklmnopqrst

550 

551 

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

557 

558 async def dep2(a: int): 1abcdefghijklmnopqrst

559 yield a + 2 1abcdefghijklmnopqrst

560 

561 @inject 1abcdefghijklmnopqrst

562 async def func(a: int, b: int = Depends(dep1), c: int = Depends(dep2)): 1abcdefghijklmnopqrst

563 return a, b, c 1abcdefghijklmnopqrst

564 

565 assert await func(1) == (1, 2, 3) 1abcdefghijklmnopqrst

566 

567 

568@pytest.mark.anyio 1abcdefghijklmnopqrst

569async def test_asyncgenerator_iter() -> None: 1abcdefghijklmnopqrst

570 # ref: https://github.com/Lancetnik/FastDepends/issues/165 

571 

572 async def simple_dependency(a: int, b: int = 3) -> int: 1abcdefghijklmnopqrst

573 return a + b 1abcdefghijklmnopqrst

574 

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

581 

582 iterator = method(5) 1abcdefghijklmnopqrst

583 

584 assert len([v async for v in iterator]) == 13 1abcdefghijklmnopqrst

585 assert len([v async for v in iterator]) == 0 1abcdefghijklmnopqrst