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

111 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 

10def test_skip_not_required(): 1abcdefghijklmnopqrst

11 @inject(serializer_cls=None) 1abcdefghijklmnopqrst

12 def some_func() -> int: 1abcdefghijklmnopqrst

13 return 1 1abcdefghijklmnopqrst

14 

15 assert some_func(useless=object()) == 1 1abcdefghijklmnopqrst

16 

17 

18def test_not_annotated(): 1abcdefghijklmnopqrst

19 @inject 1abcdefghijklmnopqrst

20 def some_func(a, b): 1abcdefghijklmnopqrst

21 return a + b 1abcdefghijklmnopqrst

22 

23 assert isinstance(some_func("1", "2"), str) 1abcdefghijklmnopqrst

24 

25 

26def test_arbitrary_args(): 1abcdefghijklmnopqrst

27 class ArbitraryType: 1abcdefghijklmnopqrst

28 def __init__(self): 1abcdefghijklmnopqrst

29 self.value = "value" 1abcdefghijklmnopqrst

30 

31 @inject 1abcdefghijklmnopqrst

32 def some_func(a: ArbitraryType): 1abcdefghijklmnopqrst

33 return a 1abcdefghijklmnopqrst

34 

35 assert isinstance(some_func(ArbitraryType()), ArbitraryType) 1abcdefghijklmnopqrst

36 

37 

38def test_arbitrary_response(): 1abcdefghijklmnopqrst

39 class ArbitraryType: 1abcdefghijklmnopqrst

40 def __init__(self): 1abcdefghijklmnopqrst

41 self.value = "value" 1abcdefghijklmnopqrst

42 

43 @inject 1abcdefghijklmnopqrst

44 def some_func(a: ArbitraryType) -> ArbitraryType: 1abcdefghijklmnopqrst

45 return a 1abcdefghijklmnopqrst

46 

47 assert isinstance(some_func(ArbitraryType()), ArbitraryType) 1abcdefghijklmnopqrst

48 

49 

50def test_args(): 1abcdefghijklmnopqrst

51 @inject 1abcdefghijklmnopqrst

52 def some_func(a, *ar): 1abcdefghijklmnopqrst

53 return a, ar 1abcdefghijklmnopqrst

54 

55 assert (1, (2,)) == some_func(1, 2) 1abcdefghijklmnopqrst

56 

57 

58def test_args_kwargs_1(): 1abcdefghijklmnopqrst

59 @inject 1abcdefghijklmnopqrst

60 def simple_func( 1abcdefghijklmnopqrst

61 a: int, 

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

63 b: int, 

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

65 ): 

66 return a, args, b, kwargs 1abcdefghijklmnopqrst

67 

68 assert (1, (2.0, 3.0), 3, {"key": 1}) == simple_func(1.0, 2.0, 3, b=3.0, key=1.0) 1abcdefghijklmnopqrst

69 

70 

71def test_args_kwargs_2(): 1abcdefghijklmnopqrst

72 @inject 1abcdefghijklmnopqrst

73 def simple_func( 1abcdefghijklmnopqrst

74 a: int, 

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

76 b: int, 

77 ): 

78 return a, args, b 1abcdefghijklmnopqrst

79 

80 assert (1, (2.0, 3.0), 3) == simple_func( 1abcdefghijklmnopqrst

81 1.0, 

82 2.0, 

83 3, 

84 b=3.0, 

85 ) 

86 

87 

88def test_args_kwargs_3(): 1abcdefghijklmnopqrst

89 @inject 1abcdefghijklmnopqrst

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

91 return a, b 1abcdefghijklmnopqrst

92 

93 assert (1, 3) == simple_func( 1abcdefghijklmnopqrst

94 1.0, 

95 b=3.0, 

96 ) 

97 

98 

99def test_args_kwargs_4(): 1abcdefghijklmnopqrst

100 @inject 1abcdefghijklmnopqrst

101 def simple_func( 1abcdefghijklmnopqrst

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

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

104 ): 

