Skip to content
Snippets Groups Projects
Select Git revision
  • 976388baa98ac20eed503eaebae2cc8778857c50
  • master default protected
  • refactor/PRXS-3053-Files
  • feature/PRXS-3143-3235-ReferenceOptions
  • feature/PRXS-3421-ImplementNewRefAPI
  • feature/PRXS-3143-LimitReferenceFields
  • feature/PRXS-3234-FeaturePruneIdents
  • feature/3149-LocaleCodeAsID-Feature
  • feature/PRXS-3383-CollectionsRankSortAPI
  • PRXS-3421-RecursiveReferences
  • feature/PRXS-3383-CollectionsSort
  • feature/3109-SerializeFeature
  • release/0.33
  • feature/3109-RecoverySchema
  • feature/3109-feature
  • fix/PRXS-3369-ValidateFields
  • refactor/PRXS-3306-MovePkgGroup1
  • refactor/6-pkg-refactor-expr
  • fix/PRXS-3360-TemplateBuilderPatch
  • feature/3293-MongoV2
  • feature/3272-GoVersionUp
  • v0.33.1
  • v0.32.0
  • v0.31.1
  • v0.31.0
  • v0.30.0
  • v0.29.0
  • v0.28.0
  • v0.27.0-alpha.1+16
  • v0.27.0-alpha.1+15
  • v0.27.0-alpha.1+14
  • v0.27.0-alpha.1+13
  • v0.27.0-alpha.1+12
  • v0.27.0-alpha.1+11
  • v0.27.0-alpha.1+10
  • v0.27.0-alpha.1+9
  • v0.27.0-alpha.1+8
  • v0.27.0-alpha.1+7
  • v0.27.0-alpha.1+6
  • v0.27.0-alpha.1+5
  • v0.27.0-alpha.1+4
41 results

client_encode_middleware_test.go

