Select Git revision
server.microgen.go
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, "схемы коллекции Настройки/Расширения должны совпадать")
})
}