From 8163fc431608c837c9a8ba84c4e823c915352b13 Mon Sep 17 00:00:00 2001 From: vam-google Date: Fri, 5 Aug 2022 13:20:04 -0700 Subject: [PATCH 1/2] fix: Unit test for nested fields in url path This fixes https://github.com/googleapis/gapic-generator-python/issues/1386 --- .../%name_%version/%sub/test_%service.py.j2 | 4 +-- gapic/schema/wrappers.py | 8 +++++ .../gapic/%name_%version/%sub/test_macros.j2 | 4 +-- tests/unit/schema/wrappers/test_field.py | 31 +++++++++++++++++++ 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/gapic/ads-templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 b/gapic/ads-templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 index 7b71403073..76667e207b 100644 --- a/gapic/ads-templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 +++ b/gapic/ads-templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 @@ -1001,7 +1001,7 @@ def test_{{ method.name|snake_case }}_rest(request_type): {% for field in method.body_fields.values() %} {% if not field.oneof or field.proto3_optional %} {# ignore oneof fields that might conflict with sample_request #} - request_init["{{ field.name }}"] = {{ field.mock_value_original_type }} + request_init["{{ field.name }}"] = {{ field.merged_mock_value(method.http_options[0].sample_request(method).get(field.name)) }} {% endif %} {% endfor %} request = request_type(request_init) @@ -1293,7 +1293,7 @@ def test_{{ method_name }}_rest_bad_request(transport: str = 'rest', request_typ {% for field in method.body_fields.values() %} {% if not field.oneof or field.proto3_optional %} {# ignore oneof fields that might conflict with sample_request #} - request_init["{{ field.name }}"] = {{ field.mock_value_original_type }} + request_init["{{ field.name }}"] = {{ field.merged_mock_value(method.http_options[0].sample_request(method).get(field.name)) }} {% endif %} {% endfor %} request = request_type(request_init) diff --git a/gapic/schema/wrappers.py b/gapic/schema/wrappers.py index 019d13cb67..0ac92bd8fc 100644 --- a/gapic/schema/wrappers.py +++ b/gapic/schema/wrappers.py @@ -28,6 +28,7 @@ """ import collections +import copy import dataclasses import json import keyword @@ -151,6 +152,13 @@ def recursive_mock_original_type(field): return recursive_mock_original_type(self) + def merged_mock_value(self, other_mock: Dict[Any, Any]): + mock = self.mock_value_original_type + if isinstance(mock, dict) and isinstance(other_mock, dict): + mock = copy.deepcopy(mock) + mock.update(other_mock) + return mock + @utils.cached_property def mock_value(self) -> str: visited_fields: Set["Field"] = set() diff --git a/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_macros.j2 b/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_macros.j2 index 7361662c41..b11b3c37a2 100644 --- a/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_macros.j2 +++ b/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_macros.j2 @@ -852,7 +852,7 @@ def test_{{ method_name }}_rest(request_type): {% for field in method.body_fields.values() %} {% if not field.oneof or field.proto3_optional %} {# ignore oneof fields that might conflict with sample_request #} - request_init["{{ field.name }}"] = {{ field.mock_value_original_type }} + request_init["{{ field.name }}"] = {{ field.merged_mock_value(method.http_options[0].sample_request(method).get(field.name)) }} {% endif %} {% endfor %} request = request_type(request_init) @@ -1158,7 +1158,7 @@ def test_{{ method_name }}_rest_bad_request(transport: str = 'rest', request_typ {% for field in method.body_fields.values() %} {% if not field.oneof or field.proto3_optional %} {# ignore oneof fields that might conflict with sample_request #} - request_init["{{ field.name }}"] = {{ field.mock_value_original_type }} + request_init["{{ field.name }}"] = {{ field.merged_mock_value(method.http_options[0].sample_request(method).get(field.name)) }} {% endif %} {% endfor %} request = request_type(request_init) diff --git a/tests/unit/schema/wrappers/test_field.py b/tests/unit/schema/wrappers/test_field.py index 7b5c8bd1c7..be7ae75baa 100644 --- a/tests/unit/schema/wrappers/test_field.py +++ b/tests/unit/schema/wrappers/test_field.py @@ -404,6 +404,37 @@ def test_mock_value_original_type_message(): assert entry_field.mock_value_original_type == {} +def test_merged_mock_value_message(): + subfields = collections.OrderedDict(( + ('foo', make_field(name='foo', type='TYPE_INT32')), + ('bar', make_field(name='bar', type='TYPE_STRING')) + )) + + message = wrappers.MessageType( + fields=subfields, + message_pb=descriptor_pb2.DescriptorProto(name="Message", field=[ + i.field_pb for i in subfields.values() + ]), + meta=metadata.Metadata(address=metadata.Address( + module="bogus", + name="Message", + )), + nested_enums={}, + nested_messages={}, + ) + + field = make_field( + type="TYPE_MESSAGE", + type_name="bogus.Message", + message=message, + ) + + mock = field.merged_mock_value({"foo": 777, "another": "another_value"}) + assert mock == {"foo": 777, "bar": "bar_value", "another": "another_value"} + + mock = field.merged_mock_value(None) + assert mock == {"bar": "bar_value", "foo": 324} + def test_mock_value_original_type_enum(): mollusc_field = make_field( name="class", From 34a9826221c5ee2360ab60654974221d1f6f3ec2 Mon Sep 17 00:00:00 2001 From: vam-google Date: Fri, 5 Aug 2022 13:24:27 -0700 Subject: [PATCH 2/2] fix style --- tests/unit/schema/wrappers/test_field.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/unit/schema/wrappers/test_field.py b/tests/unit/schema/wrappers/test_field.py index be7ae75baa..e580d43e4a 100644 --- a/tests/unit/schema/wrappers/test_field.py +++ b/tests/unit/schema/wrappers/test_field.py @@ -435,6 +435,7 @@ def test_merged_mock_value_message(): mock = field.merged_mock_value(None) assert mock == {"bar": "bar_value", "foo": 324} + def test_mock_value_original_type_enum(): mollusc_field = make_field( name="class",