From 3c4b955915e26b063aceac7169d6b0f82b7c96bf Mon Sep 17 00:00:00 2001
From: Alex Petraky <petraky@perx.ru>
Date: Wed, 7 Aug 2024 14:04:16 +0000
Subject: [PATCH] =?UTF-8?q?fix(core):=20=D0=98=D1=81=D0=BF=D1=80=D0=B0?=
 =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA?=
 =?UTF-8?q?=D0=B0=20"assignment=20to=20entry=20in=20nil=20map"=20=D0=B5?=
 =?UTF-8?q?=D1=81=D0=BB=D0=B8=20=D1=83=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA?=
 =?UTF-8?q?=D1=82=D0=B0=20=D1=81=D1=85=D0=B5=D0=BC=D1=8B=20=D0=BE=D1=82?=
 =?UTF-8?q?=D1=81=D1=83=D1=82=D1=81=D1=82=D0=B2=D0=BE=D0=B2=D0=B0=D0=BB?=
 =?UTF-8?q?=D0=B8=20=D0=BF=D0=BE=D0=BB=D1=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Close #PRXS-2770
---
 pkg/schema/field/object.go      |  6 ++++
 pkg/schema/field/object_test.go | 56 +++++++++++++++++++++++++++++++++
 2 files changed, 62 insertions(+)

diff --git a/pkg/schema/field/object.go b/pkg/schema/field/object.go
index d86aa235..1f995cce 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 a85d4488..cf4d773b 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)
+		})
+	}
+}
-- 
GitLab