1 package fieldmask
2
3 import (
4 "testing"
5
6 "google.golang.org/genproto/googleapis/example/library/v1"
7 "google.golang.org/protobuf/proto"
8 "google.golang.org/protobuf/types/known/fieldmaskpb"
9 "gotest.tools/v3/assert"
10 )
11
12 func TestValidate(t *testing.T) {
13 t.Parallel()
14 for _, tt := range []struct {
15 name string
16 fieldMask *fieldmaskpb.FieldMask
17 message proto.Message
18 errorContains string
19 }{
20 {
21 name: "valid nil",
22 message: &library.Book{},
23 },
24 {
25 name: "valid *",
26 fieldMask: &fieldmaskpb.FieldMask{Paths: []string{"*"}},
27 message: &library.Book{},
28 },
29 {
30 name: "invalid *",
31 fieldMask: &fieldmaskpb.FieldMask{Paths: []string{"*", "author"}},
32 message: &library.Book{},
33 errorContains: "invalid field path: '*' must not be used with other paths",
34 },
35 {
36 name: "valid empty",
37 fieldMask: &fieldmaskpb.FieldMask{},
38 message: &library.Book{},
39 },
40
41 {
42 name: "valid single",
43 fieldMask: &fieldmaskpb.FieldMask{
44 Paths: []string{"name", "author"},
45 },
46 message: &library.Book{},
47 },
48
49 {
50 name: "invalid single",
51 fieldMask: &fieldmaskpb.FieldMask{
52 Paths: []string{"name", "foo"},
53 },
54 message: &library.Book{},
55 errorContains: "invalid field path: foo",
56 },
57
58 {
59 name: "valid nested",
60 fieldMask: &fieldmaskpb.FieldMask{
61 Paths: []string{"parent", "book.name"},
62 },
63 message: &library.CreateBookRequest{},
64 },
65
66 {
67 name: "invalid nested",
68 fieldMask: &fieldmaskpb.FieldMask{
69 Paths: []string{"parent", "book.foo"},
70 },
71 message: &library.CreateBookRequest{},
72 errorContains: "invalid field path: book.foo",
73 },
74 } {
75 tt := tt
76 t.Run(tt.name, func(t *testing.T) {
77 t.Parallel()
78 if tt.errorContains != "" {
79 assert.ErrorContains(t, Validate(tt.fieldMask, tt.message), tt.errorContains)
80 } else {
81 assert.NilError(t, Validate(tt.fieldMask, tt.message))
82 }
83 })
84 }
85 }
86
View as plain text