From 5324ef3c456d8563cebac93beb401f485d8b2c83 Mon Sep 17 00:00:00 2001
From: Alex Petraky <petraky@perx.ru>
Date: Wed, 11 Sep 2024 08:21:06 +0000
Subject: [PATCH] =?UTF-8?q?fix(setup):=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=D0=B2=20Setup=20=D0=BF=D1=80=D0=B8=20=D0=BF=D0=B5?=
 =?UTF-8?q?=D1=80=D0=B5=D0=B4=D0=B0=D1=87=D0=B5=20=D0=BE=D0=BF=D1=86=D0=B8?=
 =?UTF-8?q?=D0=B9=20=D0=B8=D0=B7-=D0=B7=D0=B0=20=D0=BA=D0=BE=D1=82=D0=BE?=
 =?UTF-8?q?=D1=80=D0=BE=D0=B9=20=D0=BD=D0=B5=20=D1=81=D0=BE=D1=85=D1=80?=
 =?UTF-8?q?=D0=B0=D0=BD=D1=8F=D0=BB=D0=B0=D1=81=D1=8C=20=D1=84=D0=BE=D1=80?=
 =?UTF-8?q?=D0=BC=D0=B8=D1=80=D1=83=D0=B5=D0=BC=D0=B0=D1=8F=20=D0=BA=D0=BE?=
 =?UTF-8?q?=D0=BD=D1=84=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D1=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Close #PRXS-2824
---
 pkg/setup/config.go      | 18 +++++-----
 pkg/setup/config_test.go | 71 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 80 insertions(+), 9 deletions(-)
 create mode 100644 pkg/setup/config_test.go

