@@ -408,6 +408,90 @@ def test__get_next_page_bad_http_method(self):
408408 iterator ._get_next_page_response ()
409409
410410
411+ class TestGRPCIterator (object ):
412+
413+ def test_constructor (self ):
414+ client = mock .sentinel .client
415+ items_field = 'items'
416+ iterator = page_iterator .GRPCIterator (
417+ client , mock .sentinel .method , mock .sentinel .request , items_field )
418+
419+ assert not iterator ._started
420+ assert iterator .client is client
421+ assert iterator .max_results is None
422+ assert iterator ._method == mock .sentinel .method
423+ assert iterator ._request == mock .sentinel .request
424+ assert iterator ._items_field == items_field
425+ assert iterator ._item_to_value is page_iterator ._item_to_value_identity
426+ assert (iterator ._request_token_field ==
427+ page_iterator .GRPCIterator ._DEFAULT_REQUEST_TOKEN_FIELD )
428+ assert (iterator ._response_token_field ==
429+ page_iterator .GRPCIterator ._DEFAULT_RESPONSE_TOKEN_FIELD )
430+ # Changing attributes.
431+ assert iterator .page_number == 0
432+ assert iterator .next_page_token is None
433+ assert iterator .num_results == 0
434+
435+ def test_constructor_options (self ):
436+ client = mock .sentinel .client
437+ items_field = 'items'
438+ request_field = 'request'
439+ response_field = 'response'
440+ iterator = page_iterator .GRPCIterator (
441+ client , mock .sentinel .method , mock .sentinel .request , items_field ,
442+ item_to_value = mock .sentinel .item_to_value ,
443+ request_token_field = request_field ,
444+ response_token_field = response_field ,
445+ max_results = 42 )
446+
447+ assert iterator .client is client
448+ assert iterator .max_results == 42
449+ assert iterator ._method == mock .sentinel .method
450+ assert iterator ._request == mock .sentinel .request
451+ assert iterator ._items_field == items_field
452+ assert iterator ._item_to_value is mock .sentinel .item_to_value
453+ assert iterator ._request_token_field == request_field
454+ assert iterator ._response_token_field == response_field
455+
456+ def test_iterate (self ):
457+ request = mock .Mock (spec = ['page_token' ], page_token = None )
458+ response1 = mock .Mock (items = ['a' , 'b' ], next_page_token = '1' )
459+ response2 = mock .Mock (items = ['c' ], next_page_token = '2' )
460+ response3 = mock .Mock (items = ['d' ], next_page_token = '' )
461+ method = mock .Mock (side_effect = [response1 , response2 , response3 ])
462+ iterator = page_iterator .GRPCIterator (
463+ mock .sentinel .client , method , request , 'items' )
464+
465+ assert iterator .num_results == 0
466+
467+ items = list (iterator )
468+ assert items == ['a' , 'b' , 'c' , 'd' ]
469+
470+ method .assert_called_with (request )
471+ assert method .call_count == 3
472+ assert request .page_token == '2'
473+
474+ def test_iterate_with_max_results (self ):
475+ request = mock .Mock (spec = ['page_token' ], page_token = None )
476+ response1 = mock .Mock (items = ['a' , 'b' ], next_page_token = '1' )
477+ response2 = mock .Mock (items = ['c' ], next_page_token = '2' )
478+ response3 = mock .Mock (items = ['d' ], next_page_token = '' )
479+ method = mock .Mock (side_effect = [response1 , response2 , response3 ])
480+ iterator = page_iterator .GRPCIterator (
481+ mock .sentinel .client , method , request , 'items' , max_results = 3 )
482+
483+ assert iterator .num_results == 0
484+
485+ items = list (iterator )
486+
487+ assert items == ['a' , 'b' , 'c' ]
488+ assert iterator .num_results == 3
489+
490+ method .assert_called_with (request )
491+ assert method .call_count == 2
492+ assert request .page_token is '1'
493+
494+
411495class GAXPageIterator (object ):
412496 """Fake object that matches gax.PageIterator"""
413497 def __init__ (self , pages , page_token = None ):
0 commit comments