Coverage for tests / test_dependency_overrides.py: 100%

154 statements  

« prev     ^ index     » next       coverage.py v7.13.3, created at 2026-02-21 17:29 +0000

1import pytest 1abcd

2from fastapi import APIRouter, Depends, FastAPI 1abcd

3from fastapi.testclient import TestClient 1abcd

4 

5app = FastAPI() 1abcd

6 

7router = APIRouter() 1abcd

8 

9 

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

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

12 

13 

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

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

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

17 

18 

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

20async def decorator_depends(): 1abcd

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

22 

23 

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

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

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

27 

28 

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

30async def router_decorator_depends(): 1abcd

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

32 

33 

34app.include_router(router) 1abcd

35 

36client = TestClient(app) 1abcd

37 

38 

39async def overrider_dependency_simple(q: str | None = None): 1abecd

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

41 

42 

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

44 return {"k": k} 1khqnliromjsp

45 

46 

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

48 return msg 1khqnliromjsp

49 

50 

51def test_main_depends(): 1abcd

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

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

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

55 "detail": [ 

56 { 

57 "type": "missing", 

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

59 "msg": "Field required", 

60 "input": None, 

61 } 

62 ] 

63 } 

64 

65 

66def test_main_depends_q_foo(): 1abcd

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

68 assert response.status_code == 200 1wEM

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

70 "in": "main-depends", 

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

72 } 

73 

74 

75def test_main_depends_q_foo_skip_100_limit_200(): 1abcd

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

77 assert response.status_code == 200 1xFN

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

79 "in": "main-depends", 

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

81 } 

82 

83 

84def test_decorator_depends(): 1abcd

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

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

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

88 "detail": [ 

89 { 

90 "type": "missing", 

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

92 "msg": "Field required", 

93 "input": None, 

94 } 

95 ] 

96 } 

97 

98 

99def test_decorator_depends_q_foo(): 1abcd

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

101 assert response.status_code == 200 1uCK

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

103 

104 

105def test_decorator_depends_q_foo_skip_100_limit_200(): 1abcd

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

107 assert response.status_code == 200 1vDL

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

109 

110 

111def test_router_depends(): 1abcd

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

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

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

115 "detail": [ 

116 { 

117 "type": "missing", 

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

119 "msg": "Field required", 

120 "input": None, 

121 } 

122 ] 

123 } 

124 

125 

126def test_router_depends_q_foo(): 1abcd

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

128 assert response.status_code == 200 1AIQ

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

130 "in": "router-depends", 

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

132 } 

133 

134 

135def test_router_depends_q_foo_skip_100_limit_200(): 1abcd

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

137 assert response.status_code == 200 1BJR

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

139 "in": "router-depends", 

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

141 } 

142 

143 

144def test_router_decorator_depends(): 1abcd

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

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

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

148 "detail": [ 

149 { 

150 "type": "missing", 

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

152 "msg": "Field required", 

153 "input": None, 

154 } 

155 ] 

156 } 

157 

158 

159def test_router_decorator_depends_q_foo(): 1abcd

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

161 assert response.status_code == 200 1yGO

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

163 

164 

165def test_router_decorator_depends_q_foo_skip_100_limit_200(): 1abcd

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

167 assert response.status_code == 200 1zHP

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

169 

170 

171@pytest.mark.parametrize( 1abcd

172 "url,status_code,expected", 

173 [ 

174 ( 

175 "/main-depends/", 

176 200, 

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

178 ), 

179 ( 

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

181 200, 

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

183 ), 

184 ( 

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

186 200, 

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

188 ), 

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

190 ( 

191 "/router-depends/", 

192 200, 

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

194 ), 

195 ( 

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

197 200, 

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

199 ), 

200 ( 

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

202 200, 

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

204 ), 

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

206 ], 

207) 

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

209 app.dependency_overrides[common_parameters] = overrider_dependency_simple 1feg

210 response = client.get(url) 1feg

