@@ -66,6 +66,128 @@ def test_wrap_unary_errors():
6666 assert exc_info .value .response == grpc_error
6767
6868
69+ class Test_StreamingResponseIterator :
70+ @staticmethod
71+ def _make_wrapped (* items ):
72+ return iter (items )
73+
74+ @staticmethod
75+ def _make_one (wrapped , ** kw ):
76+ return grpc_helpers ._StreamingResponseIterator (wrapped , ** kw )
77+
78+ def test_ctor_defaults (self ):
79+ wrapped = self ._make_wrapped ("a" , "b" , "c" )
80+ iterator = self ._make_one (wrapped )
81+ assert iterator ._stored_first_result == "a"
82+ assert list (wrapped ) == ["b" , "c" ]
83+
84+ def test_ctor_explicit (self ):
85+ wrapped = self ._make_wrapped ("a" , "b" , "c" )
86+ iterator = self ._make_one (wrapped , prefetch_first_result = False )
87+ assert getattr (iterator , "_stored_first_result" , self ) is self
88+ assert list (wrapped ) == ["a" , "b" , "c" ]
89+
90+ def test_ctor_w_rpc_error_on_prefetch (self ):
91+ wrapped = mock .MagicMock ()
92+ wrapped .__next__ .side_effect = grpc .RpcError ()
93+
94+ with pytest .raises (grpc .RpcError ):
95+ self ._make_one (wrapped )
96+
97+ def test___iter__ (self ):
98+ wrapped = self ._make_wrapped ("a" , "b" , "c" )
99+ iterator = self ._make_one (wrapped )
100+ assert iter (iterator ) is iterator
101+
102+ def test___next___w_cached_first_result (self ):
103+ wrapped = self ._make_wrapped ("a" , "b" , "c" )
104+ iterator = self ._make_one (wrapped )
105+ assert next (iterator ) == "a"
106+ iterator = self ._make_one (wrapped , prefetch_first_result = False )
107+ assert next (iterator ) == "b"
108+ assert next (iterator ) == "c"
109+
110+ def test___next___wo_cached_first_result (self ):
111+ wrapped = self ._make_wrapped ("a" , "b" , "c" )
112+ iterator = self ._make_one (wrapped , prefetch_first_result = False )
113+ assert next (iterator ) == "a"
114+ assert next (iterator ) == "b"
115+ assert next (iterator ) == "c"
116+
117+ def test___next___w_rpc_error (self ):
118+ wrapped = mock .MagicMock ()
119+ wrapped .__next__ .side_effect = grpc .RpcError ()
120+ iterator = self ._make_one (wrapped , prefetch_first_result = False )
121+
122+ with pytest .raises (exceptions .GoogleAPICallError ):
123+ next (iterator )
124+
125+ def test_add_callback (self ):
126+ wrapped = mock .MagicMock ()
127+ callback = mock .Mock (spec = {})
128+ iterator = self ._make_one (wrapped , prefetch_first_result = False )
129+
130+ assert iterator .add_callback (callback ) is wrapped .add_callback .return_value
131+
132+ wrapped .add_callback .assert_called_once_with (callback )
133+
134+ def test_cancel (self ):
135+ wrapped = mock .MagicMock ()
136+ iterator = self ._make_one (wrapped , prefetch_first_result = False )
137+
138+ assert iterator .cancel () is wrapped .cancel .return_value
139+
140+ wrapped .cancel .assert_called_once_with ()
141+
142+ def test_code (self ):
143+ wrapped = mock .MagicMock ()
144+ iterator = self ._make_one (wrapped , prefetch_first_result = False )
145+
146+ assert iterator .code () is wrapped .code .return_value
147+
148+ wrapped .code .assert_called_once_with ()
149+
150+ def test_details (self ):
151+ wrapped = mock .MagicMock ()
152+ iterator = self ._make_one (wrapped , prefetch_first_result = False )
153+
154+ assert iterator .details () is wrapped .details .return_value
155+
156+ wrapped .details .assert_called_once_with ()
157+
158+ def test_initial_metadata (self ):
159+ wrapped = mock .MagicMock ()
160+ iterator = self ._make_one (wrapped , prefetch_first_result = False )
161+
162+ assert iterator .initial_metadata () is wrapped .initial_metadata .return_value
163+
164+ wrapped .initial_metadata .assert_called_once_with ()
165+
166+ def test_is_active (self ):
167+ wrapped = mock .MagicMock ()
168+ iterator = self ._make_one (wrapped , prefetch_first_result = False )
169+
170+ assert iterator .is_active () is wrapped .is_active .return_value
171+
172+ wrapped .is_active .assert_called_once_with ()
173+
174+ def test_time_remaining (self ):
175+ wrapped = mock .MagicMock ()
176+ iterator = self ._make_one (wrapped , prefetch_first_result = False )
177+
178+ assert iterator .time_remaining () is wrapped .time_remaining .return_value
179+
180+ wrapped .time_remaining .assert_called_once_with ()
181+
182+ def test_trailing_metadata (self ):
183+ wrapped = mock .MagicMock ()
184+ iterator = self ._make_one (wrapped , prefetch_first_result = False )
185+
186+ assert iterator .trailing_metadata () is wrapped .trailing_metadata .return_value
187+
188+ wrapped .trailing_metadata .assert_called_once_with ()
189+
190+
69191def test_wrap_stream_okay ():
70192 expected_responses = [1 , 2 , 3 ]
71193 callable_ = mock .Mock (spec = ["__call__" ], return_value = iter (expected_responses ))
0 commit comments