Skip to content
Snippets Groups Projects
Commit d725e2e1 authored by ko_oler's avatar ko_oler
Browse files

правки по ПР:

- выделена функция isCollsSchemaMetadataEqual()
parent facddf27
No related branches found
No related tags found
No related merge requests found
......@@ -21,7 +21,7 @@ var (
// todo добавлено в релизе v0.0.16: временный флаг для установки метадаты во все коллекции расширений
const (
AlwaysSetSchema = true
alwaysSetSchema = true
)
type CollectionsOption func(c *CollectionConfig)
......@@ -75,15 +75,35 @@ 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] {
if !s.IsForce() && !isCollsSchemaMetadataEqual(collection, exist) {
return nil, false, false, errors.WithDetailf(collections.ErrAlreadyExists, "Коллекция с идентификатором '%s' "+
"уже существует. Удалите ее или вызовите установку расширения с флагом Force", collection.ID)
}
}
if len(exist.Tags) > 0 {
collection.Tags = data.SetFromSlice(append(exist.Tags, collection.Tags...))
......@@ -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
}
......
......@@ -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)
// })
// }
//}
......@@ -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)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment