Coverage for tests/test_dependency_cache.py: 100%

54 statements  

« prev     ^ index     » next       coverage.py v7.6.1, created at 2025-12-04 08:29 +0000

1from fastapi import Depends, FastAPI, Security 1abcdefg

2from fastapi.testclient import TestClient 1abcdefg

3 

4app = FastAPI() 1abcdefg

5 

6counter_holder = {"counter": 0} 1abcdefg

7 

8 

9async def dep_counter(): 1abcdefg

10 counter_holder["counter"] += 1 1vwhixyjkzAlmBCnoDEpqFGrsHItu

11 return counter_holder["counter"] 1vwhixyjkzAlmBCnoDEpqFGrsHItu

12 

13 

14async def super_dep(count: int = Depends(dep_counter)): 1abcdefg

15 return count 1hijklmnopqrstu

16 

17 

18@app.get("/counter/") 1abcdefg

19async def get_counter(count: int = Depends(dep_counter)): 1abcdefg

20 return {"counter": count} 1vxzBDFH

21 

22 

23@app.get("/sub-counter/") 1abcdefg

24async def get_sub_counter( 1abcdefg

25 subcount: int = Depends(super_dep), count: int = Depends(dep_counter) 

26): 

27 return {"counter": count, "subcounter": subcount} 1hjlnprt

28 

29 

30@app.get("/sub-counter-no-cache/") 1abcdefg

31async def get_sub_counter_no_cache( 1abcdefg

32 subcount: int = Depends(super_dep), 

33 count: int = Depends(dep_counter, use_cache=False), 

34): 

35 return {"counter": count, "subcounter": subcount} 1ikmoqsu

36 

37 

38@app.get("/scope-counter") 1abcdefg

39async def get_scope_counter( 1abcdefg

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 { 1wyACEGI

45 "counter": count, 

46 "scope_counter_1": scope_count_1, 

47 "scope_counter_2": scope_count_2, 

48 } 

49 

50 

51client = TestClient(app) 1abcdefg

52 

53 

54def test_normal_counter(): 1abcdefg

55 counter_holder["counter"] = 0 1vxzBDFH

56 response = client.get("/counter/") 1vxzBDFH

57 assert response.status_code == 200, response.text 1vxzBDFH

58 assert response.json() == {"counter": 1} 1vxzBDFH

59 response = client.get("/counter/") 1vxzBDFH

60 assert response.status_code == 200, response.text 1vxzBDFH

61 assert response.json() == {"counter": 2} 1vxzBDFH

62 

63 

64def test_sub_counter(): 1abcdefg

65 counter_holder["counter"] = 0 1hjlnprt

66 response = client.get("/sub-counter/") 1hjlnprt

67 assert response.status_code == 200, response.text 1hjlnprt

68 assert response.json() == {"counter": 1, "subcounter": 1} 1hjlnprt

69 response = client.get("/sub-counter/") 1hjlnprt

70 assert response.status_code == 200, response.text 1hjlnprt

71 assert response.json() == {"counter": 2, "subcounter": 2} 1hjlnprt

72 

73 

74def test_sub_counter_no_cache(): 1abcdefg

75 counter_holder["counter"] = 0 1ikmoqsu

76 response = client.get("/sub-counter-no-cache/") 1ikmoqsu

77 assert response.status_code == 200, response.text 1ikmoqsu

78 assert response.json() == {"counter": 2, "subcounter": 1} 1ikmoqsu

79 response = client.get("/sub-counter-no-cache/") 1ikmoqsu

80 assert response.status_code == 200, response.text 1ikmoqsu

81 assert response.json() == {"counter": 4, "subcounter": 3} 1ikmoqsu

82 

83 

84def test_security_cache(): 1abcdefg

85 counter_holder["counter"] = 0 1wyACEGI

86 response = client.get("/scope-counter/") 1wyACEGI

87 assert response.status_code == 200, response.text 1wyACEGI

88 assert response.json() == {"counter": 1, "scope_counter_1": 2, "scope_counter_2": 2} 1wyACEGI

89 response = client.get("/scope-counter/") 1wyACEGI

90 assert response.status_code == 200, response.text 1wyACEGI

91 assert response.json() == {"counter": 3, "scope_counter_1": 4, "scope_counter_2": 4} 1wyACEGI