Skip to content

Commit aaf8c11

Browse files
kbandesKenneth Bandes
andauthored
fix: handle required fields properly in query_params (#1068)
* fix: Handle required fields with default values in query params. * fix: add host portion of url to unit tests. Co-authored-by: Kenneth Bandes <kbandes@google.com>
1 parent b8cdc30 commit aaf8c11

File tree

2 files changed

+38
-9
lines changed
  • packages/gapic-generator/gapic/templates

2 files changed

+38
-9
lines changed

packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/rest.py.j2

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -188,14 +188,31 @@ class {{service.name}}RestTransport({{service.name}}Transport):
188188
"""
189189

190190
http_options = [
191-
{%- for rule in method.http_options %}{
192-
'method': '{{ rule.method }}',
193-
'uri': '{{ rule.uri }}',
194-
{%- if rule.body %}
195-
'body': '{{ rule.body }}',
196-
{%- endif %}
197-
},
198-
{%- endfor %}]
191+
{% for rule in method.http_options %}
192+
{
193+
'method': '{{ rule.method }}',
194+
'uri': '{{ rule.uri }}',
195+
{% if rule.body %}
196+
'body': '{{ rule.body }}',
197+
{% endif %}
198+
},
199+
{% endfor %}
200+
]
201+
202+
{% if method.input.required_fields %}
203+
required_fields = [
204+
# (snake_case_name, camel_case_name)
205+
{% for req_field in method.input.required_fields %}
206+
{% if req_field.is_primitive %}
207+
(
208+
"{{ req_field.name | snake_case }}",
209+
"{{ req_field.name | camel_case }}"
210+
),
211+
{% endif %}{# is primitive #}
212+
{% endfor %}{# required fields #}
213+
]
214+
215+
{% endif %}
199216

200217
request_kwargs = {{method.input.ident}}.to_dict(request)
201218
transcoded_request = path_template.transcode(
@@ -229,6 +246,18 @@ class {{service.name}}RestTransport({{service.name}}Transport):
229246
use_integers_for_enums=False
230247
))
231248

249+
{% if method.input.required_fields %}
250+
# Ensure required fields have values in query_params.
251+
# If a required field has a default value, it can get lost
252+
# by the to_json call above.
253+
orig_query_params = transcoded_request["query_params"]
254+
for snake_case_name, camel_case_name in required_fields:
255+
if snake_case_name in orig_query_params:
256+
if camel_case_name not in query_params:
257+
query_params[camel_case_name] = orig_query_params[snake_case_name]
258+
259+
{% endif %}
260+
232261
# Send the request
233262
headers = dict(metadata)
234263
headers['Content-Type'] = 'application/json'

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1293,7 +1293,7 @@ def test_{{ method.name|snake_case }}_rest_flattened(transport: str = 'rest'):
12931293
assert len(req.mock_calls) == 1
12941294
_, args, _ = req.mock_calls[0]
12951295
{% with uri = method.http_options[0].uri %}
1296-
assert path_template.validate("{{ uri }}", args[1])
1296+
assert path_template.validate("https://{{ service.host }}{{ uri }}", args[1])
12971297
{% endwith %}
12981298
{# TODO(kbandes) - reverse-transcode request args to check all request fields #}
12991299

0 commit comments

Comments
 (0)