Coverage for tests / test_dependency_overrides.py: 100%

155 statements  

« prev     ^ index     » next       coverage.py v7.13.3, created at 2026-02-12 18:15 +0000

1from typing import Optional 1abcd

2 

3import pytest 1abcd

4from fastapi import APIRouter, Depends, FastAPI 1abcd

5from fastapi.testclient import TestClient 1abcd

6 

7app = FastAPI() 1abcd

8 

9router = APIRouter() 1abcd

10 

11 

12async def common_parameters(q: str, skip: int = 0, limit: int = 100): 1abcd

13 return {"q": q, "skip": skip, "limit": limit} 1uvwxyzABCDEFGHIJKLMNOPQR

14 

15 

16@app.get("/main-depends/") 1abcd

17async def main_depends(commons: dict = Depends(common_parameters)): 1abcd

18 return {"in": "main-depends", "params": commons} 1wxfhEFeiMNgj

19 

20 

21@app.get("/decorator-depends/", dependencies=[Depends(common_parameters)]) 1abcd

22async def decorator_depends(): 1abcd

23 return {"in": "decorator-depends"} 1uvfkCDelKLgm

24 

25 

26@router.get("/router-depends/") 1abcd

27async def router_depends(commons: dict = Depends(common_parameters)): 1abcd

28 return {"in": "router-depends", "params": commons} 1fnABeoIJgpQR

29 

30 

31@router.get("/router-decorator-depends/", dependencies=[Depends(common_parameters)]) 1abcd

32async def router_decorator_depends(): 1abcd

33 return {"in": "router-decorator-depends"} 1fqyzerGHgsOP

34 

35 

36app.include_router(router) 1abcd

37 

38client = TestClient(app) 1abcd

39 

40 

41async def overrider_dependency_simple(q: Optional[str] = None): 1abecd

42 return {"q": q, "skip": 5, "limit": 10} 1feg

43 

44 

45async def overrider_sub_dependency(k: str): 1abtcd

46 return {"k": k} 1khqnliromjsp

47 

48 

49async def overrider_dependency_with_sub(msg: dict = Depends(overrider_sub_dependency)): 1abtcd

50 return msg 1khqnliromjsp

51 

52 

53def test_main_depends(): 1abcd

54 response = client.get("/main-depends/") 1()*

55 assert response.status_code == 422 1()*

56 assert response.json() == { 1()*

57 "detail": [ 

58 { 

59 "type": "missing", 

60 "loc": ["query", "q"], 

61 "msg": "Field required", 

62 "input": None, 

63 } 

64 ] 

65 } 

66 

67 

68def test_main_depends_q_foo(): 1abcd

69 response = client.get("/main-depends/?q=foo") 1wEM

70 assert response.status_code == 200 1wEM

71 assert response.json() == { 1wEM

72 "in": "main-depends", 

73 "params": {"q": "foo", "skip": 0, "limit": 100}, 

74 } 

75 

76 

77def test_main_depends_q_foo_skip_100_limit_200(): 1abcd

78 response = client.get("/main-depends/?q=foo&skip=100&limit=200") 1xFN

79 assert response.status_code == 200 1xFN

80 assert response.json() == { 1xFN

81 "in": "main-depends", 

82 "params": {"q": "foo", "skip": 100, "limit": 200}, 

83 } 

84 

85 

86def test_decorator_depends(): 1abcd

87 response = client.get("/decorator-depends/") 1+,-

88 assert response.status_code == 422 1+,-

89 assert response.json() == { 1+,-

90 "detail": [ 

91 { 

92 "type": "missing", 

93 "loc": ["query", "q"], 

94 "msg": "Field required", 

95 "input": None, 

96 } 

97 ] 

98 } 

99 

100 

101def test_decorator_depends_q_foo(): 1abcd

102 response = client.get("/decorator-depends/?q=foo") 1uCK

103 assert response.status_code == 200 1uCK

104 assert response.json() == {"in": "decorator-depends"} 1uCK

105 

106 

107def test_decorator_depends_q_foo_skip_100_limit_200(): 1abcd

108 response = client.get("/decorator-depends/?q=foo&skip=100&limit=200") 1vDL

109 assert response.status_code == 200 1vDL

110 assert response.json() == {"in": "decorator-depends"} 1vDL

111 

112 

113def test_router_depends(): 1abcd

114 response = client.get("/router-depends/") 1./:

115 assert response.status_code == 422 1./:

