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
« 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
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} 1uvwxyzABCDEFGHIJKLMNOPQR
14@app.get("/main-depends/") 1abcd
15async def main_depends(commons: dict = Depends(common_parameters)): 1abcd
16 return {"in": "main-depends", "params": commons} 1wxfhEFeiMNgj
19@app.get("/decorator-depends/", dependencies=[Depends(common_parameters)]) 1abcd
20async def decorator_depends(): 1abcd
21 return {"in": "decorator-depends"} 1uvfkCDelKLgm
24@router.get("/router-depends/") 1abcd
25async def router_depends(commons: dict = Depends(common_parameters)): 1abcd
26 return {"in": "router-depends", "params": commons} 1fnABeoIJgpQR
29@router.get("/router-decorator-depends/", dependencies=[Depends(common_parameters)]) 1abcd
30async def router_decorator_depends(): 1abcd
31 return {"in": "router-decorator-depends"} 1fqyzerGHgsOP
34app.include_router(router) 1abcd
36client = TestClient(app) 1abcd
39async def overrider_dependency_simple(q: str | None = None): 1abecd
40 return {"q": q, "skip": 5, "limit": 10} 1feg
43async def overrider_sub_dependency(k: str): 1abtcd
44 return {"k": k} 1khqnliromjsp
47async def overrider_dependency_with_sub(msg: dict = Depends(overrider_sub_dependency)): 1abtcd
48 return msg 1khqnliromjsp
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 }
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 }
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 }
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 }
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
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
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 }
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 }
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 }
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 }
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
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
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
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 }
231 app.dependency_overrides = {} 1StT
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 }
249 app.dependency_overrides = {} 1UVW
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
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 }
275 app.dependency_overrides = {} 1XYZ
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 }
293 app.dependency_overrides = {} 1012
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
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 }
319 app.dependency_overrides = {} 1345
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 }
337 app.dependency_overrides = {} 1678
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
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 }
363 app.dependency_overrides = {} 19!#
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 }
381 app.dependency_overrides = {} 1$%'
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