diff --git a/pkg/schema/field/object.go b/pkg/schema/field/object.go index d86aa2352544f68ea837152ec6799677f4624d1a..1f995cceba1816c67454d94771ef3287e86d948c 100644 --- a/pkg/schema/field/object.go +++ b/pkg/schema/field/object.go @@ -74,12 +74,18 @@ func (p *ObjectParameters) Merge(parameters Parameters) error { if !ok { return errors.New("invalid object parameters") } + if op == nil { + return nil + } for k, fld := range op.Fields { if f, ok := p.Fields[k]; ok { if err := f.Merge(fld); err != nil { return err } } else { + if p.Fields == nil { + p.Fields = make(map[string]*Field) + } p.Fields[k] = fld } } diff --git a/pkg/schema/field/object_test.go b/pkg/schema/field/object_test.go index a85d4488c74997f2e665489fb86a870a64aa96c0..cf4d773bedc4c02694e425602f918131ee5a2655 100644 --- a/pkg/schema/field/object_test.go +++ b/pkg/schema/field/object_test.go @@ -231,3 +231,59 @@ func TestFieldNameValidate(t *testing.T) { }) } } + +func TestObjectParameters_Merge(t *testing.T) { + tests := []struct { + name string + l, r *ObjectParameters + wantErr assert.ErrorAssertionFunc + want *ObjectParameters + }{ + { + name: "right is nil", + l: &ObjectParameters{}, + r: nil, + wantErr: assert.NoError, + want: &ObjectParameters{}, + }, + { + name: "right has nil Fields map", + l: objectType.NewParameters().(*ObjectParameters), + r: &ObjectParameters{Fields: nil}, + wantErr: assert.NoError, + want: &ObjectParameters{}, + }, + { + name: "left + right is empty object", + l: objectType.NewParameters().(*ObjectParameters), + r: objectType.NewParameters().(*ObjectParameters), + wantErr: assert.NoError, + want: &ObjectParameters{}, + }, + { + name: "left + right with data", + l: &ObjectParameters{Fields: map[string]*Field{"a": {Title: "Text1", Description: "test description"}}}, + r: &ObjectParameters{Fields: map[string]*Field{"b": {Title: "Text2", Description: "test description"}}}, + wantErr: assert.NoError, + want: &ObjectParameters{Fields: map[string]*Field{ + "a": {Title: "Text1", Description: "test description"}, + "b": {Title: "Text2", Description: "test description"}, + }}, + }, + { + name: "left empty + right with data", + l: &ObjectParameters{}, + r: &ObjectParameters{Fields: map[string]*Field{"b": {Title: "Text2", Description: "test description"}}}, + wantErr: assert.NoError, + want: &ObjectParameters{Fields: map[string]*Field{ + "b": {Title: "Text2", Description: "test description"}, + }}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.wantErr(t, tt.l.Merge(tt.r), fmt.Sprintf("Merge(%v)", tt.l)) + assert.Equal(t, tt.l, tt.want) + }) + } +}