Coverage for tests/async/test_cast.py: 100%

122 statements  

« prev     ^ index     » next       coverage.py v7.17.3, created at 2026-11-13 05:19 +0000

1from collections.abc import Iterator 1abcdefghijklmnopqrst

2 

3import pytest 1abcdefghijklmnopqrst

4 

5from fast_depends import inject 1abcdefghijklmnopqrst

6from fast_depends.exceptions import ValidationError 1abcdefghijklmnopqrst

7from tests.marks import serializer 1abcdefghijklmnopqrst

8 

9 

10@pytest.mark.anyio 1abcdefghijklmnopqrst

11async def test_skip_not_required() -> None: 1abcdefghijklmnopqrst

12 @inject(serializer_cls=None) 1abcdefghijklmnopqrst

13 async def some_func() -> int: 1abcdefghijklmnopqrst

14 return 1 1abcdefghijklmnopqrst

15 

16 assert await some_func(useless=object()) == 1 1abcdefghijklmnopqrst

17 

18 

19@pytest.mark.anyio 1abcdefghijklmnopqrst

20async def test_not_annotated() -> None: 1abcdefghijklmnopqrst

21 @inject 1abcdefghijklmnopqrst

22 async def some_func(a, b): 1abcdefghijklmnopqrst

23 return a + b 1abcdefghijklmnopqrst

24 

25 assert isinstance(await some_func("1", "2"), str) 1abcdefghijklmnopqrst

26 

27 

28@pytest.mark.anyio 1abcdefghijklmnopqrst

29async def test_arbitrary_args() -> None: 1abcdefghijklmnopqrst

30 class ArbitraryType: 1abcdefghijklmnopqrst

31 def __init__(self): 1abcdefghijklmnopqrst

32 self.value = "value" 1abcdefghijklmnopqrst

33 

34 @inject 1abcdefghijklmnopqrst

35 async def some_func(a: ArbitraryType): 1abcdefghijklmnopqrst

36 return a 1abcdefghijklmnopqrst

37 

38 assert isinstance(await some_func(ArbitraryType()), ArbitraryType) 1abcdefghijklmnopqrst

39 

40 

41@pytest.mark.anyio 1abcdefghijklmnopqrst

42async def test_arbitrary_response() -> None: 1abcdefghijklmnopqrst

43 class ArbitraryType: 1abcdefghijklmnopqrst

44 def __init__(self): 1abcdefghijklmnopqrst

45 self.value = "value" 1abcdefghijklmnopqrst

46 

47 @inject 1abcdefghijklmnopqrst

48 async def some_func(a: ArbitraryType) -> ArbitraryType: 1abcdefghijklmnopqrst

49 return a 1abcdefghijklmnopqrst

50 

51 assert isinstance(await some_func(ArbitraryType()), ArbitraryType) 1abcdefghijklmnopqrst

52 

53 

54@pytest.mark.anyio 1abcdefghijklmnopqrst

55async def test_args() -> None: 1abcdefghijklmnopqrst

56 @inject 1abcdefghijklmnopqrst

57 async def some_func(a, *ar): 1abcdefghijklmnopqrst

58 return a, ar 1abcdefghijklmnopqrst

59 

60 assert (1, (2,)) == await some_func(1, 2) 1abcdefghijklmnopqrst

61 

62 

63@pytest.mark.anyio 1abcdefghijklmnopqrst

64async def test_args_kwargs_1() -> None: 1abcdefghijklmnopqrst

65 @inject 1abcdefghijklmnopqrst

66 async def simple_func( 1abcdefghijklmnopqrst

67 a: int, 

68 *args: tuple[float, ...], 

69 b: int, 

70 **kwargs: dict[str, int], 

71 ): 

72 return a, args, b, kwargs 1abcdefghijklmnopqrst

73 

74 assert (1, (2.0, 3.0), 3, {"key": 1}) == await simple_func( 1abcdefghijklmnopqrst

75 1.0, 2.0, 3, b=3.0, key=1.0 

76 ) 

77 

78 

79@pytest.mark.anyio 1abcdefghijklmnopqrst

80async def test_args_kwargs_2() -> None: 1abcdefghijklmnopqrst

81 @inject 1abcdefghijklmnopqrst

82 async def simple_func( 1abcdefghijklmnopqrst

83 a: int, 

84 *args: tuple[float, ...], 

85 b: int, 

86 ): 

87 return a, args, b 1abcdefghijklmnopqrst

88 

89 assert (1, (2.0, 3.0), 3) == await simple_func( 1abcdefghijklmnopqrst

90 1.0, 

91 2.0, 

92 3, 

93 b=3.0, 

94 ) 

95 

96 

97@pytest.mark.anyio 1abcdefghijklmnopqrst

98async def test_args_kwargs_3() -> None: 1abcdefghijklmnopqrst

99 @inject 1abcdefghijklmnopqrst

100 async def simple_func(a: int, *, b: int): 1abcdefghijklmnopqrst

101 return a, b 1abcdefghijklmnopqrst

102 

103 assert (1, 3) == await simple_func( 1abcdefghijklmnopqrst

104 1.0, 

105 b=3.0, 

106 ) 

107 

108 

109@pytest.mark.anyio 1abcdefghijklmnopqrst

