def test_next_verify_are_there_more_results_and_next_page_called(
            self, mock_are_there_more_results, mock_next_page, mock_session,
            mock_value_holder_to_ion_value, mock_executor):
        updated_result = '1'

        def next_page():
            read_ahead_cursor._page = {
                'NextPageToken': None,
                'Values': [updated_result]
            }
            read_ahead_cursor._index = 0

        mock_are_there_more_results.return_value = True
        mock_value_holder_to_ion_value.side_effect = lambda val: val
        mock_session.return_value = None
        mock_next_page.return_value = None
        mock_next_page.side_effect = next_page
        read_ahead_cursor = ReadAheadCursor(MOCK_STATEMENT_RESULT,
                                            mock_session, MOCK_TRANSACTION_ID,
                                            MOCK_READ_AHEAD, mock_executor)
        read_ahead_cursor._index = len(MOCK_ION_BINARY_VALUES)

        self.assertEqual(next(read_ahead_cursor), updated_result)
        mock_are_there_more_results.assert_called_once_with()
        mock_next_page.assert_called_once_with()
        mock_value_holder_to_ion_value.assert_called_once_with(updated_result)
    def test_next_with_next_page_returns_empty_values_and_not_none_token(
            self, mock_session, mock_executor):
        read_ahead_cursor = ReadAheadCursor(MOCK_STATEMENT_RESULT,
                                            mock_session, MOCK_TRANSACTION_ID,
                                            MOCK_READ_AHEAD, mock_executor)
        read_ahead_cursor._queue = Queue()
        read_ahead_cursor._queue.put({'NextPageToken': 'token', 'Values': []})
        read_ahead_cursor._queue.put({'NextPageToken': None, 'Values': []})

        read_ahead_cursor._index = len(MOCK_ION_BINARY_VALUES)
        self.assertRaises(StopIteration, next, read_ahead_cursor)
    def test_next_when_next_page_returns_empty_values_and_none_token(
            self, mock_session, mock_next_page, mock_executor):
        mock_session.return_value = None

        def next_page():
            read_ahead_cursor._page = {'NextPageToken': None, 'Values': []}
            read_ahead_cursor._index = 0

        read_ahead_cursor = ReadAheadCursor(MOCK_STATEMENT_RESULT,
                                            mock_session, MOCK_TRANSACTION_ID,
                                            MOCK_READ_AHEAD, mock_executor)
        read_ahead_cursor._index = len(MOCK_ION_BINARY_VALUES)
        mock_next_page.side_effect = next_page
        self.assertRaises(StopIteration, next, read_ahead_cursor)