116 assert response.json() == { 1./:

117 "detail": [ 

118 { 

119 "type": "missing", 

120 "loc": ["query", "q"], 

121 "msg": "Field required", 

122 "input": None, 

123 } 

124 ] 

125 } 

126 

127 

128def test_router_depends_q_foo(): 1abcd

129 response = client.get("/router-depends/?q=foo") 1AIQ

130 assert response.status_code == 200 1AIQ

131 assert response.json() == { 1AIQ

132 "in": "router-depends", 

133 "params": {"q": "foo", "skip": 0, "limit": 100}, 

134 } 

135 

136 

137def test_router_depends_q_foo_skip_100_limit_200(): 1abcd

138 response = client.get("/router-depends/?q=foo&skip=100&limit=200") 1BJR

139 assert response.status_code == 200 1BJR

140 assert response.json() == { 1BJR

141 "in": "router-depends", 

142 "params": {"q": "foo", "skip": 100, "limit": 200}, 

143 } 

144 

145 

146def test_router_decorator_depends(): 1abcd

147 response = client.get("/router-decorator-depends/") 1;=?

148 assert response.status_code == 422 1;=?

149 assert response.json() == { 1;=?

150 "detail": [ 

151 { 

152 "type": "missing", 

153 "loc": ["query", "q"], 

154 "msg": "Field required", 

155 "input": None, 

156 } 

157 ] 

158 } 

159 

160 

161def test_router_decorator_depends_q_foo(): 1abcd

162 response = client.get("/router-decorator-depends/?q=foo") 1yGO

163 assert response.status_code == 200 1yGO

164 assert response.json() == {"in": "router-decorator-depends"} 1yGO

165 

166 

167def test_router_decorator_depends_q_foo_skip_100_limit_200(): 1abcd

168 response = client.get("/router-decorator-depends/?q=foo&skip=100&limit=200") 1zHP

169 assert response.status_code == 200 1zHP

170 assert response.json() == {"in": "router-decorator-depends"} 1zHP

171 

172 

173@pytest.mark.parametrize( 1abcd

174 "url,status_code,expected", 

175 [ 

176 ( 

177 "/main-depends/", 

178 200, 

179 {"in": "main-depends", "params": {"q": None, "skip": 5, "limit": 10}}, 

180 ), 

181 ( 

182 "/main-depends/?q=foo", 

183 200, 

184 {"in": "main-depends", "params": {"q": "foo", "skip": 5, "limit": 10}}, 

185 ), 

186 ( 

187 "/main-depends/?q=foo&skip=100&limit=200", 

188 200, 

189 {"in": "main-depends", "params": {"q": "foo", "skip": 5, "limit": 10}}, 

190 ), 

191 ("/decorator-depends/", 200, {"in": "decorator-depends"}), 

192 ( 

193 "/router-depends/", 

194 200, 

195 {"in": "router-depends", "params": {"q": None, "skip": 5, "limit": 10}}, 

196 ), 

197 ( 

198 "/router-depends/?q=foo", 

199 200, 

200 {"in": "router-depends", "params": {"q": "foo", "skip": 5, "limit": 10}}, 

201 ), 

202 ( 

203 "/router-depends/?q=foo&skip=100&limit=200", 

204 200, 

205 {"in": "router-depends", "params": {"q": "foo", "skip": 5, "limit": 10}}, 

206 ), 

207 ("/router-decorator-depends/", 200, {"in": "router-decorator-depends"}), 

208 ], 

209) 

210def test_override_simple(url, status_code, expected): 1abcd

211 app.dependency_overrides[common_parameters] = overrider_dependency_simple 1feg

212 response = client.get(url) 1feg

213 assert response.status_code == status_code 1feg

214 assert response.json() == expected 1feg

215 app.dependency_overrides = {} 1feg

216 

217 

218def test_override_with_sub_main_depends(): 1abcd

219 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1StT

220 response = client.get("/main-depends/") 1StT

221 assert response.status_code == 422 1StT

222 assert response.json() == { 1StT

223 "detail": [ 

224 { 

225 "type": "missing", 

226 "loc": ["query", "k"], 

227 "msg": "Field required", 

228 "input": None, 

229 } 

230 ] 

231 } 

232 

233 app.dependency_overrides = {} 1StT

234 

235 

236def test_override_with_sub__main_depends_q_foo(): 1abcd

237 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1UVW

238 response = client.get("/main-depends/?q=foo") 1UVW

239 assert response.status_code == 422 1UVW

240 assert response.json() == { 1UVW

241 "detail": [ 

242 { 

243 "type": "missing", 

244 "loc": ["query", "k"], 

245 "msg": "Field required", 

246 "input": None, 

247 } 

248 ] 

249 } 