diff --git a/pkg/setup/config.go b/pkg/setup/config.go
index 08e1c740..bdf47aed 100644
--- a/pkg/setup/config.go
+++ b/pkg/setup/config.go
@@ -67,10 +67,10 @@ func (cfg *Config) MustLoad(fsys fs.FS) *Config {
 }
 
 func (cfg *Config) WithCollectionOptions(filter func(c *collections.Collection) bool, opts ...CollectionsOption) *Config {
-	for _, c := range cfg.Collections {
+	for i, c := range cfg.Collections {
 		if filter(c.collection) {
 			for _, o := range opts {
-				o(&c)
+				o(&cfg.Collections[i])
 			}
 		}
 	}
@@ -78,10 +78,10 @@ func (cfg *Config) WithCollectionOptions(filter func(c *collections.Collection)
 }
 
 func (cfg *Config) WithItemsOptions(filter func(c *items.Item) bool, opts ...ItemsOption) *Config {
-	for _, i := range cfg.Items {
-		if filter(i.item) {
+	for i, c := range cfg.Items {
+		if filter(c.item) {
 			for _, o := range opts {
-				o(&i)
+				o(&cfg.Items[i])
 			}
 		}
 	}
@@ -89,10 +89,10 @@ func (cfg *Config) WithItemsOptions(filter func(c *items.Item) bool, opts ...Ite
 }
 
 func (cfg *Config) WithRolesOptions(filter func(c *roles.Role) bool, opts ...RolesOption) *Config {
-	for _, r := range cfg.Roles {
+	for i, r := range cfg.Roles {
 		if filter(r.role) {
 			for _, o := range opts {
-				o(&r)
+				o(&cfg.Roles[i])
 			}
 		}
 	}
@@ -100,10 +100,10 @@ func (cfg *Config) WithRolesOptions(filter func(c *roles.Role) bool, opts ...Rol
 }
 
 func (cfg *Config) WithClientsOptions(filter func(c *clients.Client) bool, opts ...ClientsOption) *Config {
-	for _, c := range cfg.Clients {
+	for i, c := range cfg.Clients {
 		if filter(c.client) {
 			for _, o := range opts {
-				o(&c)
+				o(&cfg.Clients[i])
 			}
 		}
 	}
diff --git a/pkg/setup/config_test.go b/pkg/setup/config_test.go
new file mode 100644
index 00000000..7e5c1589
--- /dev/null
+++ b/pkg/setup/config_test.go
@@ -0,0 +1,71 @@
+package setup
+
+import (
+	"testing"
+
+	"git.perx.ru/perxis/perxis-go/pkg/clients"
+	"git.perx.ru/perxis/perxis-go/pkg/collections"
+	"git.perx.ru/perxis/perxis-go/pkg/items"
+	"git.perx.ru/perxis/perxis-go/pkg/roles"
+	"github.com/stretchr/testify/assert"
+)
+
+func TestConfig_WithCollectionOptions(t *testing.T) {
+	t.Run("With filter", func(t *testing.T) {
+		// создаем конфигурацию
+		config := &Config{Collections: []CollectionConfig{
+			{collection: &collections.Collection{ID: "1", SpaceID: "sp", EnvID: "env"}},
+			{collection: &collections.Collection{ID: "2", SpaceID: "sp", EnvID: "env"}},
+		}}
+
+		// применяем опцию OverwriteCollection к конфигурации и дополнительно добавляем фильтр (опция применится только к коллекции с id 1)
+		config.WithCollectionOptions(func(c *collections.Collection) bool { return c.ID == "1" }, OverwriteCollection())
+		assert.NotNil(t, config.Collections[0].UpdateFn, "должна быть выполнена OverwriteCollection и установлена UpdateFn для коллекции ID:1")
+		assert.Nil(t, config.Collections[1].UpdateFn)
+	})
+}
+
+func TestConfig_WithItemsOptions(t *testing.T) {
+	t.Run("With filter", func(t *testing.T) {
+		// создаем конфигурацию
+		config := &Config{Items: []ItemConfig{
+			{item: &items.Item{ID: "1", SpaceID: "sp", EnvID: "env", CollectionID: "coll"}},
+			{item: &items.Item{ID: "2", SpaceID: "sp", EnvID: "env", CollectionID: "coll"}},
+		}}
+
+		// применяем опцию OverwriteItem к конфигурации и дополнительно добавляем фильтр (опция применится только к коллекции с id 1)
+		config.WithItemsOptions(func(c *items.Item) bool { return c.ID == "1" }, OverwriteItem())
+		assert.NotNil(t, config.Items[0].UpdateFn, "должна быть выполнена OverwriteItem и установлена UpdateFn для элемента ID: 1")
+		assert.Nil(t, config.Items[1].UpdateFn)
+	})
+}
+
+func TestConfig_WithRoleOptions(t *testing.T) {
+	t.Run("With filter", func(t *testing.T) {
+		// создаем конфигурацию
+		config := &Config{Roles: []RoleConfig{
+			{role: &roles.Role{ID: "1", SpaceID: "sp"}},
+			{role: &roles.Role{ID: "2", SpaceID: "sp"}},
+		}}
+
+		// применяем опцию OverwriteRole к конфигурации и дополнительно добавляем фильтр (опция применится только к коллекции с id 1)
+		config.WithRolesOptions(func(c *roles.Role) bool { return c.ID == "1" }, OverwriteRole())
+		assert.NotNil(t, config.Roles[0].UpdateFn, "должна быть выполнена опция OverwriteRole")
+		assert.Nil(t, config.Roles[1].UpdateFn)
+	})
+}
+
+func TestConfig_WithClientOptions(t *testing.T) {
+	t.Run("With filter", func(t *testing.T) {
+		// создаем конфигурацию
+		config := &Config{Clients: []ClientConfig{
+			{client: &clients.Client{ID: "1", SpaceID: "sp"}},
+			{client: &clients.Client{ID: "2", SpaceID: "sp"}},
+		}}
+
+		// применяем опцию OverwriteClient к конфигурации и дополнительно добавляем фильтр (опция применится только к коллекции с id 1)
+		config.WithClientsOptions(func(c *clients.Client) bool { return c.ID == "1" }, OverwriteClient())
+		assert.NotNil(t, config.Clients[0].UpdateFn, "должна выполнена опция OverwriteClient")
+		assert.Nil(t, config.Clients[1].UpdateFn)
+	})
+}
-- 
GitLab