110async def test_args_kwargs_4() -> None: 1abcdefghijklmnopqrst

111 @inject 1abcdefghijklmnopqrst

112 async def simple_func( 1abcdefghijklmnopqrst

113 *args: tuple[float, ...], 

114 **kwargs: dict[str, int], 

115 ): 

116 return args, kwargs 1abcdefghijklmnopqrst

117 

118 assert ( 1abcdefghijklmnopqrst

119 (1.0, 2.0, 3.0), 

120 { 

121 "key": 1, 

122 "b": 3, 

123 }, 

124 ) == await simple_func(1.0, 2.0, 3, b=3.0, key=1.0) 

125 

126 

127@pytest.mark.anyio 1abcdefghijklmnopqrst

128async def test_args_kwargs_5() -> None: 1abcdefghijklmnopqrst

129 @inject 1abcdefghijklmnopqrst

130 async def simple_func( 1abcdefghijklmnopqrst

131 *a: tuple[float, ...], 

132 **kw: dict[str, int], 

133 ): 

134 return a, kw 1abcdefghijklmnopqrst

135 

136 assert ( 1abcdefghijklmnopqrst

137 (1.0, 2.0, 3.0), 

138 { 

139 "key": 1, 

140 "b": 3, 

141 }, 

142 ) == await simple_func(1.0, 2.0, 3, b=3.0, key=1.0) 

143 

144 

145@serializer 1abcdefghijklmnopqrst

146@pytest.mark.anyio 1abcdefghijklmnopqrst

147class TestSerialization: 1abcdefghijklmnopqrst

148 async def test_no_cast_result(self) -> None: 1abcdefghijklmnopqrst

149 @inject(cast_result=False) 1abcdefghijklmnopqr

150 async def some_func(a: int, b: int) -> str: 1abcdefghijklmnopqr

151 return a + b 1abcdefghijklmnopqr

152 

153 assert await some_func("1", "2") == 3 1abcdefghijklmnopqr

154 

155 async def test_annotated_partial(self) -> None: 1abcdefghijklmnopqrst

156 @inject 1abcdefghijklmnopqr

157 async def some_func(a, b: int): 1abcdefghijklmnopqr

158 assert isinstance(b, int) 1abcdefghijklmnopqr

159 return a + b 1abcdefghijklmnopqr

160 

161 assert isinstance(await some_func(1, "2"), int) 1abcdefghijklmnopqr

162 

163 async def test_types_casting(self) -> None: 1abcdefghijklmnopqrst

164 @inject 1abcdefghijklmnopqr

165 async def some_func(a: int, b: int) -> float: 1abcdefghijklmnopqr

166 assert isinstance(a, int) 1abcdefghijklmnopqr

167 assert isinstance(b, int) 1abcdefghijklmnopqr

168 r = a + b 1abcdefghijklmnopqr

169 assert isinstance(r, int) 1abcdefghijklmnopqr

170 return r 1abcdefghijklmnopqr

171 

172 assert isinstance(await some_func("1", "2"), float) 1abcdefghijklmnopqr

173 

174 async def test_types_casting_from_str(self) -> None: 1abcdefghijklmnopqrst

175 @inject 1abcdefghijklmnopqr

176 async def some_func(a: "int") -> float: 1abcdefghijklmnopqr

177 return a 1abcdefghijklmnopqr

178 

179 assert isinstance(await some_func("1"), float) 1abcdefghijklmnopqr

180 

181 async def test_wrong_incoming_types(self) -> None: 1abcdefghijklmnopqrst

182 @inject 1abcdefghijklmnopqr

183 async def some_func(a: int): # pragma: no cover 1abcdefghijklmnopqr

184 return a 

185 

186 with pytest.raises(ValidationError): 1abcdefghijklmnopqr

187 await some_func({"key", 1}) 1abcdefghijklmnopqr

188 

189 async def test_wrong_return_types(self) -> None: 1abcdefghijklmnopqrst

190 @inject 1abcdefghijklmnopqr

191 async def some_func(a: int) -> dict: 1abcdefghijklmnopqr

192 return a 1abcdefghijklmnopqr

193 

194 with pytest.raises(ValidationError): 1abcdefghijklmnopqr

195 await some_func("2") 1abcdefghijklmnopqr

196 

197 async def test_generator(self) -> None: 1abcdefghijklmnopqrst

198 @inject 1abcdefghijklmnopqr

199 async def simple_func(a: str) -> int: 1abcdefghijklmnopqr

200 for _ in range(2): 1abcdefghijklmnopqr

201 yield a 1abcdefghijklmnopqr

202 

203 async for i in simple_func("1"): 1abcdefghijklmnopqr

204 assert i == 1 1abcdefghijklmnopqr

205 

206 async def test_generator_iterator_type(self) -> None: 1abcdefghijklmnopqrst

207 @inject 1abcdefghijklmnopqr

208 async def simple_func(a: str) -> Iterator[int]: 1abcdefghijklmnopqr

209 for _ in range(2): 1abcdefghijklmnopqr

210 yield a 1abcdefghijklmnopqr

211 

212 async for i in simple_func("1"): 1abcdefghijklmnopqr

213 assert i == 1 1abcdefghijklmnopqr