250 

251 app.dependency_overrides = {} 1UVW

252 

253 

254def test_override_with_sub_main_depends_k_bar(): 1abcd

255 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1hij

256 response = client.get("/main-depends/?k=bar") 1hij

257 assert response.status_code == 200 1hij

258 assert response.json() == {"in": "main-depends", "params": {"k": "bar"}} 1hij

259 app.dependency_overrides = {} 1hij

260 

261 

262def test_override_with_sub_decorator_depends(): 1abcd

263 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1XYZ

264 response = client.get("/decorator-depends/") 1XYZ

265 assert response.status_code == 422 1XYZ

266 assert response.json() == { 1XYZ

267 "detail": [ 

268 { 

269 "type": "missing", 

270 "loc": ["query", "k"], 

271 "msg": "Field required", 

272 "input": None, 

273 } 

274 ] 

275 } 

276 

277 app.dependency_overrides = {} 1XYZ

278 

279 

280def test_override_with_sub_decorator_depends_q_foo(): 1abcd

281 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1012

282 response = client.get("/decorator-depends/?q=foo") 1012

283 assert response.status_code == 422 1012

284 assert response.json() == { 1012

285 "detail": [ 

286 { 

287 "type": "missing", 

288 "loc": ["query", "k"], 

289 "msg": "Field required", 

290 "input": None, 

291 } 

292 ] 

293 } 

294 

295 app.dependency_overrides = {} 1012

296 

297 

298def test_override_with_sub_decorator_depends_k_bar(): 1abcd

299 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1klm

300 response = client.get("/decorator-depends/?k=bar") 1klm

301 assert response.status_code == 200 1klm

302 assert response.json() == {"in": "decorator-depends"} 1klm

303 app.dependency_overrides = {} 1klm

304 

305 

306def test_override_with_sub_router_depends(): 1abcd

307 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1345

308 response = client.get("/router-depends/") 1345

309 assert response.status_code == 422 1345

310 assert response.json() == { 1345

311 "detail": [ 

312 { 

313 "type": "missing", 

314 "loc": ["query", "k"], 

315 "msg": "Field required", 

316 "input": None, 

317 } 

318 ] 

319 } 

320 

321 app.dependency_overrides = {} 1345

322 

323 

324def test_override_with_sub_router_depends_q_foo(): 1abcd

325 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1678

326 response = client.get("/router-depends/?q=foo") 1678

327 assert response.status_code == 422 1678

328 assert response.json() == { 1678

329 "detail": [ 

330 { 

331 "type": "missing", 

332 "loc": ["query", "k"], 

333 "msg": "Field required", 

334 "input": None, 

335 } 

336 ] 

337 } 

338 

339 app.dependency_overrides = {} 1678

340 

341 

342def test_override_with_sub_router_depends_k_bar(): 1abcd

343 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1nop

344 response = client.get("/router-depends/?k=bar") 1nop

345 assert response.status_code == 200 1nop

346 assert response.json() == {"in": "router-depends", "params": {"k": "bar"}} 1nop

347 app.dependency_overrides = {} 1nop

348 

349 

350def test_override_with_sub_router_decorator_depends(): 1abcd

351 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 19!#

352 response = client.get("/router-decorator-depends/") 19!#

353 assert response.status_code == 422 19!#

354 assert response.json() == { 19!#

355 "detail": [ 

356 { 

357 "type": "missing", 

358 "loc": ["query", "k"], 

359 "msg": "Field required", 

360 "input": None, 

361 } 

362 ] 

363 } 

364 

365 app.dependency_overrides = {} 19!#

366 

367 

368def test_override_with_sub_router_decorator_depends_q_foo(): 1abcd

369 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1$%'

370 response = client.get("/router-decorator-depends/?q=foo") 1$%'

371 assert response.status_code == 422 1$%'

372 assert response.json() == { 1$%'

373 "detail": [ 

374 { 

375 "type": "missing", 

376 "loc": ["query", "k"], 

377 "msg": "Field required", 

378 "input": None, 

379 } 

380 ] 

381 } 

382 

383 app.dependency_overrides = {} 1$%'

384 

385 

386def test_override_with_sub_router_decorator_depends_k_bar(): 1abcd

387 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1qrs

388 response = client.get("/router-decorator-depends/?k=bar") 1qrs

389 assert response.status_code == 200 1qrs

390 assert response.json() == {"in": "router-decorator-depends"} 1qrs

391 app.dependency_overrides = {} 1qrs