From 4e5fe2db9d0d81929cc1559d3a134c9a38ae595c Mon Sep 17 00:00:00 2001 From: Dov Shlachter Date: Fri, 10 Dec 2021 09:47:53 -0800 Subject: [PATCH] fix: syntax fix and test for multiple required fields (#1105) --- .../%name_%version/%sub/test_%service.py.j2 | 6 +- .../fragments/google/api/field_behavior.proto | 90 +++++++++++++++++++ .../test_multiple_required_fields.proto | 43 +++++++++ 3 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 tests/fragments/google/api/field_behavior.proto create mode 100644 tests/fragments/test_multiple_required_fields.proto diff --git a/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 b/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 index cd9a7c34f0..e1932e462f 100644 --- a/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 +++ b/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 @@ -1325,11 +1325,11 @@ def test_{{ method_name }}_rest_required_fields(request_type={{ method.input.ide ( "{{ req_field.name }}", {% if req_field.field_pb.default_value is string %} - "{{ req_field.field_pb.default_value }}" + "{{ req_field.field_pb.default_value }}", {% else %} - {{ req_field.field_pb.default_value }} + {{ req_field.field_pb.default_value }}, {% endif %}{# default is str #} - ) + ), {% endfor %} ] actual_params = req.call_args.kwargs['params'] diff --git a/tests/fragments/google/api/field_behavior.proto b/tests/fragments/google/api/field_behavior.proto new file mode 100644 index 0000000000..c4abe3b670 --- /dev/null +++ b/tests/fragments/google/api/field_behavior.proto @@ -0,0 +1,90 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +import "google/protobuf/descriptor.proto"; + +option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; +option java_multiple_files = true; +option java_outer_classname = "FieldBehaviorProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +extend google.protobuf.FieldOptions { + // A designation of a specific field behavior (required, output only, etc.) + // in protobuf messages. + // + // Examples: + // + // string name = 1 [(google.api.field_behavior) = REQUIRED]; + // State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; + // google.protobuf.Duration ttl = 1 + // [(google.api.field_behavior) = INPUT_ONLY]; + // google.protobuf.Timestamp expire_time = 1 + // [(google.api.field_behavior) = OUTPUT_ONLY, + // (google.api.field_behavior) = IMMUTABLE]; + repeated google.api.FieldBehavior field_behavior = 1052; +} + +// An indicator of the behavior of a given field (for example, that a field +// is required in requests, or given as output but ignored as input). +// This **does not** change the behavior in protocol buffers itself; it only +// denotes the behavior and may affect how API tooling handles the field. +// +// Note: This enum **may** receive new values in the future. +enum FieldBehavior { + // Conventional default for enums. Do not use this. + FIELD_BEHAVIOR_UNSPECIFIED = 0; + + // Specifically denotes a field as optional. + // While all fields in protocol buffers are optional, this may be specified + // for emphasis if appropriate. + OPTIONAL = 1; + + // Denotes a field as required. + // This indicates that the field **must** be provided as part of the request, + // and failure to do so will cause an error (usually `INVALID_ARGUMENT`). + REQUIRED = 2; + + // Denotes a field as output only. + // This indicates that the field is provided in responses, but including the + // field in a request does nothing (the server *must* ignore it and + // *must not* throw an error as a result of the field's presence). + OUTPUT_ONLY = 3; + + // Denotes a field as input only. + // This indicates that the field is provided in requests, and the + // corresponding field is not included in output. + INPUT_ONLY = 4; + + // Denotes a field as immutable. + // This indicates that the field may be set once in a request to create a + // resource, but may not be changed thereafter. + IMMUTABLE = 5; + + // Denotes that a (repeated) field is an unordered list. + // This indicates that the service may provide the elements of the list + // in any arbitrary order, rather than the order the user originally + // provided. Additionally, the list's order may or may not be stable. + UNORDERED_LIST = 6; + + // Denotes that this field returns a non-empty default value if not set. + // This indicates that if the user provides the empty value in a request, + // a non-empty value will be returned. The user will not be aware of what + // non-empty value to expect. + NON_EMPTY_DEFAULT = 7; +} diff --git a/tests/fragments/test_multiple_required_fields.proto b/tests/fragments/test_multiple_required_fields.proto new file mode 100644 index 0000000000..8e4cdfe157 --- /dev/null +++ b/tests/fragments/test_multiple_required_fields.proto @@ -0,0 +1,43 @@ +// Copyright (C) 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.fragment; + +import "google/api/client.proto"; +import "google/api/field_behavior.proto"; +import "google/api/annotations.proto"; + +service MultipleRequiredFields { + option (google.api.default_host) = "my.example.com"; + + rpc MyMethod(MethodRequest) returns (MethodResponse) { + option (google.api.http) = { + get: "/nomenclature/v1/kingdom/{kingdom}/phylum/{phylum}" + }; + } +} + +message Description { + string description = 1; +} + +message MethodRequest { + string kingdom = 1 [(google.api.field_behavior) = REQUIRED]; + string phylum = 2 [(google.api.field_behavior) = REQUIRED]; + Description description = 3 [(google.api.field_behavior) = REQUIRED]; +} + +message MethodResponse{} \ No newline at end of file