105 return args, kwargs 1abcdefghijklmnopqrst

106 

107 assert ( 1abcdefghijklmnopqrst

108 (1.0, 2.0, 3.0), 

109 { 

110 "key": 1, 

111 "b": 3, 

112 }, 

113 ) == simple_func(1.0, 2.0, 3, b=3.0, key=1.0) 

114 

115 

116def test_args_kwargs_5(): 1abcdefghijklmnopqrst

117 @inject 1abcdefghijklmnopqrst

118 def simple_func( 1abcdefghijklmnopqrst

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

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

121 ): 

122 return a, kw 1abcdefghijklmnopqrst

123 

124 assert ( 1abcdefghijklmnopqrst

125 (1.0, 2.0, 3.0), 

126 { 

127 "key": 1, 

128 "b": 3, 

129 }, 

130 ) == simple_func(1.0, 2.0, 3, b=3.0, key=1.0) 

131 

132 

133@serializer 1abcdefghijklmnopqrst

134class TestSerializer: 1abcdefghijklmnopqrst

135 def test_no_cast_result(self): 1abcdefghijklmnopqrst

136 @inject(cast_result=False) 1abcdefghijklmnopqr

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

138 return a + b 1abcdefghijklmnopqr

139 

140 assert some_func("1", "2") == 3 1abcdefghijklmnopqr

141 

142 def test_annotated_partial(self): 1abcdefghijklmnopqrst

143 @inject 1abcdefghijklmnopqr

144 def some_func(a, b: int): 1abcdefghijklmnopqr

145 assert isinstance(b, int) 1abcdefghijklmnopqr

146 return a + b 1abcdefghijklmnopqr

147 

148 assert isinstance(some_func(1, "2"), int) 1abcdefghijklmnopqr

149 

150 def test_types_casting(self): 1abcdefghijklmnopqrst

151 @inject 1abcdefghijklmnopqr

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

153 assert isinstance(a, int) 1abcdefghijklmnopqr

154 assert isinstance(b, int) 1abcdefghijklmnopqr

155 r = a + b 1abcdefghijklmnopqr

156 assert isinstance(r, int) 1abcdefghijklmnopqr

157 return r 1abcdefghijklmnopqr

158 

159 assert isinstance(some_func("1", "2"), float) 1abcdefghijklmnopqr

160 

161 def test_types_casting_from_str(self): 1abcdefghijklmnopqrst

162 @inject 1abcdefghijklmnopqr

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

164 return a 1abcdefghijklmnopqr

165 

166 assert isinstance(some_func("1"), float) 1abcdefghijklmnopqr

167 

168 def test_wrong_incoming_types(self): 1abcdefghijklmnopqrst

169 @inject 1abcdefghijklmnopqr

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

171 return a 

172 

173 with pytest.raises(ValidationError): 1abcdefghijklmnopqr

174 some_func({"key", 1}) 1abcdefghijklmnopqr

175 

176 def test_wrong_return_type(self): 1abcdefghijklmnopqrst

177 @inject 1abcdefghijklmnopqr

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

179 return a 1abcdefghijklmnopqr

180 

181 with pytest.raises(ValidationError): 1abcdefghijklmnopqr

182 some_func("2") 1abcdefghijklmnopqr

183 

184 def test_generator(self): 1abcdefghijklmnopqrst

185 @inject 1abcdefghijklmnopqr

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

187 for _ in range(2): 1abcdefghijklmnopqr

188 yield a 1abcdefghijklmnopqr

189 

190 for i in simple_func("1"): 1abcdefghijklmnopqr

191 assert i == 1 1abcdefghijklmnopqr

192 

193 def test_generator_iterator_type(self): 1abcdefghijklmnopqrst

194 @inject 1abcdefghijklmnopqr

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

196 for _ in range(2): 1abcdefghijklmnopqr

197 yield a 1abcdefghijklmnopqr

198 

199 for i in simple_func("1"): 1abcdefghijklmnopqr

200 assert i == 1 1abcdefghijklmnopqr