Blame
  • setup_test.go 34.31 KiB
    package setup
    
    import (
    	"context"
    	"testing"
    
    	"git.perx.ru/perxis/perxis-go/pkg/clients"
    	clientsMock "git.perx.ru/perxis/perxis-go/pkg/clients/mocks"
    	"git.perx.ru/perxis/perxis-go/pkg/collections"
    	collectionMock "git.perx.ru/perxis/perxis-go/pkg/collections/mocks"
    	"git.perx.ru/perxis/perxis-go/pkg/content"
    	"git.perx.ru/perxis/perxis-go/pkg/data"
    	"git.perx.ru/perxis/perxis-go/pkg/environments"
    	environmentMock "git.perx.ru/perxis/perxis-go/pkg/environments/mocks"
    	"git.perx.ru/perxis/perxis-go/pkg/errors"
    	"git.perx.ru/perxis/perxis-go/pkg/extension"
    	"git.perx.ru/perxis/perxis-go/pkg/items"
    	itemsMock "git.perx.ru/perxis/perxis-go/pkg/items/mocks"
    	"git.perx.ru/perxis/perxis-go/pkg/roles"
    	rolesMock "git.perx.ru/perxis/perxis-go/pkg/roles/mocks"
    	"git.perx.ru/perxis/perxis-go/pkg/schema"
    	"github.com/stretchr/testify/assert"
    	"github.com/stretchr/testify/mock"
    	"github.com/stretchr/testify/require"
    	"go.uber.org/zap/zaptest"
    )
    
    const (
    	spaceID = "sp"
    	envID   = "env"
    )
    
    func getCollections() []*collections.Collection {
    	return []*collections.Collection{
    		{
    			ID:      "coll1",
    			SpaceID: spaceID,
    			EnvID:   envID,
    			Schema:  schema.New(),
    			Name:    "Коллекция",
    		},
    	}
    }
    
    func getRoles() []*roles.Role {
    	return []*roles.Role{
    		{
    			ID:      "role",
    			SpaceID: spaceID,
    		},
    	}
    }
    
    func getClients() []*clients.Client {
    	return []*clients.Client{
    		{
    			ID:      "client",
    			SpaceID: spaceID,
    			RoleID:  "role",
    		},
    	}
    }
    
    func getActions() []*items.Item {
    	return []*items.Item{
    		{
    			ID:           "act",
    			SpaceID:      spaceID,
    			EnvID:        envID,
    			CollectionID: extension.ActionsCollectionID,
    			Data: map[string]interface{}{
    				"action":    "act",
    				"name":      "Action",
    				"extension": "ext",
    			},
    		},
    	}
    }
    
    func newSetup(content *content.Content, t *testing.T) *Setup {
    	logger := zaptest.NewLogger(t, zaptest.WrapOptions())
    
    	setup := NewSetup(content, spaceID, envID, logger)
    	setup.AddCollections(getCollections())
    	setup.AddRoles(getRoles())
    	setup.AddClients(getClients())
    	setup.AddItems(getActions(), OverwriteItem())
    
    	return setup
    }
    
    func TestSetupInstall(t *testing.T) {
    	t.Run("Success, nothing to install", func(t *testing.T) {
    		logger := zaptest.NewLogger(t, zaptest.WrapOptions())
    
    		setup := NewSetup(nil, spaceID, envID, logger)
    
    		err := setup.Install(context.Background())
    
    		require.NoError(t, err)
    	})
    
    	t.Run("Success, no force", func(t *testing.T) {
    		envMocks := &environmentMock.Environments{}
    		envMocks.On("Migrate", mock.Anything, spaceID, envID, &environments.MigrateOptions{Wait: true}).
    			Return(nil).
    			Once()
    
    		collsMock := &collectionMock.Collections{}
    		for _, collection := range getCollections() {
    			collsMock.On("Get", mock.Anything, spaceID, envID, collection.ID).
    				Return(nil, collections.ErrNotFound).
    				Once()
    
    			collsMock.On("Create", mock.Anything, collection).
    				Return(collection, nil).
    				Once()
    
    			collsMock.On("SetSchema", mock.Anything, spaceID, envID, collection.ID, collection.Schema).
    				Return(nil).
    				Once()
    		}
    
    		rMock := &rolesMock.Roles{}
    		for _, role := range getRoles() {
    			rMock.On("Get", mock.Anything, spaceID, role.ID).
    				Return(nil, roles.ErrNotFound).
    				Once()
    
    			rMock.On("Create", mock.Anything, mock.Anything).Run(func(args mock.Arguments) {
    				create := args[1].(*roles.Role)
    				require.True(t, data.Contains(envID, create.Environments))
    			}).Return(role, nil).Once()
    		}
    
    		clMock := &clientsMock.Clients{}
    		for _, client := range getClients() {
    			clMock.On("Get", mock.Anything, spaceID, client.ID).
    				Return(nil, clients.ErrNotFound).
    				Once()
    
    			clMock.On("Create", mock.Anything, client).
    				Return(client, nil).
    				Once()
    		}
    
    		itmMock := &itemsMock.Items{}
    		itmMock.On("Find", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).
    			Return(nil, 0, nil).
    			Once()
    		for _, act := range getActions() {
    			itmMock.On("Create", mock.Anything, act).
    				Return(act, nil).
    				Once()
    			itmMock.On("Publish", mock.Anything, act).
    				Return(nil).
    				Once()
    		}
    
    		setup := newSetup(&content.Content{
    			Collections:  collsMock,
    			Clients:      clMock,
    			Roles:        rMock,
    			Items:        itmMock,
    			Environments: envMocks,
    		}, t)
    
    		err := setup.Install(context.Background())
    
    		require.NoError(t, err)
    		require.False(t, setup.HasErrors())
    
    		rMock.AssertExpectations(t)
    		collsMock.AssertExpectations(t)
    		clMock.AssertExpectations(t)
    		itmMock.AssertExpectations(t)
    		envMocks.AssertExpectations(t)
    	})
    
    	t.Run("Success, update existing records", func(t *testing.T) {
    		envMocks := &environmentMock.Environments{}
    		//todo после удаления флага alwaysSetSchema убрать лишний вызов
    		envMocks.On("Migrate", mock.Anything, spaceID, envID, &environments.MigrateOptions{Wait: true}).
    			Return(nil).Once()
    
    		collsMock := &collectionMock.Collections{}
    		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 убрать лишний вызов
    		collsMock.On("SetSchema", mock.Anything, "sp", "env", "coll1", schema.New()).Return(nil).Once()
    
    		rMock := &rolesMock.Roles{}
    		for _, role := range getRoles() {
    			rMock.On("Get", mock.Anything, spaceID, role.ID).
    				Return(role, nil).
    				Once()
    
    			rMock.On("Update", mock.Anything, role).
    				Return(nil).
    				Once()
    		}
    
    		clMock := &clientsMock.Clients{}
    		for _, client := range getClients() {
    			clMock.On("Get", mock.Anything, spaceID, client.ID).
    				Return(client, nil).
    				Once()
    
    			clMock.On("Update", mock.Anything, client).
    				Return(nil).
    				Once()
    		}
    
    		itmMock := &itemsMock.Items{}
    		itms := getActions()
    		itmMock.On("Find", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).
    			Return(itms, 0, nil).
    			Once()
    		itmMock.On("Update", mock.Anything, mock.Anything).
    			Return(nil).
    			Times(len(itms))
    		itmMock.On("Publish", mock.Anything, mock.Anything).
    			Return(nil).
    			Times(len(itms))
    
    		setup := newSetup(&content.Content{
    			Collections:  collsMock,
    			Clients:      clMock,
    			Roles:        rMock,
    			Items:        itmMock,
    			Environments: envMocks,
    		}, t)
    
    		err := setup.Install(context.Background())
    
    		require.NoError(t, err)
    		require.False(t, setup.HasErrors())
    
    		rMock.AssertExpectations(t)
    		collsMock.AssertExpectations(t)
    		clMock.AssertExpectations(t)
    		itmMock.AssertExpectations(t)
    		envMocks.AssertExpectations(t)
    	})
    
    	t.Run("Success, with force", func(t *testing.T) {
    		//todo после удаления флага alwaysSetSchema убрать лишний вызов
    		envMocks := &environmentMock.Environments{}
    		envMocks.On("Migrate", mock.Anything, spaceID, envID, &environments.MigrateOptions{Wait: true}).
    			Return(nil).Once()
    
    		collsMock := &collectionMock.Collections{}
    		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 убрать лишний вызов
    		collsMock.On("SetSchema", mock.Anything, "sp", "env", "coll1", schema.New()).Return(nil).Once()
    
    		rMock := &rolesMock.Roles{}
    		for _, role := range getRoles() {
    			rMock.On("Get", mock.Anything, spaceID, role.ID).Return(role, nil).Once()
    			rMock.On("Update", mock.Anything, &roles.Role{ID: "role", SpaceID: "sp", Environments: []string{"env"}}).Return(nil).Once()
    		}
    
    		clMock := &clientsMock.Clients{}
    		for _, client := range getClients() {
    			clMock.On("Delete", mock.Anything, spaceID, client.ID).Return(nil).Once()
    
    			clMock.On("Create", mock.Anything, client).
    				Return(client, nil).
    				Once()
    		}
    
    		itmMock := &itemsMock.Items{}
    		itmMock.On("Find", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).
    			Return(nil, 0, nil).
    			Once()
    		for _, act := range getActions() {
    			itmMock.On("Create", mock.Anything, act).
    				Return(act, nil).
    				Once()
    			itmMock.On("Publish", mock.Anything, act).
    				Return(nil).
    				Once()
    		}
    
    		setup := newSetup(&content.Content{
    			Collections: collsMock,
    			Clients:     clMock,
    			Roles:       rMock,
    			Items:       itmMock,
    			//todo после удаления флага alwaysSetSchema убрать
    			Environments: envMocks,
    		}, t)
    		setup = setup.WithForce(true)
    
    		err := setup.Install(context.Background())
    
    		require.NoError(t, err)
    		require.False(t, setup.HasErrors())
    
    		rMock.AssertExpectations(t)
    		collsMock.AssertExpectations(t)
    		clMock.AssertExpectations(t)
    		itmMock.AssertExpectations(t)
    	})
    
    	t.Run("Can't install role, storage returns error", func(t *testing.T) {
    		rMock := &rolesMock.Roles{}
    		rMock.On("Get", mock.Anything, spaceID, mock.Anything).
    			Return(nil, errors.New("can't get role")).
    			Once()
    
    		setup := newSetup(&content.Content{
    			Roles: rMock,
    		}, t)
    
    		err := setup.Install(context.Background())
    
    		require.Error(t, err)
    		assert.ErrorContains(t, err, "failed to install role")
    
    		rMock.AssertExpectations(t)
    	})
    
    	t.Run("Can't install client, storage returns error", func(t *testing.T) {
    		rMock := &rolesMock.Roles{}
    		for _, role := range getRoles() {
    			rMock.On("Get", mock.Anything, spaceID, role.ID).
    				Return(nil, roles.ErrNotFound).
    				Once()
    
    			rMock.On("Create", mock.Anything, mock.Anything).
    				Return(role, nil).
    				Once()
    		}
    
    		clMock := &clientsMock.Clients{}
    		for _, client := range getClients() {
    			clMock.On("Get", mock.Anything, spaceID, client.ID).
    				Return(nil, errors.New("can't get client")).
    				Once()
    		}
    
    		setup := newSetup(&content.Content{
    			Clients: clMock,
    			Roles:   rMock,
    		}, t)
    
    		err := setup.Install(context.Background())
    
    		require.Error(t, err)
    		assert.ErrorContains(t, err, "failed to install client")
    
    		rMock.AssertExpectations(t)
    		clMock.AssertExpectations(t)
    	})
    
    	t.Run("Can't get collection, storage returns error", func(t *testing.T) {
    		collsMock := &collectionMock.Collections{}
    		for _, collection := range getCollections() {
    			collsMock.On("Get", mock.Anything, spaceID, envID, collection.ID).
    				Return(nil, errors.New("can't get collection")).
    				Once()
    		}
    
    		rMock := &rolesMock.Roles{}
    		for _, role := range getRoles() {
    			rMock.On("Get", mock.Anything, spaceID, role.ID).
    				Return(nil, roles.ErrNotFound).
    				Once()
    
    			rMock.On("Create", mock.Anything, mock.Anything).
    				Return(role, nil).
    				Once()
    		}
    
    		clMock := &clientsMock.Clients{}
    		for _, client := range getClients() {
    			clMock.On("Get", mock.Anything, spaceID, client.ID).
    				Return(nil, clients.ErrNotFound).
    				Once()
    
    			clMock.On("Create", mock.Anything, client).
    				Return(client, nil).
    				Once()
    		}
    
    		setup := newSetup(&content.Content{
    			Collections: collsMock,
    			Clients:     clMock,
    			Roles:       rMock,
    		}, t)
    
    		err := setup.Install(context.Background())
    
    		require.Error(t, err)
    		assert.ErrorContains(t, err, "failed to install collection")
    
    		rMock.AssertExpectations(t)
    		collsMock.AssertExpectations(t)
    		clMock.AssertExpectations(t)
    	})
    
    	t.Run("Can't create collection, storage returns error", func(t *testing.T) {
    		collsMock := &collectionMock.Collections{}
    		for _, collection := range getCollections() {
    			collsMock.On("Get", mock.Anything, spaceID, envID, collection.ID).
    				Return(nil, collections.ErrNotFound).
    				Once()
    
    			collsMock.On("Create", mock.Anything, collection).
    				Return(nil, errors.New("can't create collection")).
    				Once()
    		}
    
    		rMock := &rolesMock.Roles{}
    		for _, role := range getRoles() {
    			rMock.On("Get", mock.Anything, spaceID, role.ID).
    				Return(nil, roles.ErrNotFound).
    				Once()
    
    			rMock.On("Create", mock.Anything, mock.Anything).
    				Return(role, nil).
    				Once()
    		}
    
    		clMock := &clientsMock.Clients{}
    		for _, client := range getClients() {
    			clMock.On("Get", mock.Anything, spaceID, client.ID).
    				Return(nil, clients.ErrNotFound).
    				Once()
    
    			clMock.On("Create", mock.Anything, client).
    				Return(client, nil).
    				Once()
    		}
    
    		setup := newSetup(&content.Content{
    			Collections: collsMock,
    			Clients:     clMock,
    			Roles:       rMock,
    		}, t)
    
    		err := setup.Install(context.Background())
    
    		require.Error(t, err)
    		assert.ErrorContains(t, err, "failed to install collection")
    
    		rMock.AssertExpectations(t)
    		collsMock.AssertExpectations(t)
    		clMock.AssertExpectations(t)
    	})
    
    	t.Run("Can't update collection, storage returns error", func(t *testing.T) {
    		collsMock := &collectionMock.Collections{}
    		collsMock.On("Get", mock.Anything, spaceID, envID, "coll1").Return(&collections.Collection{ID: "coll1", SpaceID: spaceID, EnvID: envID, Schema: schema.New(), Name: "Коллекция 00"}, nil).Once()
    		collsMock.On("Update", mock.Anything, &collections.Collection{ID: "coll1", SpaceID: spaceID, EnvID: envID, Schema: schema.New(), Name: "Коллекция"}).Return(errors.New("can't update collection")).Once()
    
    		rMock := &rolesMock.Roles{}
    		for _, role := range getRoles() {
    			rMock.On("Get", mock.Anything, spaceID, role.ID).
    				Return(nil, roles.ErrNotFound).
    				Once()
    
    			rMock.On("Create", mock.Anything, mock.Anything).
    				Return(role, nil).
    				Once()
    		}
    
    		clMock := &clientsMock.Clients{}
    		for _, client := range getClients() {
    			clMock.On("Get", mock.Anything, spaceID, client.ID).
    				Return(nil, clients.ErrNotFound).
    				Once()
    
    			clMock.On("Create", mock.Anything, client).
    				Return(client, nil).
    				Once()
    		}
    
    		setup := newSetup(&content.Content{
    			Collections: collsMock,
    			Clients:     clMock,
    			Roles:       rMock,
    		}, t)
    
    		err := setup.Install(context.Background())
    
    		require.Error(t, err)
    		assert.ErrorContains(t, err, "failed to install collection")
    
    		rMock.AssertExpectations(t)
    		collsMock.AssertExpectations(t)
    		clMock.AssertExpectations(t)
    	})
    
    	t.Run("Can't set schema, storage returns error", func(t *testing.T) {
    		collsMock := &collectionMock.Collections{}
    		for _, collection := range getCollections() {
    			collsMock.On("Get", mock.Anything, spaceID, envID, collection.ID).
    				Return(nil, collections.ErrNotFound).
    				Once()
    
    			collsMock.On("Create", mock.Anything, collection).
    				Return(collection, nil).
    				Once()
    
    			collsMock.On("SetSchema", mock.Anything, spaceID, envID, collection.ID, collection.Schema).
    				Return(errors.New("can't set schema")).
    				Once()
    		}
    
    		rMock := &rolesMock.Roles{}
    		for _, role := range getRoles() {
    			rMock.On("Get", mock.Anything, spaceID, role.ID).
    				Return(nil, roles.ErrNotFound).
    				Once()
    
    			rMock.On("Create", mock.Anything, mock.Anything).
    				Return(role, nil).
    				Once()
    		}
    
    		clMock := &clientsMock.Clients{}
    		for _, client := range getClients() {
    			clMock.On("Get", mock.Anything, spaceID, client.ID).
    				Return(nil, clients.ErrNotFound).
    				Once()
    
    			clMock.On("Create", mock.Anything, client).
    				Return(client, nil).
    				Once()
    		}
    
    		setup := newSetup(&content.Content{
    			Collections: collsMock,
    			Clients:     clMock,
    			Roles:       rMock,
    		}, t)
    
    		err := setup.Install(context.Background())
    
    		require.Error(t, err)
    		assert.ErrorContains(t, err, "failed to install collection")
    
    		rMock.AssertExpectations(t)
    		collsMock.AssertExpectations(t)
    		clMock.AssertExpectations(t)
    	})
    
    	t.Run("Can't migrate, storage returns error", func(t *testing.T) {
    		envMocks := &environmentMock.Environments{}
    		envMocks.On("Migrate", mock.Anything, spaceID, envID, &environments.MigrateOptions{Wait: true}).
    			Return(errors.New("can't migrate")).
    			Once()
    
    		collsMock := &collectionMock.Collections{}
    		for _, collection := range getCollections() {
    			collsMock.On("Get", mock.Anything, spaceID, envID, collection.ID).
    				Return(nil, collections.ErrNotFound).
    				Once()
    
    			collsMock.On("Create", mock.Anything, collection).
    				Return(collection, nil).
    				Once()
    
    			collsMock.On("SetSchema", mock.Anything, spaceID, envID, collection.ID, collection.Schema).
    				Return(nil).
    				Once()
    		}
    
    		rMock := &rolesMock.Roles{}
    		for _, role := range getRoles() {
    			rMock.On("Get", mock.Anything, spaceID, role.ID).
    				Return(nil, roles.ErrNotFound).
    				Once()
    
    			rMock.On("Create", mock.Anything, mock.Anything).
    				Return(role, nil).
    				Once()
    		}
    
    		clMock := &clientsMock.Clients{}
    		for _, client := range getClients() {
    			clMock.On("Get", mock.Anything, spaceID, client.ID).
    				Return(nil, clients.ErrNotFound).
    				Once()
    
    			clMock.On("Create", mock.Anything, client).
    				Return(client, nil).
    				Once()
    		}
    
    		setup := newSetup(&content.Content{
    			Collections:  collsMock,
    			Clients:      clMock,
    			Roles:        rMock,
    			Environments: envMocks,
    		}, t)
    
    		err := setup.Install(context.Background())
    
    		require.Error(t, err)
    		assert.ErrorContains(t, err, "migrate: can't migrate")
    
    		rMock.AssertExpectations(t)
    		collsMock.AssertExpectations(t)
    		clMock.AssertExpectations(t)
    	})
    
    	t.Run("Can't find action, storage returns error", func(t *testing.T) {
    		envMocks := &environmentMock.Environments{}
    		envMocks.On("Migrate", mock.Anything, spaceID, envID, &environments.MigrateOptions{Wait: true}).
    			Return(nil).
    			Once()
    
    		collsMock := &collectionMock.Collections{}
    		for _, collection := range getCollections() {
    			collsMock.On("Get", mock.Anything, spaceID, envID, collection.ID).
    				Return(nil, collections.ErrNotFound).
    				Once()
    
    			collsMock.On("Create", mock.Anything, collection).
    				Return(collection, nil).
    				Once()
    
    			collsMock.On("SetSchema", mock.Anything, spaceID, envID, collection.ID, collection.Schema).
    				Return(nil).
    				Once()
    		}
    
    		rMock := &rolesMock.Roles{}
    		for _, role := range getRoles() {
    			rMock.On("Get", mock.Anything, spaceID, role.ID).Return(role, nil).Once()
    			rMock.On("Update", mock.Anything, &roles.Role{ID: "role", SpaceID: "sp", Environments: []string{"env"}}).Return(nil).Once()
    		}
    
    		clMock := &clientsMock.Clients{}
    		for _, client := range getClients() {
    			clMock.On("Delete", mock.Anything, spaceID, client.ID).Return(nil).Once()
    
    			clMock.On("Create", mock.Anything, client).
    				Return(client, nil).
    				Once()
    		}
    
    		itmMock := &itemsMock.Items{}
    		itmMock.On("Find", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).
    			Return(nil, 0, nil).
    			Once()
    
    		itmMock.On("Create", mock.Anything, mock.Anything).
    			Return(nil, errors.New("can't create item")).
    			Once()
    
    		setup := newSetup(&content.Content{
    			Collections:  collsMock,
    			Clients:      clMock,
    			Roles:        rMock,
    			Items:        itmMock,
    			Environments: envMocks,
    		}, t)
    		setup = setup.WithForce(true)
    
    		err := setup.Install(context.Background())
    
    		require.Error(t, err)
    		assert.ErrorContains(t, err, "failed to install item")
    
    		rMock.AssertExpectations(t)
    		collsMock.AssertExpectations(t)
    		clMock.AssertExpectations(t)
    		itmMock.AssertExpectations(t)
    		envMocks.AssertExpectations(t)
    	})
    
    	//t.Run("Can't find task configs, storage returns error", func(t *testing.T) {
    	//	envMocks := &environmentMock.Environments{}
    	//	envMocks.On("Migrate", mock.Anything, spaceID, envID).
    	//		Return(nil).
    	//		Once()
    	//
    	//	collsMock := &collectionMock.Collections{}
    	//	for _, collection := range getCollections() {
    	//		collsMock.On("Get", mock.Anything, spaceID, envID, collection.ID).
    	//			Return(nil, collections.ErrNotFound).
    	//			Once()
    	//
    	//		collsMock.On("Create", mock.Anything, collection).
    	//			Return(collection, nil).
    	//			Once()
    	//
    	//		collsMock.On("SetSchema", mock.Anything, spaceID, envID, collection.ID, collection.Schema).
    	//			Return(nil).
    	//			Once()
    	//	}
    	//
    	//	rMock := &rolesMock.Roles{}
    	//	for _, role := range getRoles() {
    	//		rMock.On("Get", mock.Anything, spaceID, role.ID).
    	//			Return(nil, roles.ErrNotFound).
    	//			Once()
    	//
    	//		rMock.On("Create", mock.Anything, mock.Anything).
    	//			Return(role, nil).
    	//			Once()
    	//	}
    	//
    	//	clMock := &clientsMock.Clients{}
    	//	for _, client := range getClients() {
    	//		clMock.On("Get", mock.Anything, spaceID, client.ID).
    	//			Return(nil, clients.ErrNotFound).
    	//			Once()
    	//
    	//		clMock.On("Create", mock.Anything, client).
    	//			Return(client, nil).
    	//			Once()
    	//	}
    	//
    	//	itmMock := &itemsMock.Items{}
    	//	for _, act := range getActions() {
    	//		itmMock.On("Get", mock.Anything, spaceID, envID, extension.ActionsCollectionID, act.ID).
    	//			Return(nil, items.ErrNotFound).
    	//			Once()
    	//
    	//		itmMock.On("Create", mock.Anything, act).
    	//			Return(act, nil).
    	//			Once()
    	//		itmMock.On("Publish", mock.Anything, act).
    	//			Return(nil).
    	//			Once()
    	//	}
    	//
    	//	setup := newSetup(&content.Content{
    	//		Collections:  collsMock,
    	//		Clients:      clMock,
    	//		Roles:        rMock,
    	//		Items:        itmMock,
    	//		Environments: envMocks,
    	//	}, t)
    	//
    	//	err := setup.Install(context.Background())
    	//
    	//	require.Error(t, err)
    	//	assert.ErrorContains(t, err, "failed to install task configs")
    	//
    	//	rMock.AssertExpectations(t)
    	//	collsMock.AssertExpectations(t)
    	//	clMock.AssertExpectations(t)
    	//	itmMock.AssertExpectations(t)
    	//	envMocks.AssertExpectations(t)
    	//})
    }
    
    func TestSetupUninstall(t *testing.T) {
    	t.Run("Success, nothing to uninstall", func(t *testing.T) {
    		logger := zaptest.NewLogger(t, zaptest.WrapOptions())
    
    		setup := NewSetup(nil, spaceID, envID, logger)
    
    		err := setup.Uninstall(context.Background())
    
    		require.NoError(t, err)
    	})
    
    	t.Run("Remove", func(t *testing.T) {
    		collsMock := &collectionMock.Collections{}
    		for _, collection := range getCollections() {
    			collsMock.On("Delete", mock.Anything, spaceID, envID, collection.ID).
    				Return(nil).
    				Once()
    		}
    
    		rMock := &rolesMock.Roles{}
    		for _, role := range getRoles() {
    			rMock.On("Delete", mock.Anything, spaceID, role.ID).
    				Return(nil).
    				Once()
    		}
    
    		clMock := &clientsMock.Clients{}
    		for _, client := range getClients() {
    			clMock.On("Delete", mock.Anything, spaceID, client.ID).Return(nil).Once()
    		}
    
    		itmMock := &itemsMock.Items{}
    		for _, act := range getActions() {
    			itmMock.On("Delete", mock.Anything, mock.Anything).Run(func(args mock.Arguments) {
    				del := args[1].(*items.Item)
    				require.Equal(t, spaceID, del.SpaceID)
    				require.Equal(t, envID, del.EnvID)
    				require.Equal(t, extension.ActionsCollectionID, del.CollectionID)
    				require.Equal(t, act.ID, del.ID)
    			}).
    				Return(nil).
    				Once()
    		}
    
    		setup := newSetup(&content.Content{
    			Collections: collsMock,
    			Clients:     clMock,
    			Roles:       rMock,
    			Items:       itmMock,
    		}, t)
    
    		setup = setup.WithRemove(true)
    		err := setup.Uninstall(context.Background())
    
    		require.NoError(t, err)
    		require.False(t, setup.HasErrors())
    
    		rMock.AssertExpectations(t)
    		collsMock.AssertExpectations(t)
    		clMock.AssertExpectations(t)
    		itmMock.AssertExpectations(t)
    	})
    
    	t.Run("Remove, with clients NotFound error", func(t *testing.T) {
    		collsMock := &collectionMock.Collections{}
    		for _, collection := range getCollections() {
    			collsMock.On("Delete", mock.Anything, spaceID, envID, collection.ID).
    				Return(nil).
    				Once()
    		}
    
    		rMock := &rolesMock.Roles{}
    		for _, role := range getRoles() {
    			rMock.On("Delete", mock.Anything, spaceID, role.ID).
    				Return(nil).
    				Once()
    		}
    
    		clMock := &clientsMock.Clients{}
    		clMock.On("Delete", mock.Anything, spaceID, mock.Anything).
    			Return(clients.ErrNotFound).
    			Once()
    
    		itmMock := &itemsMock.Items{}
    		for _, act := range getActions() {
    			itmMock.On("Delete", mock.Anything, mock.Anything).Run(func(args mock.Arguments) {
    				del := args[1].(*items.Item)
    				require.Equal(t, spaceID, del.SpaceID)
    				require.Equal(t, envID, del.EnvID)
    				require.Equal(t, extension.ActionsCollectionID, del.CollectionID)
    				require.Equal(t, act.ID, del.ID)
    			}).
    				Return(nil).
    				Once()
    		}
    
    		setup := newSetup(&content.Content{
    			Collections: collsMock,
    			Clients:     clMock,
    			Roles:       rMock,
    			Items:       itmMock,
    		}, t)
    
    		setup = setup.WithRemove(true)
    		err := setup.Uninstall(context.Background())
    
    		require.NoError(t, err)
    		require.False(t, setup.HasErrors())
    
    		rMock.AssertExpectations(t)
    		collsMock.AssertExpectations(t)
    		clMock.AssertExpectations(t)
    		itmMock.AssertExpectations(t)
    	})
    
    	t.Run("Can't uninstall clients, storage returns error", func(t *testing.T) {
    		rMock := &rolesMock.Roles{}
    
    		clMock := &clientsMock.Clients{}
    		clMock.On("Delete", mock.Anything, spaceID, mock.Anything).
    			Return(errors.New("can't delete client")).
    			Once()
    
    		itmMock := &itemsMock.Items{}
    		for _, act := range getActions() {
    			itmMock.On("Delete", mock.Anything, spaceID, envID, extension.ActionsCollectionID, act.ID).
    				Return(nil).
    				Once()
    		}
    
    		setup := newSetup(&content.Content{
    			Clients: clMock,
    			Roles:   rMock,
    			Items:   itmMock,
    		}, t)
    
    		setup = setup.WithRemove(true)
    		err := setup.Uninstall(context.Background())
    
    		require.Error(t, err)
    		assert.ErrorContains(t, err, "failed to uninstall client")
    
    		rMock.AssertExpectations(t)
    		clMock.AssertExpectations(t)
    	})
    
    	t.Run("Can't uninstall role, storage returns error", func(t *testing.T) {
    		rMock := &rolesMock.Roles{}
    		rMock.On("Delete", mock.Anything, spaceID, mock.Anything).
    			Return(errors.New("can't delete role")).
    			Once()
    
    		clMock := &clientsMock.Clients{}
    		for _, client := range getClients() {
    			clMock.On("Delete", mock.Anything, spaceID, client.ID).Return(nil).Once()
    		}
    
    		itmMock := &itemsMock.Items{}
    		for _, act := range getActions() {
    			itmMock.On("Delete", mock.Anything, spaceID, envID, extension.ActionsCollectionID, act.ID).
    				Return(nil).
    				Once()
    		}
    
    		setup := newSetup(&content.Content{
    			Roles:   rMock,
    			Clients: clMock,
    			Items:   itmMock,
    		}, t)
    
    		setup = setup.WithRemove(true)
    		err := setup.Uninstall(context.Background())
    
    		require.Error(t, err)
    		assert.ErrorContains(t, err, "failed to uninstall role")
    
    		rMock.AssertExpectations(t)
    	})
    
    	t.Run("Can't uninstall collections, storage returns error", func(t *testing.T) {
    		collsMock := &collectionMock.Collections{}
    		collsMock.On("Delete", mock.Anything, spaceID, envID, mock.Anything).
    			Return(errors.New("can't delete collection")).
    			Once()
    
    		rMock := &rolesMock.Roles{}
    		for _, role := range getRoles() {
    			rMock.On("Delete", mock.Anything, spaceID, role.ID).
    				Return(nil).
    				Once()
    		}
    
    		clMock := &clientsMock.Clients{}
    		for _, client := range getClients() {
    			clMock.On("Delete", mock.Anything, spaceID, client.ID).Return(nil).Once()
    		}
    
    		itmMock := &itemsMock.Items{}
    		for _, act := range getActions() {
    			itmMock.On("Delete", mock.Anything, spaceID, envID, extension.ActionsCollectionID, act.ID).
    				Return(nil).
    				Once()
    		}
    
    		setup := newSetup(&content.Content{
    			Collections: collsMock,
    			Clients:     clMock,
    			Roles:       rMock,
    			Items:       itmMock,
    		}, t)
    
    		setup = setup.WithRemove(true)
    		err := setup.Uninstall(context.Background())
    
    		require.Error(t, err)
    		assert.ErrorContains(t, err, "failed to uninstall collection")
    
    		rMock.AssertExpectations(t)
    		collsMock.AssertExpectations(t)
    		clMock.AssertExpectations(t)
    	})
    
    	t.Run("Can't uninstall actions, storage returns error", func(t *testing.T) {
    		collsMock := &collectionMock.Collections{}
    		collsMock.On("Delete", mock.Anything, spaceID, envID, mock.Anything).
    			Return(nil).
    			Once()
    
    		rMock := &rolesMock.Roles{}
    		for _, role := range getRoles() {
    			rMock.On("Delete", mock.Anything, spaceID, role.ID).
    				Return(nil).
    				Once()
    		}
    
    		clMock := &clientsMock.Clients{}
    		for _, client := range getClients() {
    			clMock.On("Delete", mock.Anything, spaceID, client.ID).Return(nil).Once()
    		}
    
    		itmMock := &itemsMock.Items{}
    		for _, act := range getActions() {
    			itmMock.On("Delete", mock.Anything, mock.Anything).Run(func(args mock.Arguments) {
    				del := args[1].(*items.Item)
    				require.Equal(t, spaceID, del.SpaceID)
    				require.Equal(t, envID, del.EnvID)
    				require.Equal(t, extension.ActionsCollectionID, del.CollectionID)
    				require.Equal(t, act.ID, del.ID)
    			}).
    				Return(errors.New("can't delete item")).
    				Once()
    		}
    
    		setup := newSetup(&content.Content{
    			Collections: collsMock,
    			Clients:     clMock,
    			Roles:       rMock,
    			Items:       itmMock,
    		}, t)
    
    		setup = setup.WithRemove(true)
    		err := setup.Uninstall(context.Background())
    
    		require.Error(t, err)
    		assert.ErrorContains(t, err, "failed to uninstall item")
    
    		itmMock.AssertExpectations(t)
    	})
    }
    
    func TestSetupCheck(t *testing.T) {
    	t.Run("Success, nothing to check", func(t *testing.T) {
    		logger := zaptest.NewLogger(t, zaptest.WrapOptions())
    
    		setup := NewSetup(nil, spaceID, envID, logger)
    
    		err := setup.Check(context.Background())
    
    		require.NoError(t, err)
    	})
    
    	t.Run("Success", func(t *testing.T) {
    		collsMock := &collectionMock.Collections{}
    		for _, collection := range getCollections() {
    			collsMock.On("Get", mock.Anything, spaceID, envID, collection.ID).
    				Return(collection, nil).
    				Once()
    		}
    
    		rMock := &rolesMock.Roles{}
    		for _, role := range getRoles() {
    			rMock.On("Get", mock.Anything, spaceID, role.ID).
    				Return(role, nil).
    				Once()
    		}
    
    		clMock := &clientsMock.Clients{}
    		for _, client := range getClients() {
    			clMock.On("Get", mock.Anything, spaceID, client.ID).
    				Return(client, nil).
    				Once()
    		}
    
    		itmMock := &itemsMock.Items{}
    		itmMock.On(
    			"Find",
    			mock.Anything,
    			spaceID,
    			envID,
    			extension.ActionsCollectionID,
    			mock.MatchedBy(func(filter *items.Filter) bool { return data.Contains("act", filter.ID) }),
    			mock.MatchedBy(func(opt *items.FindOptions) bool { return opt.Regular && opt.Hidden && opt.Templates }),
    		).Return(getActions(), 0, nil).Once()
    
    		setup := newSetup(&content.Content{
    			Collections: collsMock,
    			Clients:     clMock,
    			Roles:       rMock,
    			Items:       itmMock,
    		}, t)
    
    		err := setup.Check(context.Background())
    
    		require.NoError(t, err)
    		require.False(t, setup.HasErrors())
    
    		rMock.AssertExpectations(t)
    		collsMock.AssertExpectations(t)
    		clMock.AssertExpectations(t)
    		itmMock.AssertExpectations(t)
    	})
    
    	t.Run("Can't get role, storage returns error", func(t *testing.T) {
    		rMock := &rolesMock.Roles{}
    		rMock.On("Get", mock.Anything, spaceID, mock.Anything).
    			Return(nil, errors.New("can't get role")).
    			Once()
    
    		setup := newSetup(&content.Content{
    			Roles: rMock,
    		}, t)
    
    		err := setup.Check(context.Background())
    
    		require.Error(t, err)
    		assert.ErrorContains(t, err, "role check error")
    
    		rMock.AssertExpectations(t)
    	})
    
    	t.Run("Can't get client, storage returns error", func(t *testing.T) {
    		rMock := &rolesMock.Roles{}
    		for _, role := range getRoles() {
    			rMock.On("Get", mock.Anything, spaceID, role.ID).
    				Return(role, nil).
    				Once()
    		}
    
    		clMock := &clientsMock.Clients{}
    		clMock.On("Get", mock.Anything, spaceID, mock.Anything).
    			Return(nil, errors.New("can't get client")).
    			Once()
    
    		setup := newSetup(&content.Content{
    			Roles:   rMock,
    			Clients: clMock,
    		}, t)
    
    		err := setup.Check(context.Background())
    
    		require.Error(t, err)
    		assert.ErrorContains(t, err, "clients check error")
    
    		rMock.AssertExpectations(t)
    		clMock.AssertExpectations(t)
    	})
    
    	t.Run("Can't get collection, storage returns error", func(t *testing.T) {
    		collsMock := &collectionMock.Collections{}
    		collsMock.On("Get", mock.Anything, spaceID, envID, mock.Anything).
    			Return(nil, errors.New("can't get collection")).
    			Once()
    
    		rMock := &rolesMock.Roles{}
    		for _, role := range getRoles() {
    			rMock.On("Get", mock.Anything, spaceID, role.ID).
    				Return(role, nil).
    				Once()
    		}
    
    		clMock := &clientsMock.Clients{}
    		for _, client := range getClients() {
    			clMock.On("Get", mock.Anything, spaceID, client.ID).
    				Return(client, nil).
    				Once()
    		}
    
    		setup := newSetup(&content.Content{
    			Roles:       rMock,
    			Clients:     clMock,
    			Collections: collsMock,
    		}, t)
    
    		err := setup.Check(context.Background())
    
    		require.Error(t, err)
    		assert.ErrorContains(t, err, "collections check error")
    
    		rMock.AssertExpectations(t)
    		clMock.AssertExpectations(t)
    		collsMock.AssertExpectations(t)
    	})
    
    	t.Run("Can't get action, storage returns error", func(t *testing.T) {
    		collsMock := &collectionMock.Collections{}
    		for _, collection := range getCollections() {
    			collsMock.On("Get", mock.Anything, spaceID, envID, collection.ID).
    				Return(collection, nil).
    				Once()
    		}
    
    		rMock := &rolesMock.Roles{}
    		for _, role := range getRoles() {
    			rMock.On("Get", mock.Anything, spaceID, role.ID).
    				Return(role, nil).
    				Once()
    		}
    
    		clMock := &clientsMock.Clients{}
    		for _, client := range getClients() {
    			clMock.On("Get", mock.Anything, spaceID, client.ID).
    				Return(client, nil).
    				Once()
    		}
    
    		itmMock := &itemsMock.Items{}
    		itmMock.On("Find", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).
    			Return(nil, 0, nil).
    			Once()
    
    		setup := newSetup(&content.Content{
    			Roles:       rMock,
    			Clients:     clMock,
    			Collections: collsMock,
    			Items:       itmMock,
    		}, t)
    
    		err := setup.Check(context.Background())
    
    		require.Error(t, err)
    		assert.ErrorContains(t, err, "items check error")
    
    		rMock.AssertExpectations(t)
    		clMock.AssertExpectations(t)
    		collsMock.AssertExpectations(t)
    	})
    
    	//t.Run("Can't get task config, storage returns error", func(t *testing.T) {
    	//	collsMock := &collectionMock.Collections{}
    	//	for _, collection := range getCollections() {
    	//		collsMock.On("Get", mock.Anything, spaceID, envID, collection.ID).
    	//			Return(collection, nil).
    	//			Once()
    	//	}
    	//
    	//	rMock := &rolesMock.Roles{}
    	//	for _, role := range getRoles() {
    	//		rMock.On("Get", mock.Anything, spaceID, role.ID).
    	//			Return(role, nil).
    	//			Once()
    	//	}
    	//
    	//	clMock := &clientsMock.Clients{}
    	//	for _, client := range getClients() {
    	//		clMock.On("Get", mock.Anything, spaceID, client.ID).
    	//			Return(client, nil).
    	//			Once()
    	//	}
    	//
    	//	itmMock := &itemsMock.Items{}
    	//	for _, act := range getActions() {
    	//		itmMock.On("Get", mock.Anything, spaceID, envID, extension.ActionsCollectionID, act.ID).
    	//			Return(act, nil).
    	//			Once()
    	//	}
    	//
    	//	itmMock.On(
    	//		"Find", mock.Anything, spaceID, envID, tasks.TaskConfigCollection,
    	//		mock.Anything,
    	//	).
    	//		Return(nil, 0, errors.New("can't get task configs")).
    	//		Once()
    	//
    	//	setup := newSetup(&content.Content{
    	//		Roles:       rMock,
    	//		Clients:     clMock,
    	//		Collections: collsMock,
    	//		Items:       itmMock,
    	//	}, t)
    	//
    	//	err := setup.Check(context.Background())
    	//
    	//	require.Error(t, err)
    	//	assert.ErrorContains(t, err, "task configs check error")
    	//
    	//	rMock.AssertExpectations(t)
    	//	clMock.AssertExpectations(t)
    	//	collsMock.AssertExpectations(t)
    	//})
    }