11"""Mock gRPC stream call for testing."""
22
33from collections .abc import AsyncIterator , Callable
4- from typing import Generic , TypeVar
4+ from typing import Generic , TypeVar , override
55
66import grpc
77from grpc .aio import Call , Metadata , StreamStreamCall
@@ -24,8 +24,10 @@ class MockStreamCall(Generic[RequestT, ResponseT]):
2424
2525 def __init__ (self , responses : list [ResponseT ]) -> None :
2626 """Initialize with response list."""
27- self .responses = responses .copy ()
28- self .call_count = 0
27+ self .responses : list [ResponseT ] = responses .copy ()
28+ self .call_count : int = 0
29+ self ._last_timeout : float | None = None
30+ self ._last_wait_for_ready : bool = True
2931
3032 def __call__ (
3133 self ,
@@ -57,12 +59,13 @@ def __init__(
5759 ) -> None :
5860 """Initialize with request iterator and responses."""
5961 super ().__init__ ()
60- self ._request_iter = request_iter
61- self ._responses = responses .copy ()
62- self ._done = False
63- self ._cancelled = False
62+ self ._request_iter : AsyncIterator [ RequestT ] = request_iter
63+ self ._responses : list [ ResponseT ] = responses .copy ()
64+ self ._done : bool = False
65+ self ._cancelled : bool = False
6466 self ._done_callbacks : list [Callable [[Call ], None ]] = []
6567
68+ @override
6669 def __aiter__ (self ) -> AsyncIterator [ResponseT ]:
6770 """Get async iterator over responses."""
6871 return self
@@ -80,6 +83,7 @@ async def __anext__(self) -> ResponseT:
8083 raise StopAsyncIteration
8184 return self ._responses .pop (0 )
8285
86+ @override
8387 async def read (self ) -> ResponseT :
8488 """Read next response message.
8589
@@ -88,17 +92,20 @@ async def read(self) -> ResponseT:
8892 """
8993 return await self .__anext__ ()
9094
95+ @override
9196 async def write (self , request : RequestT ) -> None :
9297 """Write a request message (no-op).
9398
9499 Args:
95100 request: Request message to write.
96101 """
97102
103+ @override
98104 async def done_writing (self ) -> None :
99105 """Signal end of request stream."""
100106 self ._done = True
101107
108+ @override
102109 def add_done_callback (self , callback : Callable [[Call ], None ]) -> None :
103110 """Register completion callback.
104111
@@ -109,6 +116,7 @@ def add_done_callback(self, callback: Callable[[Call], None]) -> None:
109116 if self ._done :
110117 callback (self )
111118
119+ @override
112120 def time_remaining (self ) -> float | None :
113121 """Get remaining timeout time.
114122
@@ -117,6 +125,7 @@ def time_remaining(self) -> float | None:
117125 """
118126 return None
119127
128+ @override
120129 def cancel (self ) -> bool :
121130 """Cancel the call.
122131
@@ -131,6 +140,7 @@ def cancel(self) -> bool:
131140 return True
132141 return False
133142
143+ @override
134144 def cancelled (self ) -> bool :
135145 """Check if call was cancelled.
136146
@@ -139,6 +149,7 @@ def cancelled(self) -> bool:
139149 """
140150 return self ._cancelled
141151
152+ @override
142153 async def code (self ) -> grpc .StatusCode :
143154 """Get status code.
144155
@@ -147,6 +158,7 @@ async def code(self) -> grpc.StatusCode:
147158 """
148159 return grpc .StatusCode .OK
149160
161+ @override
150162 async def details (self ) -> str :
151163 """Get error details.
152164
@@ -155,6 +167,7 @@ async def details(self) -> str:
155167 """
156168 return ""
157169
170+ @override
158171 async def initial_metadata (self ) -> Metadata :
159172 """Get initial metadata.
160173
@@ -163,6 +176,7 @@ async def initial_metadata(self) -> Metadata:
163176 """
164177 return Metadata ()
165178
179+ @override
166180 async def trailing_metadata (self ) -> Metadata :
167181 """Get trailing metadata.
168182
@@ -171,6 +185,7 @@ async def trailing_metadata(self) -> Metadata:
171185 """
172186 return Metadata ()
173187
188+ @override
174189 def done (self ) -> bool :
175190 """Check if call is complete.
176191
@@ -179,5 +194,6 @@ def done(self) -> bool:
179194 """
180195 return self ._done
181196
197+ @override
182198 async def wait_for_connection (self ) -> None :
183199 """Wait for connection (no-op)."""
0 commit comments