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
« prev ^ index » next coverage.py v7.17.3, created at 2026-11-13 05:19 +0000
1from collections.abc import Iterator 1abcdefghijklmnopqrst
3import pytest 1abcdefghijklmnopqrst
5from fast_depends import inject 1abcdefghijklmnopqrst
6from fast_depends.exceptions import ValidationError 1abcdefghijklmnopqrst
7from tests.marks import serializer 1abcdefghijklmnopqrst
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
16 assert await some_func(useless=object()) == 1 1abcdefghijklmnopqrst
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
25 assert isinstance(await some_func("1", "2"), str) 1abcdefghijklmnopqrst
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
34 @inject 1abcdefghijklmnopqrst
35 async def some_func(a: ArbitraryType): 1abcdefghijklmnopqrst
36 return a 1abcdefghijklmnopqrst
38 assert isinstance(await some_func(ArbitraryType()), ArbitraryType) 1abcdefghijklmnopqrst
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
47 @inject 1abcdefghijklmnopqrst
48 async def some_func(a: ArbitraryType) -> ArbitraryType: 1abcdefghijklmnopqrst
49 return a 1abcdefghijklmnopqrst
51 assert isinstance(await some_func(ArbitraryType()), ArbitraryType) 1abcdefghijklmnopqrst
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
60 assert (1, (2,)) == await some_func(1, 2) 1abcdefghijklmnopqrst
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
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 )
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
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 )
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
103 assert (1, 3) == await simple_func( 1abcdefghijklmnopqrst
104 1.0,
105 b=3.0,
106 )
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
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)
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
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)
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
153 assert await some_func("1", "2") == 3 1abcdefghijklmnopqr
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
161 assert isinstance(await some_func(1, "2"), int) 1abcdefghijklmnopqr
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
172 assert isinstance(await some_func("1", "2"), float) 1abcdefghijklmnopqr
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
179 assert isinstance(await some_func("1"), float) 1abcdefghijklmnopqr
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
186 with pytest.raises(ValidationError): 1abcdefghijklmnopqr
187 await some_func({"key", 1}) 1abcdefghijklmnopqr
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
194 with pytest.raises(ValidationError): 1abcdefghijklmnopqr
195 await some_func("2") 1abcdefghijklmnopqr
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
203 async for i in simple_func("1"): 1abcdefghijklmnopqr
204 assert i == 1 1abcdefghijklmnopqr
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
212 async for i in simple_func("1"): 1abcdefghijklmnopqr
213 assert i == 1 1abcdefghijklmnopqr