211 assert response.status_code == status_code 1feg

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

213 app.dependency_overrides = {} 1feg

214 

215 

216def test_override_with_sub_main_depends(): 1abcd

217 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1StT

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

219 assert response.status_code == 422 1StT

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

221 "detail": [ 

222 { 

223 "type": "missing", 

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

225 "msg": "Field required", 

226 "input": None, 

227 } 

228 ] 

229 } 

230 

231 app.dependency_overrides = {} 1StT

232 

233 

234def test_override_with_sub__main_depends_q_foo(): 1abcd

235 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1UVW

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

237 assert response.status_code == 422 1UVW

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

239 "detail": [ 

240 { 

241 "type": "missing", 

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

243 "msg": "Field required", 

244 "input": None, 

245 } 

246 ] 

247 } 

248 

249 app.dependency_overrides = {} 1UVW

250 

251 

252def test_override_with_sub_main_depends_k_bar(): 1abcd

253 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1hij

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

255 assert response.status_code == 200 1hij

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

257 app.dependency_overrides = {} 1hij

258 

259 

260def test_override_with_sub_decorator_depends(): 1abcd

261 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1XYZ

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

263 assert response.status_code == 422 1XYZ

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

265 "detail": [ 

266 { 

267 "type": "missing", 

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

269 "msg": "Field required", 

270 "input": None, 

271 } 

272 ] 

273 } 

274 

275 app.dependency_overrides = {} 1XYZ

276 

277 

278def test_override_with_sub_decorator_depends_q_foo(): 1abcd

279 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1012

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

281 assert response.status_code == 422 1012

282 assert response.json() == { 1012

283 "detail": [ 

284 { 

285 "type": "missing", 

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

287 "msg": "Field required", 

288 "input": None, 

289 } 

290 ] 

291 } 

292 

293 app.dependency_overrides = {} 1012

294 

295 

296def test_override_with_sub_decorator_depends_k_bar(): 1abcd

297 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1klm

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

299 assert response.status_code == 200 1klm

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

301 app.dependency_overrides = {} 1klm

302 

303 

304def test_override_with_sub_router_depends(): 1abcd

305 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1345

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

307 assert response.status_code == 422 1345

308 assert response.json() == { 1345

309 "detail": [ 

310 { 

311 "type": "missing", 

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

313 "msg": "Field required", 

314 "input": None, 

315 } 

316 ] 

317 } 

318 

319 app.dependency_overrides = {} 1345

320 

321 

322def test_override_with_sub_router_depends_q_foo(): 1abcd

323 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1678

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

325 assert response.status_code == 422 1678

326 assert response.json() == { 1678

327 "detail": [ 

328 { 

329 "type": "missing", 

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

331 "msg": "Field required", 

332 "input": None, 

333 } 

334 ] 

335 } 

336 

337 app.dependency_overrides = {} 1678

338 

339 

340def test_override_with_sub_router_depends_k_bar(): 1abcd

341 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1nop

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

343 assert response.status_code == 200 1nop

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

345 app.dependency_overrides = {} 1nop

346 

347 

348def test_override_with_sub_router_decorator_depends(): 1abcd

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

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

351 assert response.status_code == 422 19!#

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

353 "detail": [ 

354 { 

355 "type": "missing", 

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

357 "msg": "Field required", 

358 "input": None, 

359 } 

360 ] 

361 } 

362 

363 app.dependency_overrides = {} 19!#

364 

365 

366def test_override_with_sub_router_decorator_depends_q_foo(): 1abcd

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

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

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

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

371 "detail": [ 

372 { 

373 "type": "missing", 

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

375 "msg": "Field required", 

376 "input": None, 

377 } 

378 ] 

379 } 

380 

381 app.dependency_overrides = {} 1$%'

382 

383 

384def test_override_with_sub_router_decorator_depends_k_bar(): 1abcd

385 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1qrs

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

387 assert response.status_code == 200 1qrs

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

389 app.dependency_overrides = {} 1qrs