Skip to content
This repository was archived by the owner on Mar 26, 2026. It is now read-only.

Commit f7f35b1

Browse files
committed
100% test coverage for async pager
1 parent 1e58767 commit f7f35b1

4 files changed

Lines changed: 97 additions & 4 deletions

File tree

gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/grpc_asyncio.py.j2

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ class {{ service.name }}GrpcAsyncIOTransport({{ service.name }}Transport):
8989
host,
9090
credentials=credentials,
9191
scopes=cls.AUTH_SCOPES,
92-
enable_asyncio=True,
9392
**kwargs
9493
)
9594

gapic/templates/noxfile.py.j2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import nox # type: ignore
1010
def unit(session):
1111
"""Run the unit test suite."""
1212

13-
session.install('coverage', 'pytest', 'pytest-cov')
13+
session.install('coverage', 'pytest', 'pytest-cov', 'asyncmock', 'pytest-asyncio')
1414
session.install('-e', '.')
1515

1616
session.run(

gapic/templates/tests/unit/%name_%version/%sub/test_%service.py.j2

Lines changed: 94 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{% extends "_base.py.j2" %}
22

33
{% block content %}
4-
from unittest import mock
4+
import mock
55

66
import grpc
77
import math
@@ -13,6 +13,7 @@ from google import auth
1313
from google.auth import credentials
1414
from google.oauth2 import service_account
1515
from {{ (api.naming.module_namespace + (api.naming.versioned_module_name,) + service.meta.address.subpackage)|join(".") }}.services.{{ service.name|snake_case }} import {{ service.client_name }}
16+
from {{ (api.naming.module_namespace + (api.naming.versioned_module_name,) + service.meta.address.subpackage)|join(".") }}.services.{{ service.name|snake_case }} import {{ service.async_client_name }}
1617
from {{ (api.naming.module_namespace + (api.naming.versioned_module_name,) + service.meta.address.subpackage)|join(".") }}.services.{{ service.name|snake_case }} import transports
1718
from google.api_core import client_options
1819
from google.api_core import grpc_helpers
@@ -411,6 +412,98 @@ def test_{{ method.name|snake_case }}_pages():
411412
pages = list(client.{{ method.name|snake_case }}(request={}).pages)
412413
for page, token in zip(pages, ['abc','def','ghi', '']):
413414
assert page.raw_page.next_page_token == token
415+
416+
@pytest.mark.asyncio
417+
async def test_{{ method.name|snake_case }}_async_pager():
418+
client = {{ service.async_client_name }}(
419+
credentials=credentials.AnonymousCredentials,
420+
)
421+
422+
# Mock the actual call within the gRPC stub, and fake the request.
423+
with mock.patch.object(
424+
type(client._transport.{{ method.name|snake_case }}),
425+
'__call__', new_callable=mock.AsyncMock) as call:
426+
# Set the response to a series of pages.
427+
call.side_effect = (
428+
{{ method.output.ident }}(
429+
{{ method.paged_result_field.name }}=[
430+
{{ method.paged_result_field.message.ident }}(),
431+
{{ method.paged_result_field.message.ident }}(),
432+
{{ method.paged_result_field.message.ident }}(),
433+
],
434+
next_page_token='abc',
435+
),
436+
{{ method.output.ident }}(
437+
{{ method.paged_result_field.name }}=[],
438+
next_page_token='def',
439+
),
440+
{{ method.output.ident }}(
441+
{{ method.paged_result_field.name }}=[
442+
{{ method.paged_result_field.message.ident }}(),
443+
],
444+
next_page_token='ghi',
445+
),
446+
{{ method.output.ident }}(
447+
{{ method.paged_result_field.name }}=[
448+
{{ method.paged_result_field.message.ident }}(),
449+
{{ method.paged_result_field.message.ident }}(),
450+
],
451+
),
452+
RuntimeError,
453+
)
454+
async_pager = await client.{{ method.name|snake_case }}(request={},)
455+
assert async_pager.next_page_token == 'abc'
456+
responses = []
457+
async for response in async_pager:
458+
responses.append(response)
459+
460+
assert len(responses) == 6
461+
assert all(isinstance(i, {{ method.paged_result_field.message.ident }})
462+
for i in responses)
463+
464+
@pytest.mark.asyncio
465+
async def test_{{ method.name|snake_case }}_async_pages():
466+
client = {{ service.async_client_name }}(
467+
credentials=credentials.AnonymousCredentials,
468+
)
469+
470+
# Mock the actual call within the gRPC stub, and fake the request.
471+
with mock.patch.object(
472+
type(client._transport.{{ method.name|snake_case }}),
473+
'__call__', new_callable=mock.AsyncMock) as call:
474+
# Set the response to a series of pages.
475+
call.side_effect = (
476+
{{ method.output.ident }}(
477+
{{ method.paged_result_field.name }}=[
478+
{{ method.paged_result_field.message.ident }}(),
479+
{{ method.paged_result_field.message.ident }}(),
480+
{{ method.paged_result_field.message.ident }}(),
481+
],
482+
next_page_token='abc',
483+
),
484+
{{ method.output.ident }}(
485+
{{ method.paged_result_field.name }}=[],
486+
next_page_token='def',
487+
),
488+
{{ method.output.ident }}(
489+
{{ method.paged_result_field.name }}=[
490+
{{ method.paged_result_field.message.ident }}(),
491+
],
492+
next_page_token='ghi',
493+
),
494+
{{ method.output.ident }}(
495+
{{ method.paged_result_field.name }}=[
496+
{{ method.paged_result_field.message.ident }}(),
497+
{{ method.paged_result_field.message.ident }}(),
498+
],
499+
),
500+
RuntimeError,
501+
)
502+
pages = []
503+
async for page in (await client.{{ method.name|snake_case }}(request={})).pages:
504+
pages.append(page)
505+
for page, token in zip(pages, ['abc','def','ghi', '']):
506+
assert page.raw_page.next_page_token == token
414507
{% elif method.lro and "next_page_token" in method.lro.response_type.fields.keys() %}
415508
def test_{{ method.name|snake_case }}_raw_page_lro():
416509
response = {{ method.lro.response_type.ident }}()

noxfile.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ def showcase_unit(
136136
# "git+https://github.com/googleapis/python-api-core.git@ca6c41cf460e505e6b228263170927270626222a#egg=google-api-core",
137137
# )
138138
session.install(
139-
'coverage', 'pytest', 'pytest-cov', 'pytest-xdist',
139+
'coverage', 'pytest', 'pytest-cov', 'pytest-xdist', 'asyncmock',
140140
'git+https://github.com/pytest-dev/pytest-asyncio.git')
141141
session.install('.')
142142

@@ -148,6 +148,7 @@ def showcase_unit(
148148

149149
# Install a client library for Showcase.
150150
with tempfile.TemporaryDirectory() as tmp_dir:
151+
tmp_dir = '/Users/lidiz/playground/gapic-showcase/dest'
151152

152153
# Download the Showcase descriptor.
153154
session.run(

0 commit comments

Comments
 (0)