Skip to content
Snippets Groups Projects
Select Git revision
  • 35a556e8b8b5361a276c6c7d242e74983d4e9973
  • master default protected
  • feature/PRXS-3383-CollectionsSort
  • 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
  • PRXS-3421-RecursiveReferences
  • 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
  • feature/PRXS-3218-HideTemplateActions
  • 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

server.microgen.go

Blame
  • schema_test.go 7.75 KiB
    package extension
    
    import (
    	"encoding/json"
    	"sort"
    	"testing"
    
    	"git.perx.ru/perxis/perxis-go/pkg/collections"
    	"git.perx.ru/perxis/perxis-go/pkg/references"
    	"git.perx.ru/perxis/perxis-go/pkg/schema"
    	"git.perx.ru/perxis/perxis-go/pkg/schema/field"
    	"git.perx.ru/perxis/perxis-go/pkg/schema/validate"
    	"github.com/stretchr/testify/assert"
    	"github.com/stretchr/testify/require"
    )
    
    // NewActionsCollection и NewExtensionsCollection добавлены сюда для тестов
    // NewActionsCollection - создает коллекцию для хранения действий расширений в пространстве
    func NewActionsCollection(spaceID, envID string) *collections.Collection {
    	sch := schema.New(
    		"action", field.String(validate.Required()).SetTitle("Действие").SetTextSearch(true),
    		"extension", field.String().SetTitle("Расширение (Deprecated)"),
    		"name", field.String().SetTitle("Название").SetTextSearch(true),
    		"description", field.String().SetTitle("Описание"),
    		"icon", field.String().SetTitle("Название иконки").WithUI(&field.UI{Widget: "Icon"}),
    		"image", references.Field([]string{"media"}).SetTitle("Изображение").WithUI(&field.UI{Widget: "Media"}),
    		"kind", field.Number(
    			field.NumberFormatInt,
    			validate.Enum(getEnumOpt(ActionKindName)...),
    		).SetTitle("Вид").WithUI(&field.UI{Widget: "Select"}),
    		"autorun", field.Bool().SetTitle("Автозапуск").
    			SetDescription("Действие выполняется автоматически каждый раз при загрузке приложения").
    			WithUI(&field.UI{Widget: "Checkbox"}),
    		"confirm", field.Bool().SetTitle("С подтверждением").
    			SetDescription("Пользователь должен подтвердить запуск действия").
    			WithUI(&field.UI{Widget: "Checkbox"}),
    		"target", field.Number(
    			field.NumberFormatInt,
    			validate.Enum(getEnumOpt(ActionTargetName)...),
    		).SetTitle("Отображение результата действия").WithUI(&field.UI{Widget: "Select"}),
    		"view", field.Number(
    			field.NumberFormatInt,
    			validate.Enum(getEnumOpt(ActionViewName)...),
    		).SetTitle("Отображение действия в интерфейсе").WithUI(&field.UI{Widget: "Select"}),
    		"parent", field.String().SetTitle("Идентификатор родительского действия"),
    		"order", field.Number(field.NumberFormatInt).SetTitle("Порядок отображения").
    			SetDescription("Порядок отображения действия в интерфейсе (Для пунктов меню)"),
    		"groups", field.Array(field.String().SetAdditionalValues()).SetTitle("Группы").
    			SetDescription("Группировка действий в пользовательском интерфейсе").
    			WithUI(&field.UI{Widget: "SelectList"}),
    		"classes", field.Array(field.String().SetAdditionalValues()).SetTitle("Класс").
    			WithUI(&field.UI{Widget: "SelectList"}).
    			SetDescription("Классы данных, к которым применимо действие").
    			SetIndexed(true),
    		"refs", field.Array(references.Field(nil)).SetTitle("Ссылки").
    			WithUI(&field.UI{Widget: "BlockList"}),
    		"params_collection", field.String().SetTitle("Коллекция параметров").
    			SetDescription("ID коллекции для хранения параметров действия").WithUI(&field.UI{Widget: "Collection"}),
    		"navigation_action", field.Bool().SetTitle("Навигация (Deprecated)").
    			SetDescription("Выполняется переход пользователя в пользовательском интерфейсе").
    			WithUI(&field.UI{Widget: "Checkbox"}),
    		"navigation_route", field.String().SetTitle("Путь в интерфейсе (Deprecated)"),
    	).SetSingleLocale(true)
    
    	// Includes
    	sch.SetIncludes(
    		field.Include{Ref: "hoop_item_options", Optional: true},
    	)
    
    	// UI
    	sch.Field.UI.ListView = &field.View{Options: map[string]interface{}{
    		"fields":    []interface{}{"icon", "name", "action", "kind", "updated_at", "updated_by", "state"},
    		"sort":      []interface{}{"name"},
    		"page_size": float64(50),
    	}}
    
    	sch.Field.UI.Options["title"] = "name"
    	sch.Field.UI.Options["subtitle"] = "action"
    	sch.Field.UI.Options["collection_icon"] = "SettingOutlined/RocketOutlined"
    
    	return &collections.Collection{
    		ID:      ActionsCollection.ID,
    		SpaceID: spaceID,
    		EnvID:   envID,
    		Name:    ActionsCollection.Name,
    		Schema:  sch,
    		Hidden:  true,
    	}
    }
    
    // NewExtensionsCollection - создает коллекцию для хранения статусов расширений в пространстве
    func NewExtensionsCollection(spaceID, envID string) *collections.Collection {
    	sch := schema.New(
    		"id", field.String(validate.Required()).SetUnique(true).SetTitle("Расширение"),
    		"title", field.String().SetTitle("Название"),
    		"version", field.String().SetTitle("Установленная версия"),
    		"status_error", field.String().SetTitle("Ошибка"),
    		"status_msg", field.String().SetTitle("Сообщение"),
    		"extension_state", field.Number(
    			field.NumberFormatInt,
    			validate.Enum(
    				validate.EnumOpt{Name: StateInstalled.String(), Value: float64(StateInstalled)},
    				validate.EnumOpt{Name: StateFail.String(), Value: float64(StateFail)},
    				validate.EnumOpt{Name: StatePending.String(), Value: float64(StatePending)},
    				validate.EnumOpt{Name: StateInProgress.String(), Value: float64(StateInProgress)},
    			),
    		).SetTitle("Состояние").WithUI(&field.UI{Widget: "Select"}),
    	).SetSingleLocale(true)
    
    	// UI
    	sch.Field.UI.ListView = &field.View{Options: map[string]interface{}{
    		"fields":    []interface{}{"id", "title", "extension_state", "updated_at", "updated_by"},
    		"sort":      []interface{}{"title"},
    		"page_size": float64(50),
    	}}
    
    	sch.Field.UI.Options["title"] = "title"
    	sch.Field.UI.Options["subtitle"] = "id"
    	sch.Field.UI.Options["key"] = "id"
    	sch.Field.UI.Options["collection_icon"] = "SettingOutlined/ApiOutlined"
    
    	return &collections.Collection{
    		ID:      ExtensionsCollection.ID,
    		SpaceID: spaceID,
    		EnvID:   envID,
    		Name:    ExtensionsCollection.Name,
    		Schema:  sch,
    		Hidden:  true,
    	}
    }
    func getEnumOpt(opts map[int32]string) []validate.EnumOpt {
    	keys := make([]int32, 0, len(opts))
    	for k := range opts {
    		keys = append(keys, k)
    	}
    	sort.Slice(keys, func(i, j int) bool {
    		return keys[i] < keys[j]
    	})
    
    	enum := make([]validate.EnumOpt, len(opts))
    	for i, n := range keys {
    		enum[i] = validate.EnumOpt{Name: opts[n], Value: float64(n)}
    	}
    	return enum
    }
    
    func TestEqualSchema(t *testing.T) {
    	t.Run("After marshal", func(t *testing.T) {
    		for _, collection := range []*collections.Collection{
    			ActionsCollection,
    			ExtensionsCollection,
    		} {
    			s1 := collection.Schema
    			b, err := s1.MarshalJSON()
    			require.NoError(t, err)
    			s2 := schema.New()
    			err = json.Unmarshal(b, s2)
    			s1.ClearState()
    			s2.ClearState()
    			require.NoError(t, err)
    			require.Equal(t, s1.Field, s2.Field)
    		}
    	})
    	t.Run("ActionsCollection", func(t *testing.T) {
    		coll := NewActionsCollection("", "")
    		schOld := coll.Schema
    		schNew := ActionsCollection.Schema
    		_ = schOld.ConvertTypes()
    		schOld.ClearState()
    		_ = schNew.ConvertTypes()
    		schNew.ClearState()
    		assert.Equal(t, schOld, schNew, "схемы коллекции Настройки/Действия должны совпадать")
    	})
    	t.Run("ExtensionsCollection", func(t *testing.T) {
    		coll := NewExtensionsCollection("", "")
    		schOld := coll.Schema
    		schNew := ExtensionsCollection.Schema
    		_ = schOld.ConvertTypes()
    		schOld.ClearState()
    		_ = schNew.ConvertTypes()
    		schNew.ClearState()
    		assert.Equal(t, schOld, schNew, "схемы коллекции Настройки/Расширения должны совпадать")
    	})
    }