Coverage for tests / test_dependency_overrides.py: 100%

154 statements  

« prev     ^ index     » next       coverage.py v7.13.3, created at 2026-04-06 01:24 +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} 1STUVWXYZ0123456789!#$%'()*

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} 1UVqrse0145tuvf$%wxyg

17 

18 

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

20async def decorator_depends(): 1abcd

21 return {"in": "decorator-depends"} 2S T z h pbLb2 3 A i ! # B j

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} 2C D E k Y Z MbqbF G H l 8 9 I J K m ) *

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"} 2L n W X rbsbM o 6 7 N p ' (

32 

33 

34app.include_router(router) 1abcd

35 

36client = TestClient(app) 1abcd

37 

38 

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

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

41 

42 

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

44 return {"k": k} 1henkOPifoljgpm

45 

46 

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

48 return msg 1henkOPifoljgpm

49 

50 

51def test_main_depends(): 1abcd

52 response = client.get("/main-depends/") 2tbubvbwb

53 assert response.status_code == 422 2tbubvbwb

54 assert response.json() == { 2tbubvbwb

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") 1V15%

68 assert response.status_code == 200 1V15%

69 assert response.json() == { 1V15%

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") 1U04$

77 assert response.status_code == 200 1U04$

78 assert response.json() == { 1U04$

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/") 2xbybzbAb

86 assert response.status_code == 422 2xbybzbAb

87 assert response.json() == { 2xbybzbAb

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") 2T pb3 #

101 assert response.status_code == 200 2T pb3 #

102 assert response.json() == {"in": "decorator-depends"} 2T pb3 #

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") 2S Bb2 !

107 assert response.status_code == 200 2S Bb2 !

108 assert response.json() == {"in": "decorator-depends"} 2S Bb2 !

109 

110 

111def test_router_depends(): 1abcd

112 response = client.get("/router-depends/") 2CbDbEbFb

113 assert response.status_code == 422 2CbDbEbFb

114 assert response.json() == { 2CbDbEbFb

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") 2Z qb9 *

128 assert response.status_code == 200 2Z qb9 *

129 assert response.json() == { 2Z qb9 *

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") 2Y Gb8 )

137 assert response.status_code == 200 2Y Gb8 )

138 assert response.json() == { 2Y Gb8 )

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/") 2HbIbJbKb

146 assert response.status_code == 422 2HbIbJbKb

147 assert response.json() == { 2HbIbJbKb

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") 2X sb7 (

161 assert response.status_code == 200 2X sb7 (

162 assert response.json() == {"in": "router-decorator-depends"} 2X sb7 (

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") 2W rb6 '

167 assert response.status_code == 200 2W rb6 '

168 assert response.json() == {"in": "router-decorator-depends"} 2W rb6 '

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 1zqrsLCDEQRAtuvMFGHBwxyNIJK

210 response = client.get(url) 1zqrsLCDEQRAtuvMFGHBwxyNIJK

211 assert response.status_code == status_code 1zqrsLCDEQRAtuvMFGHBwxyNIJK

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

213 app.dependency_overrides = {} 1zqrsLCDEQRAtuvMFGHBwxyNIJK

214 

215 

216def test_override_with_sub_main_depends(): 1abcd

217 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1+,-.

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

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

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

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 = {} 1+,-.

232 

233 

234def test_override_with_sub__main_depends_q_foo(): 1abcd

235 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1/:;=

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

237 assert response.status_code == 422 1/:;=

238 assert response.json() == { 1/:;=

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 = {} 1/:;=

250 

251 

252def test_override_with_sub_main_depends_k_bar(): 1abcd

253 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1ePfg

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

255 assert response.status_code == 200 1ePfg

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

257 app.dependency_overrides = {} 1ePfg

258 

259 

260def test_override_with_sub_decorator_depends(): 1abcd

261 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1?@[]

262 response = client.get("/decorator-depends/") 1?@[]

263 assert response.status_code == 422 1?@[]

264 assert response.json() == { 1?@[]

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 = {} 1?@[]

276 

277 

278def test_override_with_sub_decorator_depends_q_foo(): 1abcd

279 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1^_`{

280 response = client.get("/decorator-depends/?q=foo") 1^_`{

281 assert response.status_code == 422 1^_`{

282 assert response.json() == { 1^_`{

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 = {} 1^_`{

294 

295 

296def test_override_with_sub_decorator_depends_k_bar(): 1abcd

297 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 1hOij

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

299 assert response.status_code == 200 1hOij

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

301 app.dependency_overrides = {} 1hOij

302 

303 

304def test_override_with_sub_router_depends(): 1abcd

305 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 2| } ~ ab

306 response = client.get("/router-depends/") 2| } ~ ab

307 assert response.status_code == 422 2| } ~ ab

308 assert response.json() == { 2| } ~ ab

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 = {} 2| } ~ ab

320 

321 

322def test_override_with_sub_router_depends_q_foo(): 1abcd

323 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 2bbcbdbeb

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

325 assert response.status_code == 422 2bbcbdbeb

326 assert response.json() == { 2bbcbdbeb

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 = {} 2bbcbdbeb

338 

339 

340def test_override_with_sub_router_depends_k_bar(): 1abcd

341 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 2k fbl m

342 response = client.get("/router-depends/?k=bar") 2k fbl m

343 assert response.status_code == 200 2k fbl m

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

345 app.dependency_overrides = {} 2k fbl m

346 

347 

348def test_override_with_sub_router_decorator_depends(): 1abcd

349 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 2gbhbibjb

350 response = client.get("/router-decorator-depends/") 2gbhbibjb

351 assert response.status_code == 422 2gbhbibjb

352 assert response.json() == { 2gbhbibjb

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 = {} 2gbhbibjb

364 

365 

366def test_override_with_sub_router_decorator_depends_q_foo(): 1abcd

367 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 2kblbmbnb

368 response = client.get("/router-decorator-depends/?q=foo") 2kblbmbnb

369 assert response.status_code == 422 2kblbmbnb

370 assert response.json() == { 2kblbmbnb

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 = {} 2kblbmbnb

382 

383 

384def test_override_with_sub_router_decorator_depends_k_bar(): 1abcd

385 app.dependency_overrides[common_parameters] = overrider_dependency_with_sub 2n obo p

386 response = client.get("/router-decorator-depends/?k=bar") 2n obo p

387 assert response.status_code == 200 2n obo p

388 assert response.json() == {"in": "router-decorator-depends"} 2n obo p

389 app.dependency_overrides = {} 2n obo p