github.com/googleapis/api-linter@v1.65.2/rules/aip0216/state_field_output_only_test.go (about) 1 // Copyright 2019 Google LLC 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // https://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package aip0216 16 17 import ( 18 "testing" 19 20 "github.com/googleapis/api-linter/rules/internal/testutils" 21 ) 22 23 func TestStateFieldOutputOnly(t *testing.T) { 24 tests := []struct { 25 name string 26 FieldName string 27 FieldType string 28 FieldBehavior string 29 problems testutils.Problems 30 }{ 31 // Accepted 32 {"ValidState", "state", "State", "[(google.api.field_behavior) = OUTPUT_ONLY]", testutils.Problems{}}, 33 {"ValidOtherFieldName", "country", "State", "[(google.api.field_behavior) = OUTPUT_ONLY]", testutils.Problems{}}, 34 {"ValidStateSuffix", "state", "WritersBlockState", "[(google.api.field_behavior) = OUTPUT_ONLY]", testutils.Problems{}}, 35 36 // No Annotation 37 {"InvalidState", "state", "State", "", testutils.Problems{{Message: "OUTPUT_ONLY"}}}, 38 {"InvalidWithSuffix", "state", "WritersBlockState", "", testutils.Problems{{Message: "OUTPUT_ONLY"}}}, 39 {"InvalidWithFieldName", "city", "State", "", testutils.Problems{{Message: "OUTPUT_ONLY"}}}, 40 41 // Ignored 42 {"NotAStateField", "state", "StateOfDespair", "", testutils.Problems{}}, 43 {"NotAnEnum", "state", "StateOfState", "", testutils.Problems{}}, 44 } 45 for _, test := range tests { 46 t.Run(test.name, func(t *testing.T) { 47 f := testutils.ParseProto3Tmpl(t, ` 48 import "google/api/field_behavior.proto"; 49 50 message Book { 51 enum State { 52 STATE_UNSPECIFIED = 0; 53 ACTIVE = 1; 54 } 55 56 message StateOfState { 57 string name = 1; 58 } 59 60 // state enums end with 'State' 61 enum WritersBlockState { 62 WRITERS_BLOCK_STATE_UNSPECIFIED = 0; 63 BLOCKED = 1; 64 } 65 66 // not a state enum 67 enum StateOfDespair { 68 STATE_OF_DESPAIR_UNSPECIFIED = 0; 69 NOTREALLY = 1; 70 } 71 72 string other_state = 1; 73 {{.FieldType}} {{.FieldName}} = 2 {{.FieldBehavior}}; 74 } 75 `, test) 76 77 field := f.GetMessageTypes()[0].GetFields()[1] 78 if diff := test.problems.SetDescriptor(field).Diff(stateFieldOutputOnly.Lint(f)); diff != "" { 79 t.Errorf(diff) 80 } 81 }) 82 } 83 }