From d725e2e151b624227e29d5c337786cfd70bd4160 Mon Sep 17 00:00:00 2001 From: ko_oler <kooler89@gmail.com> Date: Thu, 20 Jul 2023 17:19:16 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D0=9F=D0=A0:=20-=20=D0=B2=D1=8B=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F?= =?UTF-8?q?=20isCollsSchemaMetadataEqual()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/setup/collection.go | 34 +++++++++--- pkg/setup/collection_test.go | 102 ++++++++++++++++++++++++++++++++++- pkg/setup/setup_test.go | 10 ++-- 3 files changed, 132 insertions(+), 14 deletions(-) diff --git a/pkg/setup/collection.go b/pkg/setup/collection.go index 8ffd87a0..b5dec74a 100644 --- a/pkg/setup/collection.go +++ b/pkg/setup/collection.go @@ -21,7 +21,7 @@ var ( // todo добавлено в релизе v0.0.16: временный флаг для установки метадаты во все коллекции расширений const ( - AlwaysSetSchema = true + alwaysSetSchema = true ) type CollectionsOption func(c *CollectionConfig) @@ -75,14 +75,34 @@ func DeleteCollectionIfRemove() CollectionsOption { } } +func isCollsSchemaMetadataEqual(collection, exist *collections.Collection) bool { + if alwaysSetSchema { + return true + } + + if collection.IsView() && exist.IsView() { + return true + } + + if collection.Schema.Metadata == nil && exist.Schema.Metadata == nil { + return true + } + + if collection.Schema.Metadata != nil && collection.Schema.Metadata[extension.ExtensionMetadataKey] != "" { + if exist.Schema.Metadata == nil || exist.Schema.Metadata[extension.ExtensionMetadataKey] != collection.Schema.Metadata[extension.ExtensionMetadataKey] { + return false + } + } + + return true +} + func DefaultUpdateCollectionStrategy() CollectionsOption { return func(c *CollectionConfig) { c.UpdateFn = func(s *Setup, exist, collection *collections.Collection) (*collections.Collection, bool, bool, error) { - if !AlwaysSetSchema && !s.IsForce() && !collection.IsView() && !exist.IsView() && collection.Schema.Metadata != nil && collection.Schema.Metadata[extension.ExtensionMetadataKey] != "" { - if exist.Schema.Metadata == nil || exist.Schema.Metadata[extension.ExtensionMetadataKey] != collection.Schema.Metadata[extension.ExtensionMetadataKey] { - return nil, false, false, errors.WithDetailf(collections.ErrAlreadyExists, "Коллекция с идентификатором '%s' "+ - "уже существует. Удалите ее или вызовите установку расширения с флагом Force", collection.ID) - } + if !s.IsForce() && !isCollsSchemaMetadataEqual(collection, exist) { + return nil, false, false, errors.WithDetailf(collections.ErrAlreadyExists, "Коллекция с идентификатором '%s' "+ + "уже существует. Удалите ее или вызовите установку расширения с флагом Force", collection.ID) } if len(exist.Tags) > 0 { @@ -97,7 +117,7 @@ func DefaultUpdateCollectionStrategy() CollectionsOption { update = update && *exist.View == *collection.View } - setSchema = AlwaysSetSchema || !collection.IsView() && !reflect.DeepEqual(exist.Schema, collection.Schema) + setSchema = alwaysSetSchema || !collection.IsView() && !reflect.DeepEqual(exist.Schema, collection.Schema) return collection, update, setSchema, nil } diff --git a/pkg/setup/collection_test.go b/pkg/setup/collection_test.go index cea12baf..5d9c3b01 100644 --- a/pkg/setup/collection_test.go +++ b/pkg/setup/collection_test.go @@ -108,7 +108,7 @@ func TestSetup_InstallCollections(t *testing.T) { assert.NoError(t, err) }, }, - //todo после удаления флага AlwaysSetSchema данный тест будет работать, сейчас он будет всегда падать, поэтому пока закомментирован + //todo после удаления флага alwaysSetSchema данный тест будет работать, сейчас он будет всегда падать, поэтому пока закомментирован //{ //name: "Fail to update user collection with same id as in extensions collection", //collections: []*collections.Collection{{ID: "1", SpaceID: "sp", EnvID: "env", Schema: schema.New("name", field.String()).WithMetadata(extension.ExtensionMetadataKey, "test-extension")}}, @@ -151,7 +151,7 @@ func TestSetup_InstallCollections(t *testing.T) { assert.NoError(t, err) }, }, - //todo после удаления флага AlwaysSetSchema данный тест будет работать, сейчас он будет всегда падать, поэтому пока закомментирован + //todo после удаления флага alwaysSetSchema данный тест будет работать, сейчас он будет всегда падать, поэтому пока закомментирован //{ // name: "Update view collection with the same id to new view collection", // collections: []*collections.Collection{{ID: "1", SpaceID: "sp", EnvID: "env", View: &collections.View{SpaceID: "sp3", EnvID: environments.DefaultEnvironment, CollectionID: "3"}}}, @@ -202,3 +202,101 @@ func TestSetup_InstallCollections(t *testing.T) { }) } } + +//todo после удаления флага alwaysSetSchema раскомментировать +//func Test_isCollsSchemaMetadataEqual(t *testing.T) { +// type args struct { +// } +// tests := []struct { +// name string +// collection *collections.Collection +// exist *collections.Collection +// want bool +// }{ +// { +// "Not equal #1 (no metadata in exist coll)", +// &collections.Collection{ +// ID: "1", +// SpaceID: "sp", +// EnvID: "env", +// Name: "coll1", +// Schema: schema.New("name", field.String()).WithMetadata(extension.ExtensionMetadataKey, "test"), +// }, +// &collections.Collection{ +// ID: "2", +// SpaceID: "sp", +// EnvID: "env", +// Name: "coll2", +// Schema: schema.New("name", field.String()), +// }, +// false, +// }, +// { +// "Not equal #2 (different metadata)", +// &collections.Collection{ +// ID: "1", +// SpaceID: "sp", +// EnvID: "env", +// Name: "coll1", +// Schema: schema.New("name", field.String()).WithMetadata(extension.ExtensionMetadataKey, "test"), +// }, +// &collections.Collection{ +// ID: "2", +// SpaceID: "sp", +// EnvID: "env", +// Name: "coll2", +// Schema: schema.New("name", field.String()).WithMetadata("test", "test"), +// }, +// false, +// }, +// { +// "Equal #1 (no metadata)", +// &collections.Collection{ +// ID: "1", +// SpaceID: "sp", +// EnvID: "env", +// Name: "coll1", +// Schema: schema.New("name", field.String()), +// }, +// &collections.Collection{ +// ID: "2", +// SpaceID: "sp", +// EnvID: "env", +// Name: "coll2", +// Schema: schema.New("name", field.String()), +// }, +// true, +// }, +// { +// "Equal #1 (both view colls)", +// &collections.Collection{ +// ID: "1", +// SpaceID: "sp", +// EnvID: "env", +// Name: "coll1", +// View: &collections.View{ +// SpaceID: "sp", +// EnvID: "env", +// CollectionID: "3", +// }, +// }, +// &collections.Collection{ +// ID: "2", +// SpaceID: "sp", +// EnvID: "env", +// Name: "coll2", +// View: &collections.View{ +// SpaceID: "sp", +// EnvID: "env", +// CollectionID: "4", +// }, +// }, +// true, +// }, +// } +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// assert.Equalf(t, tt.want, isCollsSchemaMetadataEqual(tt.collection, tt.exist), "isCollsSchemaMetadataEqual(%v, %v)", tt.collection, tt.exist) +// }) +// } +//} diff --git a/pkg/setup/setup_test.go b/pkg/setup/setup_test.go index 01dc4d9f..e722041e 100644 --- a/pkg/setup/setup_test.go +++ b/pkg/setup/setup_test.go @@ -179,7 +179,7 @@ func TestSetupInstall(t *testing.T) { t.Run("Success, update existing records", func(t *testing.T) { envMocks := &environmentMock.Environments{} - //todo после удаления флага AlwaysSetSchema убрать лишний вызов + //todo после удаления флага alwaysSetSchema убрать лишний вызов envMocks.On("Migrate", mock.Anything, spaceID, envID, &environments.MigrateOptions{Wait: true}). Return(nil).Once() @@ -187,7 +187,7 @@ func TestSetupInstall(t *testing.T) { collsMock.On("Get", mock.Anything, spaceID, envID, "coll1"). Return(&collections.Collection{ID: "coll1", SpaceID: spaceID, EnvID: envID, Schema: schema.New(), Name: "Коллекция старая"}, nil).Once() collsMock.On("Update", mock.Anything, &collections.Collection{ID: "coll1", SpaceID: spaceID, EnvID: envID, Schema: schema.New(), Name: "Коллекция"}).Return(nil).Once() - //todo после удаления флага AlwaysSetSchema убрать лишний вызов + //todo после удаления флага alwaysSetSchema убрать лишний вызов collsMock.On("SetSchema", mock.Anything, "sp", "env", "coll1", schema.New()).Return(nil).Once() rMock := &rolesMock.Roles{} @@ -245,7 +245,7 @@ func TestSetupInstall(t *testing.T) { }) t.Run("Success, with force", func(t *testing.T) { - //todo после удаления флага AlwaysSetSchema убрать лишний вызов + //todo после удаления флага alwaysSetSchema убрать лишний вызов envMocks := &environmentMock.Environments{} envMocks.On("Migrate", mock.Anything, spaceID, envID, &environments.MigrateOptions{Wait: true}). Return(nil).Once() @@ -254,7 +254,7 @@ func TestSetupInstall(t *testing.T) { collsMock.On("Get", mock.Anything, spaceID, envID, "coll1"). Return(&collections.Collection{ID: "coll1", SpaceID: spaceID, EnvID: envID, Schema: schema.New(), Name: "Коллекция старая"}, nil).Once() collsMock.On("Update", mock.Anything, &collections.Collection{ID: "coll1", SpaceID: spaceID, EnvID: envID, Schema: schema.New(), Name: "Коллекция"}).Return(nil).Once() - //todo после удаления флага AlwaysSetSchema убрать лишний вызов + //todo после удаления флага alwaysSetSchema убрать лишний вызов collsMock.On("SetSchema", mock.Anything, "sp", "env", "coll1", schema.New()).Return(nil).Once() rMock := &rolesMock.Roles{} @@ -290,7 +290,7 @@ func TestSetupInstall(t *testing.T) { Clients: clMock, Roles: rMock, Items: itmMock, - //todo после удаления флага AlwaysSetSchema убрать + //todo после удаления флага alwaysSetSchema убрать Environments: envMocks, }, t) setup = setup.WithForce(true) -- GitLab