1
from typing import Optional
4
from dirty_equals import IsDict
5
from fastapi import APIRouter, Depends, FastAPI
6
from fastapi.testclient import TestClient
7
from fastapi.utils import match_pydantic_error_url
14
async def common_parameters(q: str, skip: int = 0, limit: int = 100):
15
return {"q": q, "skip": skip, "limit": limit}
18
@app.get("/main-depends/")
19
async def main_depends(commons: dict = Depends(common_parameters)):
20
return {"in": "main-depends", "params": commons}
23
@app.get("/decorator-depends/", dependencies=[Depends(common_parameters)])
24
async def decorator_depends():
25
return {"in": "decorator-depends"}
28
@router.get("/router-depends/")
29
async def router_depends(commons: dict = Depends(common_parameters)):
30
return {"in": "router-depends", "params": commons}
33
@router.get("/router-decorator-depends/", dependencies=[Depends(common_parameters)])
34
async def router_decorator_depends():
35
return {"in": "router-decorator-depends"}
38
app.include_router(router)
40
client = TestClient(app)
43
async def overrider_dependency_simple(q: Optional[str] = None):
44
return {"q": q, "skip": 5, "limit": 10}
47
async def overrider_sub_dependency(k: str):
51
async def overrider_dependency_with_sub(msg: dict = Depends(overrider_sub_dependency)):
55
def test_main_depends():
56
response = client.get("/main-depends/")
57
assert response.status_code == 422
58
assert response.json() == IsDict(
63
"loc": ["query", "q"],
64
"msg": "Field required",
66
"url": match_pydantic_error_url("missing"),
71
# TODO: remove when deprecating Pydantic v1
75
"loc": ["query", "q"],
76
"msg": "field required",
77
"type": "value_error.missing",
84
def test_main_depends_q_foo():
85
response = client.get("/main-depends/?q=foo")
86
assert response.status_code == 200
87
assert response.json() == {
89
"params": {"q": "foo", "skip": 0, "limit": 100},
93
def test_main_depends_q_foo_skip_100_limit_200():
94
response = client.get("/main-depends/?q=foo&skip=100&limit=200")
95
assert response.status_code == 200
96
assert response.json() == {
98
"params": {"q": "foo", "skip": 100, "limit": 200},
102
def test_decorator_depends():
103
response = client.get("/decorator-depends/")
104
assert response.status_code == 422
105
assert response.json() == IsDict(
110
"loc": ["query", "q"],
111
"msg": "Field required",
113
"url": match_pydantic_error_url("missing"),
118
# TODO: remove when deprecating Pydantic v1
122
"loc": ["query", "q"],
123
"msg": "field required",
124
"type": "value_error.missing",
131
def test_decorator_depends_q_foo():
132
response = client.get("/decorator-depends/?q=foo")
133
assert response.status_code == 200
134
assert response.json() == {"in": "decorator-depends"}
137
def test_decorator_depends_q_foo_skip_100_limit_200():
138
response = client.get("/decorator-depends/?q=foo&skip=100&limit=200")
139
assert response.status_code == 200
140
assert response.json() == {"in": "decorator-depends"}
143
def test_router_depends():
144
response = client.get("/router-depends/")
145
assert response.status_code == 422
146
assert response.json() == IsDict(
151
"loc": ["query", "q"],
152
"msg": "Field required",
154
"url": match_pydantic_error_url("missing"),
159
# TODO: remove when deprecating Pydantic v1
163
"loc": ["query", "q"],
164
"msg": "field required",
165
"type": "value_error.missing",
172
def test_router_depends_q_foo():
173
response = client.get("/router-depends/?q=foo")
174
assert response.status_code == 200
175
assert response.json() == {
176
"in": "router-depends",
177
"params": {"q": "foo", "skip": 0, "limit": 100},
181
def test_router_depends_q_foo_skip_100_limit_200():
182
response = client.get("/router-depends/?q=foo&skip=100&limit=200")
183
assert response.status_code == 200
184
assert response.json() == {
185
"in": "router-depends",
186
"params": {"q": "foo", "skip": 100, "limit": 200},
190
def test_router_decorator_depends():
191
response = client.get("/router-decorator-depends/")
192
assert response.status_code == 422
193
assert response.json() == IsDict(
198
"loc": ["query", "q"],
199
"msg": "Field required",
201
"url": match_pydantic_error_url("missing"),
206
# TODO remove when deprecating Pydantic v1
210
"loc": ["query", "q"],
211
"msg": "field required",
212
"type": "value_error.missing",
219
def test_router_decorator_depends_q_foo():
220
response = client.get("/router-decorator-depends/?q=foo")
221
assert response.status_code == 200
222
assert response.json() == {"in": "router-decorator-depends"}
225
def test_router_decorator_depends_q_foo_skip_100_limit_200():
226
response = client.get("/router-decorator-depends/?q=foo&skip=100&limit=200")
227
assert response.status_code == 200
228
assert response.json() == {"in": "router-decorator-depends"}
231
@pytest.mark.parametrize(
232
"url,status_code,expected",
237
{"in": "main-depends", "params": {"q": None, "skip": 5, "limit": 10}},
240
"/main-depends/?q=foo",
242
{"in": "main-depends", "params": {"q": "foo", "skip": 5, "limit": 10}},
245
"/main-depends/?q=foo&skip=100&limit=200",
247
{"in": "main-depends", "params": {"q": "foo", "skip": 5, "limit": 10}},
249
("/decorator-depends/", 200, {"in": "decorator-depends"}),
253
{"in": "router-depends", "params": {"q": None, "skip": 5, "limit": 10}},
256
"/router-depends/?q=foo",
258
{"in": "router-depends", "params": {"q": "foo", "skip": 5, "limit": 10}},
261
"/router-depends/?q=foo&skip=100&limit=200",
263
{"in": "router-depends", "params": {"q": "foo", "skip": 5, "limit": 10}},
265
("/router-decorator-depends/", 200, {"in": "router-decorator-depends"}),
268
def test_override_simple(url, status_code, expected):
269
app.dependency_overrides[common_parameters] = overrider_dependency_simple
270
response = client.get(url)
271
assert response.status_code == status_code
272
assert response.json() == expected
273
app.dependency_overrides = {}
276
def test_override_with_sub_main_depends():
277
app.dependency_overrides[common_parameters] = overrider_dependency_with_sub
278
response = client.get("/main-depends/")
279
assert response.status_code == 422
280
assert response.json() == IsDict(
285
"loc": ["query", "k"],
286
"msg": "Field required",
288
"url": match_pydantic_error_url("missing"),
293
# TODO: remove when deprecating Pydantic v1
297
"loc": ["query", "k"],
298
"msg": "field required",
299
"type": "value_error.missing",
304
app.dependency_overrides = {}
307
def test_override_with_sub__main_depends_q_foo():
308
app.dependency_overrides[common_parameters] = overrider_dependency_with_sub
309
response = client.get("/main-depends/?q=foo")
310
assert response.status_code == 422
311
assert response.json() == IsDict(
316
"loc": ["query", "k"],
317
"msg": "Field required",
319
"url": match_pydantic_error_url("missing"),
324
# TODO: remove when deprecating Pydantic v1
328
"loc": ["query", "k"],
329
"msg": "field required",
330
"type": "value_error.missing",
335
app.dependency_overrides = {}
338
def test_override_with_sub_main_depends_k_bar():
339
app.dependency_overrides[common_parameters] = overrider_dependency_with_sub
340
response = client.get("/main-depends/?k=bar")
341
assert response.status_code == 200
342
assert response.json() == {"in": "main-depends", "params": {"k": "bar"}}
343
app.dependency_overrides = {}
346
def test_override_with_sub_decorator_depends():
347
app.dependency_overrides[common_parameters] = overrider_dependency_with_sub
348
response = client.get("/decorator-depends/")
349
assert response.status_code == 422
350
assert response.json() == IsDict(
355
"loc": ["query", "k"],
356
"msg": "Field required",
358
"url": match_pydantic_error_url("missing"),
363
# TODO: remove when deprecating Pydantic v1
367
"loc": ["query", "k"],
368
"msg": "field required",
369
"type": "value_error.missing",
374
app.dependency_overrides = {}
377
def test_override_with_sub_decorator_depends_q_foo():
378
app.dependency_overrides[common_parameters] = overrider_dependency_with_sub
379
response = client.get("/decorator-depends/?q=foo")
380
assert response.status_code == 422
381
assert response.json() == IsDict(
386
"loc": ["query", "k"],
387
"msg": "Field required",
389
"url": match_pydantic_error_url("missing"),
394
# TODO: remove when deprecating Pydantic v1
398
"loc": ["query", "k"],
399
"msg": "field required",
400
"type": "value_error.missing",
405
app.dependency_overrides = {}
408
def test_override_with_sub_decorator_depends_k_bar():
409
app.dependency_overrides[common_parameters] = overrider_dependency_with_sub
410
response = client.get("/decorator-depends/?k=bar")
411
assert response.status_code == 200
412
assert response.json() == {"in": "decorator-depends"}
413
app.dependency_overrides = {}
416
def test_override_with_sub_router_depends():
417
app.dependency_overrides[common_parameters] = overrider_dependency_with_sub
418
response = client.get("/router-depends/")
419
assert response.status_code == 422
420
assert response.json() == IsDict(
425
"loc": ["query", "k"],
426
"msg": "Field required",
428
"url": match_pydantic_error_url("missing"),
433
# TODO remove when deprecating Pydantic v1
437
"loc": ["query", "k"],
438
"msg": "field required",
439
"type": "value_error.missing",
444
app.dependency_overrides = {}
447
def test_override_with_sub_router_depends_q_foo():
448
app.dependency_overrides[common_parameters] = overrider_dependency_with_sub
449
response = client.get("/router-depends/?q=foo")
450
assert response.status_code == 422
451
assert response.json() == IsDict(
456
"loc": ["query", "k"],
457
"msg": "Field required",
459
"url": match_pydantic_error_url("missing"),
464
# TODO remove when deprecating Pydantic v1
468
"loc": ["query", "k"],
469
"msg": "field required",
470
"type": "value_error.missing",
475
app.dependency_overrides = {}
478
def test_override_with_sub_router_depends_k_bar():
479
app.dependency_overrides[common_parameters] = overrider_dependency_with_sub
480
response = client.get("/router-depends/?k=bar")
481
assert response.status_code == 200
482
assert response.json() == {"in": "router-depends", "params": {"k": "bar"}}
483
app.dependency_overrides = {}
486
def test_override_with_sub_router_decorator_depends():
487
app.dependency_overrides[common_parameters] = overrider_dependency_with_sub
488
response = client.get("/router-decorator-depends/")
489
assert response.status_code == 422
490
assert response.json() == IsDict(
495
"loc": ["query", "k"],
496
"msg": "Field required",
498
"url": match_pydantic_error_url("missing"),
503
# TODO remove when deprecating Pydantic v1
507
"loc": ["query", "k"],
508
"msg": "field required",
509
"type": "value_error.missing",
514
app.dependency_overrides = {}
517
def test_override_with_sub_router_decorator_depends_q_foo():
518
app.dependency_overrides[common_parameters] = overrider_dependency_with_sub
519
response = client.get("/router-decorator-depends/?q=foo")
520
assert response.status_code == 422
521
assert response.json() == IsDict(
526
"loc": ["query", "k"],
527
"msg": "Field required",
529
"url": match_pydantic_error_url("missing"),
534
# TODO remove when deprecating Pydantic v1
538
"loc": ["query", "k"],
539
"msg": "field required",
540
"type": "value_error.missing",
545
app.dependency_overrides = {}
548
def test_override_with_sub_router_decorator_depends_k_bar():
549
app.dependency_overrides[common_parameters] = overrider_dependency_with_sub
550
response = client.get("/router-decorator-depends/?k=bar")
551
assert response.status_code == 200
552
assert response.json() == {"in": "router-decorator-depends"}
553
app.dependency_overrides = {}