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

Commit 5ff544a

Browse files
committed
fix: remove duplicate field entries
Fix for #778
1 parent 35338fc commit 5ff544a

2 files changed

Lines changed: 28 additions & 4 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ class {{ service.client_name }}(metaclass={{ service.client_name }}Meta):
365365
request = {{ method.input.ident }}(**request)
366366
{% if method.flattened_fields -%}{# Cross-package req and flattened fields #}
367367
elif not request:
368-
request = {{ method.input.ident }}({% if method.input.ident.package != method.ident.package %}{% for f in method.flattened_fields.values() %}{{ f.name }}={{ f.name }}, {% endfor %}{% endif %})
368+
request = {{ method.input.ident }}()
369369
{% endif -%}{# Cross-package req and flattened fields #}
370370
{%- else %}
371371
# Minor optimization to avoid making a copy if the user passes

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

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,30 @@ def test_{{ method.name|snake_case }}_from_dict():
471471
test_{{ method.name|snake_case }}(request_type=dict)
472472

473473

474+
{% if not method.client_streaming -%}
475+
def test_{{ method.name|snake_case }}_empty_call():
476+
# This test is a coverage failsafe to make sure that totally empty calls,
477+
# i.e. request == None and no flattened fields passed, work.
478+
client = {{ service.client_name }}(
479+
credentials=credentials.AnonymousCredentials(),
480+
transport='grpc',
481+
)
482+
483+
# Mock the actual call within the gRPC stub, and fake the request.
484+
with mock.patch.object(
485+
type(client.transport.{{ method.name|snake_case }}),
486+
'__call__') as call:
487+
client.{{ method.name|snake_case }}()
488+
call.assert_called()
489+
_, args, _ = call.mock_calls[0]
490+
{% if method.client_streaming %}
491+
assert next(args[0]) == request
492+
{% else %}
493+
assert args[0] == {{ method.input.ident }}()
494+
{% endif %}
495+
{% endif -%}
496+
497+
474498
@pytest.mark.asyncio
475499
async def test_{{ method.name|snake_case }}_async(transport: str = 'grpc_asyncio', request_type={{ method.input.ident }}):
476500
client = {{ service.async_client_name }}(
@@ -1276,7 +1300,7 @@ def test_{{ method.name|snake_case }}_pager():
12761300
for result in results:
12771301
assert isinstance(result, tuple)
12781302
assert tuple(type(t) for t in result) == (str, {{ method.paged_result_field.type.fields.get('value').ident }})
1279-
1303+
12801304
assert pager.get('a') is None
12811305
assert isinstance(pager.get('h'), {{ method.paged_result_field.type.fields.get('value').ident }})
12821306
{% else %}
@@ -1288,7 +1312,7 @@ def test_{{ method.name|snake_case }}_pager():
12881312
for page_, token in zip(pages, ['abc','def','ghi', '']):
12891313
assert page_.raw_page.next_page_token == token
12901314

1291-
1315+
12921316
{% endif %} {# paged methods #}
12931317
{% endfor -%} {#- method in methods for rest #}
12941318
def test_credentials_transport_error():
@@ -1500,7 +1524,7 @@ def test_{{ service.name|snake_case }}_grpc_transport_client_cert_source_for_mtl
15001524
("grpc.max_receive_message_length", -1),
15011525
],
15021526
)
1503-
1527+
15041528
# Check if ssl_channel_credentials is not provided, then client_cert_source_for_mtls
15051529
# is used.
15061530
with mock.patch.object(transport_class, "create_channel", return_value=mock.Mock()):

0 commit comments

Comments
 (0)