From 4abc8ae02131b80c842c030b901c594dd3b63b27 Mon Sep 17 00:00:00 2001 From: Gani Georgiev Date: Sat, 24 Dec 2022 08:34:42 +0200 Subject: [PATCH] [#1365] fixed Record.MergeExpand panic --- models/record.go | 4 ++++ models/record_test.go | 43 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/models/record.go b/models/record.go index ae3ccdff..51380b49 100644 --- a/models/record.go +++ b/models/record.go @@ -139,6 +139,10 @@ func (m *Record) SetExpand(expand map[string]any) { // then both old and new records will be merged into a new slice (aka. a :merge: [b,c] => [a,b,c]). // Otherwise the "old" expanded record will be replace with the "new" one (aka. a :merge: aNew => aNew). func (m *Record) MergeExpand(expand map[string]any) { + if m.expand == nil && len(expand) > 0 { + m.expand = make(map[string]any) + } + for key, new := range expand { old, ok := m.expand[key] if !ok { diff --git a/models/record_test.go b/models/record_test.go index 1674c614..bd47f3ef 100644 --- a/models/record_test.go +++ b/models/record_test.go @@ -375,7 +375,7 @@ func TestRecordSetAndGetExpand(t *testing.T) { } } -func TestRecordMergeExpandDirect(t *testing.T) { +func TestRecordMergeExpand(t *testing.T) { collection := &models.Collection{} m := models.NewRecord(collection) m.Id = "m" @@ -467,6 +467,47 @@ func TestRecordMergeExpandDirect(t *testing.T) { } } +func TestRecordMergeExpandNilCheck(t *testing.T) { + collection := &models.Collection{} + + scenarios := []struct { + name string + expand map[string]any + expected string + }{ + { + "nil expand", + nil, + `{"collectionId":"","collectionName":"","created":"","id":"","updated":""}`, + }, + { + "empty expand", + map[string]any{}, + `{"collectionId":"","collectionName":"","created":"","id":"","updated":""}`, + }, + { + "non-empty expand", + map[string]any{"test": models.NewRecord(collection)}, + `{"collectionId":"","collectionName":"","created":"","expand":{"test":{"collectionId":"","collectionName":"","created":"","id":"","updated":""}},"id":"","updated":""}`, + }, + } + + for _, s := range scenarios { + m := models.NewRecord(collection) + m.MergeExpand(s.expand) + + raw, err := json.Marshal(m) + if err != nil { + t.Fatal(err) + } + rawStr := string(raw) + + if rawStr != s.expected { + t.Fatalf("[%s] Expected \n%v, \ngot \n%v", s.name, s.expected, rawStr) + } + } +} + func TestRecordSchemaData(t *testing.T) { collection := &models.Collection{ Type: models.CollectionTypeAuth,