Coverage for tests / test_dependency_class.py: 100%

73 statements  

« prev     ^ index     » next       coverage.py v7.13.3, created at 2026-02-12 18:15 +0000

1from collections.abc import AsyncGenerator, Generator 1abcd

2 

3import pytest 1abcd

4from fastapi import Depends, FastAPI 1abcd

5from fastapi.testclient import TestClient 1abcd

6 

7app = FastAPI() 1abcd

8 

9 

10class CallableDependency: 1abcd

11 def __call__(self, value: str) -> str: 1abcd

12 return value 1efg

13 

14 

15class CallableGenDependency: 1abcd

16 def __call__(self, value: str) -> Generator[str, None, None]: 1abcd

17 yield value 1efg

18 

19 

20class AsyncCallableDependency: 1abcd

21 async def __call__(self, value: str) -> str: 1abcd

22 return value 1efg

23 

24 

25class AsyncCallableGenDependency: 1abcd

26 async def __call__(self, value: str) -> AsyncGenerator[str, None]: 1abcd

27 yield value 1efg

28 

29 

30class MethodsDependency: 1abcd

31 def synchronous(self, value: str) -> str: 1abcd

32 return value 1efg

33 

34 async def asynchronous(self, value: str) -> str: 1abcd

35 return value 1efg

36 

37 def synchronous_gen(self, value: str) -> Generator[str, None, None]: 1abcd

38 yield value 1efg

39 

40 async def asynchronous_gen(self, value: str) -> AsyncGenerator[str, None]: 1abcd

41 yield value 1efg

42 

43 

44callable_dependency = CallableDependency() 1abcd

45callable_gen_dependency = CallableGenDependency() 1abcd

46async_callable_dependency = AsyncCallableDependency() 1abcd

47async_callable_gen_dependency = AsyncCallableGenDependency() 1abcd

48methods_dependency = MethodsDependency() 1abcd

49 

50 

51@app.get("/callable-dependency-class") 1abcd

52async def get_callable_dependency_class( 1abcd

53 value: str, instance: CallableDependency = Depends() 

54): 

55 return instance(value) 1efg

56 

57 

58@app.get("/callable-gen-dependency-class") 1abcd

59async def get_callable_gen_dependency_class( 1abcd

60 value: str, instance: CallableGenDependency = Depends() 

61): 

62 return next(instance(value)) 1efg

63 

64 

65@app.get("/async-callable-dependency-class") 1abcd

66async def get_async_callable_dependency_class( 1abcd

67 value: str, instance: AsyncCallableDependency = Depends() 

68): 

69 return await instance(value) 1efg

70 

71 

72@app.get("/async-callable-gen-dependency-class") 1abcd

73async def get_async_callable_gen_dependency_class( 1abcd

74 value: str, instance: AsyncCallableGenDependency = Depends() 

75): 

76 return await instance(value).__anext__() 1efg

77 

78 

79@app.get("/callable-dependency") 1abcd

80async def get_callable_dependency(value: str = Depends(callable_dependency)): 1abcd

81 return value 1efg

82 

83 

84@app.get("/callable-gen-dependency") 1abcd

85async def get_callable_gen_dependency(value: str = Depends(callable_gen_dependency)): 1abcd

86 return value 1efg

87 

88 

89@app.get("/async-callable-dependency") 1abcd

90async def get_async_callable_dependency( 1abcd

91 value: str = Depends(async_callable_dependency), 

92): 

93 return value 1efg

94 

95 

96@app.get("/async-callable-gen-dependency") 1abcd

97async def get_async_callable_gen_dependency( 1abcd

98 value: str = Depends(async_callable_gen_dependency), 

99): 

100 return value 1efg

101 

102 

103@app.get("/synchronous-method-dependency") 1abcd

104async def get_synchronous_method_dependency( 1abcd

105 value: str = Depends(methods_dependency.synchronous), 

106): 

107 return value 1efg

108 

109 

110@app.get("/synchronous-method-gen-dependency") 1abcd

111async def get_synchronous_method_gen_dependency( 1abcd

112 value: str = Depends(methods_dependency.synchronous_gen), 

113): 

114 return value 1efg

115 

116 

117@app.get("/asynchronous-method-dependency") 1abcd

118async def get_asynchronous_method_dependency( 1abcd

119 value: str = Depends(methods_dependency.asynchronous), 

120): 

121 return value 1efg

122 

123 

124@app.get("/asynchronous-method-gen-dependency") 1abcd

125async def get_asynchronous_method_gen_dependency( 1abcd

126 value: str = Depends(methods_dependency.asynchronous_gen), 

127): 

128 return value 1efg

129 

130 

131client = TestClient(app) 1abcd

132 

133 

134@pytest.mark.parametrize( 1abcd

135 "route,value", 

136 [ 

137 ("/callable-dependency", "callable-dependency"), 

138 ("/callable-gen-dependency", "callable-gen-dependency"), 

139 ("/async-callable-dependency", "async-callable-dependency"), 

140 ("/async-callable-gen-dependency", "async-callable-gen-dependency"), 

141 ("/synchronous-method-dependency", "synchronous-method-dependency"), 

142 ("/synchronous-method-gen-dependency", "synchronous-method-gen-dependency"), 

143 ("/asynchronous-method-dependency", "asynchronous-method-dependency"), 

144 ("/asynchronous-method-gen-dependency", "asynchronous-method-gen-dependency"), 

145 ("/callable-dependency-class", "callable-dependency-class"), 

146 ("/callable-gen-dependency-class", "callable-gen-dependency-class"), 

147 ("/async-callable-dependency-class", "async-callable-dependency-class"), 

148 ("/async-callable-gen-dependency-class", "async-callable-gen-dependency-class"), 

149 ], 

150) 

151def test_class_dependency(route, value): 1abcd

152 response = client.get(route, params={"value": value}) 1efg

153 assert response.status_code == 200, response.text 1efg

154 assert response.json() == value 1efg