Coverage for tests / test_dependency_cache.py: 100%
54 statements
« prev ^ index » next coverage.py v7.13.3, created at 2026-02-12 18:15 +0000
« prev ^ index » next coverage.py v7.13.3, created at 2026-02-12 18:15 +0000
1from fastapi import Depends, FastAPI, Security 1abcd
2from fastapi.testclient import TestClient 1abcd
4app = FastAPI() 1abcd
6counter_holder = {"counter": 0} 1abcd
9async def dep_counter(): 1abcd
10 counter_holder["counter"] += 1 1klefmnghopij
11 return counter_holder["counter"] 1klefmnghopij
14async def super_dep(count: int = Depends(dep_counter)): 1abcd
15 return count 1efghij
18@app.get("/counter/") 1abcd
19async def get_counter(count: int = Depends(dep_counter)): 1abcd
20 return {"counter": count} 1kmo
23@app.get("/sub-counter/") 1abcd
24async def get_sub_counter( 1abcd
25 subcount: int = Depends(super_dep), count: int = Depends(dep_counter)
26):
27 return {"counter": count, "subcounter": subcount} 1egi
30@app.get("/sub-counter-no-cache/") 1abcd
31async def get_sub_counter_no_cache( 1abcd
32 subcount: int = Depends(super_dep),
33 count: int = Depends(dep_counter, use_cache=False),
34):
35 return {"counter": count, "subcounter": subcount} 1fhj
38@app.get("/scope-counter") 1abcd
39async def get_scope_counter( 1abcd
40 count: int = Security(dep_counter),
41 scope_count_1: int = Security(dep_counter, scopes=["scope"]),
42 scope_count_2: int = Security(dep_counter, scopes=["scope"]),
43):
44 return { 1lnp
45 "counter": count,
46 "scope_counter_1": scope_count_1,
47 "scope_counter_2": scope_count_2,
48 }
51client = TestClient(app) 1abcd
54def test_normal_counter(): 1abcd
55 counter_holder["counter"] = 0 1kmo
56 response = client.get("/counter/") 1kmo
57 assert response.status_code == 200, response.text 1kmo
58 assert response.json() == {"counter": 1} 1kmo
59 response = client.get("/counter/") 1kmo
60 assert response.status_code == 200, response.text 1kmo
61 assert response.json() == {"counter": 2} 1kmo
64def test_sub_counter(): 1abcd
65 counter_holder["counter"] = 0 1egi
66 response = client.get("/sub-counter/") 1egi
67 assert response.status_code == 200, response.text 1egi
68 assert response.json() == {"counter": 1, "subcounter": 1} 1egi
69 response = client.get("/sub-counter/") 1egi
70 assert response.status_code == 200, response.text 1egi
71 assert response.json() == {"counter": 2, "subcounter": 2} 1egi
74def test_sub_counter_no_cache(): 1abcd
75 counter_holder["counter"] = 0 1fhj
76 response = client.get("/sub-counter-no-cache/") 1fhj
77 assert response.status_code == 200, response.text 1fhj
78 assert response.json() == {"counter": 2, "subcounter": 1} 1fhj
79 response = client.get("/sub-counter-no-cache/") 1fhj
80 assert response.status_code == 200, response.text 1fhj
81 assert response.json() == {"counter": 4, "subcounter": 3} 1fhj
84def test_security_cache(): 1abcd
85 counter_holder["counter"] = 0 1lnp
86 response = client.get("/scope-counter/") 1lnp
87 assert response.status_code == 200, response.text 1lnp
88 assert response.json() == {"counter": 1, "scope_counter_1": 2, "scope_counter_2": 2} 1lnp
89 response = client.get("/scope-counter/") 1lnp
90 assert response.status_code == 200, response.text 1lnp
91 assert response.json() == {"counter": 3, "scope_counter_1": 4, "scope_counter_2": 4} 1lnp