@@ -66,6 +66,57 @@ def test_wrap_unary_errors():
66
66
assert exc_info .value .response == grpc_error
67
67
68
68
69
+ def test_wrap_stream_okay ():
70
+ expected_responses = [1 , 2 , 3 ]
71
+ callable_ = mock .Mock (spec = [
72
+ '__call__' ], return_value = iter (expected_responses ))
73
+
74
+ wrapped_callable = grpc_helpers ._wrap_stream_errors (callable_ )
75
+
76
+ got_iterator = wrapped_callable (1 , 2 , three = 'four' )
77
+
78
+ responses = list (got_iterator )
79
+
80
+ callable_ .assert_called_once_with (1 , 2 , three = 'four' )
81
+ assert responses == expected_responses
82
+
83
+
84
+ def test_wrap_stream_iterable_iterface ():
85
+ response_iter = mock .create_autospec (grpc .Call , instance = True )
86
+ callable_ = mock .Mock (spec = ['__call__' ], return_value = response_iter )
87
+
88
+ wrapped_callable = grpc_helpers ._wrap_stream_errors (callable_ )
89
+
90
+ got_iterator = wrapped_callable ()
91
+
92
+ callable_ .assert_called_once_with ()
93
+
94
+ # Check each aliased method in the grpc.Call interface
95
+ got_iterator .add_callback (mock .sentinel .callback )
96
+ response_iter .add_callback .assert_called_once_with (mock .sentinel .callback )
97
+
98
+ got_iterator .cancel ()
99
+ response_iter .cancel .assert_called_once_with ()
100
+
101
+ got_iterator .code ()
102
+ response_iter .code .assert_called_once_with ()
103
+
104
+ got_iterator .details ()
105
+ response_iter .details .assert_called_once_with ()
106
+
107
+ got_iterator .initial_metadata ()
108
+ response_iter .initial_metadata .assert_called_once_with ()
109
+
110
+ got_iterator .is_active ()
111
+ response_iter .is_active .assert_called_once_with ()
112
+
113
+ got_iterator .time_remaining ()
114
+ response_iter .time_remaining .assert_called_once_with ()
115
+
116
+ got_iterator .trailing_metadata ()
117
+ response_iter .trailing_metadata .assert_called_once_with ()
118
+
119
+
69
120
def test_wrap_stream_errors_invocation ():
70
121
grpc_error = RpcErrorImpl (grpc .StatusCode .INVALID_ARGUMENT )
71
122
callable_ = mock .Mock (spec = ['__call__' ], side_effect = grpc_error )
@@ -83,16 +134,10 @@ class RpcResponseIteratorImpl(object):
83
134
def __init__ (self , exception ):
84
135
self ._exception = exception
85
136
86
- # Note: This matches grpc._channel._Rendezvous._next which is what is
87
- # patched by _wrap_stream_errors.
88
- def _next (self ):
137
+ def next (self ):
89
138
raise self ._exception
90
139
91
- def __next__ (self ): # pragma: NO COVER
92
- return self ._next ()
93
-
94
- def next (self ): # pragma: NO COVER
95
- return self ._next ()
140
+ __next__ = next
96
141
97
142
98
143
def test_wrap_stream_errors_iterator ():
@@ -107,7 +152,6 @@ def test_wrap_stream_errors_iterator():
107
152
with pytest .raises (exceptions .ServiceUnavailable ) as exc_info :
108
153
next (got_iterator )
109
154
110
- assert got_iterator == response_iter
111
155
callable_ .assert_called_once_with (1 , 2 , three = 'four' )
112
156
assert exc_info .value .response == grpc_error
113
157
0 commit comments