From 3f95e04e393ceba337deee2ae890fa56171ef077 Mon Sep 17 00:00:00 2001
From: ko_oler <kooler89@gmail.com>
Date: Mon, 10 Jul 2023 14:16:12 +0300
Subject: [PATCH] =?UTF-8?q?-=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?=
 =?UTF-8?q?=D0=BF=D1=80=D0=B8=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B5=20?=
 =?UTF-8?q?=D1=81=20view-=D0=BA=D0=BE=D0=BB=D0=BB=D0=B5=D0=BA=D1=86=D0=B8?=
 =?UTF-8?q?=D1=8F=D0=BC=D0=B8=20-=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?=
 =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pkg/setup/collection.go      | 12 +++++++-----
 pkg/setup/collection_test.go | 31 +++++++++++++++++++++++++++++++
 2 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/pkg/setup/collection.go b/pkg/setup/collection.go
index bb0fc2d9..1ebd0a99 100644
--- a/pkg/setup/collection.go
+++ b/pkg/setup/collection.go
@@ -139,16 +139,17 @@ func (s *Setup) InstallCollection(ctx context.Context, c CollectionConfig) (setS
 	collection.SpaceID, collection.EnvID = s.SpaceID, s.EnvironmentID
 
 	var exist *collections.Collection
-	// isForce - не удалять коллекцию, если она уже существует
+
 	exist, err = s.content.Collections.Get(ctx, collection.SpaceID, collection.EnvID, collection.ID)
 	if err != nil && !strings.Contains(err.Error(), collections.ErrNotFound.Error()) {
 		return false, err
 	}
 
-	if c.metadata != nil {
+	if !collection.IsView() {
 		for k, v := range c.metadata {
 			collection.Schema.WithMetadata(k, v)
 		}
+		//setMD = true
 	}
 
 	if exist == nil {
@@ -158,10 +159,11 @@ func (s *Setup) InstallCollection(ctx context.Context, c CollectionConfig) (setS
 			return false, err
 		}
 	} else {
-		if collection.Schema.Metadata != nil && exist.Schema.Metadata[extension.ExtensionMetadataKey] != collection.Schema.Metadata[extension.ExtensionMetadataKey] && !s.IsForce() {
-			return false, ErrCollectionAlreadyExists
+		if !collection.IsView() && !exist.IsView() {
+			if collection.Schema.Metadata != nil && exist.Schema.Metadata[extension.ExtensionMetadataKey] != collection.Schema.Metadata[extension.ExtensionMetadataKey] && !s.IsForce() {
+				return false, ErrCollectionAlreadyExists
+			}
 		}
-
 		var upd bool
 		collection, upd, setSchema = c.UpdateFn(s, exist, c.collection)
 		if upd {
diff --git a/pkg/setup/collection_test.go b/pkg/setup/collection_test.go
index a3a6bafa..f23aa2b4 100644
--- a/pkg/setup/collection_test.go
+++ b/pkg/setup/collection_test.go
@@ -137,6 +137,37 @@ func TestSetup_InstallCollections(t *testing.T) {
 			co:    SetSchemaMetadata("extension", "test-extension"),
 			force: true,
 		},
+		{
+			name:        "Update exist view collection with the same id",
+			collections: []*collections.Collection{{ID: "1", SpaceID: "sp", EnvID: "env", Schema: schema.New("name", field.String()).WithMetadata("extension", "test-extension")}},
+			collectionsCall: func(svc *mockscollections.Collections) {
+				svc.On("Get", mock.Anything, "sp", "env", "1").Return(&collections.Collection{ID: "1", SpaceID: "sp", EnvID: "env", View: &collections.View{SpaceID: "sp2", EnvID: environments.DefaultEnvironment, CollectionID: "2"}}, nil).Once()
+				svc.On("Update", mock.Anything, &collections.Collection{ID: "1", SpaceID: "sp", EnvID: "env", Schema: schema.New("name", field.String()).WithMetadata("extension", "test-extension")}).Return(nil).Once()
+				svc.On("SetSchema", mock.Anything, "sp", "env", "1", schema.New("name", field.String()).WithMetadata("extension", "test-extension")).Return(nil).Once()
+			},
+			envsCall: func(svc *envmocks.Environments) {
+				svc.On("Migrate", mock.Anything, "sp", "env", &environments.MigrateOptions{Wait: true}).Return(nil).Once()
+			},
+			wantErr: func(t *testing.T, err error) {
+				assert.NoError(t, err)
+			},
+			co: SetSchemaMetadata("extension", "test-extension"),
+		},
+		{
+			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"}}},
+			collectionsCall: func(svc *mockscollections.Collections) {
+				svc.On("Get", mock.Anything, "sp", "env", "1").Return(&collections.Collection{ID: "1", SpaceID: "sp", EnvID: "env", View: &collections.View{SpaceID: "sp2", EnvID: environments.DefaultEnvironment, CollectionID: "2"}}, nil).Once()
+				svc.On("Update", mock.Anything, &collections.Collection{ID: "1", SpaceID: "sp", EnvID: "env", View: &collections.View{SpaceID: "sp3", EnvID: environments.DefaultEnvironment, CollectionID: "3"}}).Return(nil).Once()
+			},
+			envsCall: func(svc *envmocks.Environments) {
+				svc.On("Migrate", mock.Anything, "sp", "env", &environments.MigrateOptions{Wait: true}).Return(nil).Once()
+			},
+			wantErr: func(t *testing.T, err error) {
+				assert.NoError(t, err)
+			},
+			co: SetSchemaMetadata("extension", "test-extension"),
+		},
 	}
 
 	for _, tt := range tests {
-- 
GitLab