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
« 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
5app = FastAPI() 1abcd
7router = APIRouter() 1abcd
10async def common_parameters(q: str, skip: int = 0, limit: int = 100): 1abcd
11 return {"q": q, "skip": skip, "limit": limit} 1STUVWXYZ0123456789!#$%'()*
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
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
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 ) *
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 ' (
34app.include_router(router) 1abcd
36client = TestClient(app) 1abcd
39async def overrider_dependency_simple(q: str | None = None): 1abcd
40 return {"q": q, "skip": 5, "limit": 10} 1zqrsLCDEQRAtuvMFGHBwxyNIJK
43async def overrider_sub_dependency(k: str): 1abcd
44 return {"k": k} 1henkOPifoljgpm
47async def overrider_dependency_with_sub(msg: dict = Depends(overrider_sub_dependency)): 1abcd
48 return msg 1henkOPifoljgpm
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 }
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 }
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 }
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 }
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 #
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 !
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 }
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 }
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 }
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 }
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 (
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 '
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
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 }
231 app.dependency_overrides = {} 1+,-.
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 }
249 app.dependency_overrides = {} 1/:;=
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
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 }
275 app.dependency_overrides = {} 1?@[]
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 }
293 app.dependency_overrides = {} 1^_`{
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
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 }
319 app.dependency_overrides = {} 2| } ~ ab
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 }
337 app.dependency_overrides = {} 2bbcbdbeb
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
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 }
363 app.dependency_overrides = {} 2gbhbibjb
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 }
381 app.dependency_overrides = {} 2kblbmbnb
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