[add] migrate widgets.table

This commit is contained in:
Max 2023-03-25 13:37:35 +08:00
parent 083232b27e
commit 5de550781c
15 changed files with 462 additions and 273 deletions

View file

@ -9,7 +9,7 @@ COMMIT := $(shell git log | head -n 1 | awk '{print substr($$2, 0, 12)}')
NOW := $(shell date +"%FT%T%z")
# ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
TESTFOLDER := $(shell $(GO) list ./... | grep -E 'api|model|flow|script|fs|i18n|connector|query|plugin|cert|crypto|task|schedule|runtime|helper|utils|widget|importer|store|widgets/app|widgets/login' | grep -vE 'examples|tests*|config|widgets')
TESTFOLDER := $(shell $(GO) list ./... | grep -E 'api|model|flow|script|fs|i18n|connector|query|plugin|cert|crypto|task|schedule|runtime|helper|utils|widget|importer|store|widgets/app|widgets/login|widgets/table' | grep -vE 'examples|tests*|config|widgets')
TESTTAGS ?= ""
# TESTWIDGETS := $(shell $(GO) list ./widgets/...)

View file

@ -1,6 +1,7 @@
package share
import (
"fmt"
"io/ioutil"
"os"
"path"
@ -35,6 +36,13 @@ func ID(root string, file string) string {
return SpecName(root, file)
}
// File ID to file
func File(id string, ext string) string {
ext = strings.TrimLeft(ext, ".")
file := strings.ReplaceAll(id, ".", string(os.PathSeparator))
return fmt.Sprintf("%s.%s", file, ext)
}
// SpecName 解析名称 root: "/tests/apis" file: "/tests/apis/foo/bar.http.json"
func SpecName(root string, file string) string {
filename := strings.TrimPrefix(file, root+"/") // "foo/bar.http.json"

View file

@ -9,9 +9,11 @@ import (
"github.com/yaoapp/gou/model"
"github.com/yaoapp/gou/query"
"github.com/yaoapp/gou/query/gou"
v8 "github.com/yaoapp/gou/runtime/v8"
"github.com/yaoapp/kun/exception"
"github.com/yaoapp/xun/capsule"
"github.com/yaoapp/yao/config"
"github.com/yaoapp/yao/fs"
"github.com/yaoapp/yao/runtime"
"github.com/yaoapp/yao/share"
)
@ -82,10 +84,34 @@ func start(t *testing.T, cfg config.Config) {
}
func load(t *testing.T, cfg config.Config) {
loadFS(t, cfg)
loadScript(t, cfg)
loadModel(t, cfg)
loadQuery(t, cfg)
}
func loadFS(t *testing.T, cfg config.Config) {
err := fs.Load(cfg)
if err != nil {
t.Fatal(err)
}
}
func loadScript(t *testing.T, cfg config.Config) {
exts := []string{"*.js"}
err := application.App.Walk("scripts", func(root, file string, isdir bool) error {
if isdir {
return nil
}
_, err := v8.Load(file, share.ID(root, file))
return err
}, exts...)
if err != nil {
t.Fatal(err)
}
}
func loadModel(t *testing.T, cfg config.Config) {
model.WithCrypt([]byte(fmt.Sprintf(`{"key":"%s"}`, cfg.DB.AESKey)), "AES")
model.WithCrypt([]byte(`{}`), "PASSWORD")

View file

@ -216,6 +216,10 @@ func (c *Computable) viewRows(name string, process *process.Process, res interfa
// ViewRow row
func (c *Computable) viewRow(name string, process *process.Process, res map[string]interface{}, getField func(string) (*field.ColumnDSL, string, string, error)) error {
if c.Computes == nil {
return nil
}
messages := []string{}
row := maps.MapOf(res).Dot()
data := maps.StrAny{"row": row}.Dot()

View file

@ -42,7 +42,7 @@ func LoadAndExport(cfg config.Config) error {
func SelectTransform(name string) (*Transform, error) {
trans, has := Transforms[name]
if !has {
return nil, fmt.Errorf("SelectTransform %s does not found", name)
return nil, fmt.Errorf("Transform %s does not found", name)
}
return trans, nil
}

View file

@ -299,6 +299,6 @@ func exportAPI() error {
}
// load apis
_, err = api.Load(string(source), "widgets.table")
_, err = api.LoadSource("<widget.table>.yao", source, "widgets.table")
return err
}

View file

@ -1,14 +1,7 @@
package table
import (
"fmt"
"net/url"
"testing"
"time"
"github.com/gin-gonic/gin"
"github.com/stretchr/testify/assert"
"github.com/yaoapp/kun/any"
"github.com/yaoapp/yao/widgets/test"
)
@ -17,188 +10,194 @@ var guards = map[string]gin.HandlerFunc{
"widget-table": Guard,
}
func TestAPISetting(t *testing.T) {
port := start(t)
defer test.Stop(func() {})
// func TestAPISetting(t *testing.T) {
req := test.NewRequest(port).Route("/api/__yao/table/pet/setting")
res, err := req.Get()
if err != nil {
t.Fatal(err)
}
assert.Equal(t, 403, res.Status())
// gtest.Prepare(t, config.Conf)
// defer gtest.Clean()
req = test.NewRequest(port).Route("/api/__yao/table/pet/setting").Token(token(t))
res, err = req.Get()
if err != nil {
t.Fatal(err)
}
assert.Equal(t, 200, res.Status())
// prepare(t)
// clear(t)
// testData(t)
v, err := res.Map()
if err != nil {
t.Fatal(err)
}
data := any.Of(v).MapStr().Dot()
assert.Equal(t, "/api/xiang/import/pet", data.Get("header.preset.import.api.import"))
// assert.Equal(t, "跳转", data.Get("header.preset.import.operation.0.title"))
assert.Equal(t, "/api/__yao/table/pet/component/fields.table."+url.QueryEscape("入院状态")+".view.props.xProps/remote", data.Get("fields.table.入院状态.view.props.xProps.remote.api"))
assert.Equal(t, "/api/__yao/table/pet/component/fields.table."+url.QueryEscape("入院状态")+".edit.props.xProps/remote", data.Get("fields.table.入院状态.edit.props.xProps.remote.api"))
}
// port := start(t)
// defer test.Stop(func() {})
func TestAPISearch(t *testing.T) {
port := start(t)
defer test.Stop(func() {})
// req := test.NewRequest(port).Route("/api/__yao/table/pet/setting")
// res, err := req.Get()
// if err != nil {
// t.Fatal(err)
// }
// assert.Equal(t, 403, res.Status())
req := test.NewRequest(port).Route("/api/__yao/table/session/search")
res, err := req.Get()
if err != nil {
t.Fatal(err)
}
assert.Equal(t, 403, res.Status())
// req = test.NewRequest(port).Route("/api/__yao/table/pet/setting").Token(token(t))
// res, err = req.Get()
// if err != nil {
// t.Fatal(err)
// }
// assert.Equal(t, 200, res.Status())
req = test.NewRequest(port).Route("/api/__yao/table/session/search").Token(token(t))
res, err = req.Get()
if err != nil {
t.Fatal(err)
}
assert.Equal(t, 200, res.Status())
resp, err := res.Map()
if err != nil {
t.Fatal(err)
}
// v, err := res.Map()
// if err != nil {
// t.Fatal(err)
// }
// data := any.Of(v).MapStr().Dot()
// assert.Equal(t, "/api/xiang/import/pet", data.Get("header.preset.import.api.import"))
// // assert.Equal(t, "跳转", data.Get("header.preset.import.operation.0.title"))
// assert.Equal(t, "/api/__yao/table/pet/component/fields.table."+url.QueryEscape("入院状态")+".view.props.xProps/remote", data.Get("fields.table.入院状态.view.props.xProps.remote.api"))
// assert.Equal(t, "/api/__yao/table/pet/component/fields.table."+url.QueryEscape("入院状态")+".edit.props.xProps/remote", data.Get("fields.table.入院状态.edit.props.xProps.remote.api"))
// }
data := any.Of(resp).MapStr().Dot()
assert.Equal(t, "1", fmt.Sprintf("%v", data.Get("pagesize")))
assert.Equal(t, "3", fmt.Sprintf("%v", data.Get("total")))
assert.Equal(t, "checked", data.Get("data.0.status"))
assert.Equal(t, "enabled", data.Get("data.0.mode"))
assert.Equal(t, "1", fmt.Sprintf("%v", data.Get("data.0.doctor_id")))
// func TestAPISearch(t *testing.T) {
// port := start(t)
// defer test.Stop(func() {})
}
// req := test.NewRequest(port).Route("/api/__yao/table/session/search")
// res, err := req.Get()
// if err != nil {
// t.Fatal(err)
// }
// assert.Equal(t, 403, res.Status())
func TestAPISave(t *testing.T) {
port := start(t)
defer test.Stop(func() {})
// req = test.NewRequest(port).Route("/api/__yao/table/session/search").Token(token(t))
// res, err = req.Get()
// if err != nil {
// t.Fatal(err)
// }
// assert.Equal(t, 200, res.Status())
// resp, err := res.Map()
// if err != nil {
// t.Fatal(err)
// }
payload := map[string]interface{}{
"name": "New Pet",
"type": "cat",
"status": "checked",
"mode": "enabled",
"stay": 66,
"cost": 24,
"doctor_id": 1,
}
// data := any.Of(resp).MapStr().Dot()
// assert.Equal(t, "1", fmt.Sprintf("%v", data.Get("pagesize")))
// assert.Equal(t, "3", fmt.Sprintf("%v", data.Get("total")))
// assert.Equal(t, "checked", data.Get("data.0.status"))
// assert.Equal(t, "enabled", data.Get("data.0.mode"))
// assert.Equal(t, "1", fmt.Sprintf("%v", data.Get("data.0.doctor_id")))
req := test.NewRequest(port).Route("/api/__yao/table/pet/save").Data(payload)
res, err := req.Post()
if err != nil {
t.Fatal(err)
}
assert.Equal(t, 403, res.Status())
// }
req = test.NewRequest(port).Route("/api/__yao/table/pet/save").Data(payload).Token(token(t))
res, err = req.Post()
if err != nil {
t.Fatal(err)
}
assert.Equal(t, 200, res.Status())
// func TestAPISave(t *testing.T) {
// port := start(t)
// defer test.Stop(func() {})
v, err := res.Int()
if err != nil {
t.Fatal(err)
}
// payload := map[string]interface{}{
// "name": "New Pet",
// "type": "cat",
// "status": "checked",
// "mode": "enabled",
// "stay": 66,
// "cost": 24,
// "doctor_id": 1,
// }
assert.Equal(t, 4, v)
}
// req := test.NewRequest(port).Route("/api/__yao/table/pet/save").Data(payload)
// res, err := req.Post()
// if err != nil {
// t.Fatal(err)
// }
// assert.Equal(t, 403, res.Status())
func TestAPICustomGuard(t *testing.T) {
// req = test.NewRequest(port).Route("/api/__yao/table/pet/save").Data(payload).Token(token(t))
// res, err = req.Post()
// if err != nil {
// t.Fatal(err)
// }
// assert.Equal(t, 200, res.Status())
port := start(t)
defer test.Stop(func() {})
// v, err := res.Int()
// if err != nil {
// t.Fatal(err)
// }
req := test.NewRequest(port).Route("/api/__yao/table/pet/find/1")
res, err := req.Get()
if err != nil {
t.Fatal(err)
}
// assert.Equal(t, 4, v)
// }
req = test.NewRequest(port).Route("/api/__yao/table/pet/get")
res, err = req.Get()
if err != nil {
t.Fatal(err)
}
assert.Equal(t, 403, res.Status())
// func TestAPICustomGuard(t *testing.T) {
req = test.NewRequest(port).Route("/api/__yao/table/pet/get").Token(token(t)).Header("Unit-Test", "yes")
res, err = req.Get()
if err != nil {
t.Fatal(err)
}
assert.Equal(t, 418, res.Status())
// port := start(t)
// defer test.Stop(func() {})
req = test.NewRequest(port).Route("/api/__yao/table/pet/get").Token(token(t))
res, err = req.Get()
if err != nil {
t.Fatal(err)
}
assert.Equal(t, 200, res.Status())
}
// req := test.NewRequest(port).Route("/api/__yao/table/pet/find/1")
// res, err := req.Get()
// if err != nil {
// t.Fatal(err)
// }
func TestAPIGlobalCustomGuard(t *testing.T) {
// req = test.NewRequest(port).Route("/api/__yao/table/pet/get")
// res, err = req.Get()
// if err != nil {
// t.Fatal(err)
// }
// assert.Equal(t, 403, res.Status())
port := start(t)
defer test.Stop(func() {})
// req = test.NewRequest(port).Route("/api/__yao/table/pet/get").Token(token(t)).Header("Unit-Test", "yes")
// res, err = req.Get()
// if err != nil {
// t.Fatal(err)
// }
// assert.Equal(t, 418, res.Status())
req := test.NewRequest(port).Route("/api/__yao/table/guard/find/1")
res, err := req.Get()
if err != nil {
t.Fatal(err)
}
assert.Equal(t, 403, res.Status())
// req = test.NewRequest(port).Route("/api/__yao/table/pet/get").Token(token(t))
// res, err = req.Get()
// if err != nil {
// t.Fatal(err)
// }
// assert.Equal(t, 200, res.Status())
// }
req = test.NewRequest(port).Route("/api/__yao/table/guard/get")
res, err = req.Get()
if err != nil {
t.Fatal(err)
}
assert.Equal(t, 403, res.Status())
// func TestAPIGlobalCustomGuard(t *testing.T) {
req = test.NewRequest(port).Route("/api/__yao/table/guard/get").Token(token(t)).Header("Unit-Test", "yes")
res, err = req.Get()
if err != nil {
t.Fatal(err)
}
assert.Equal(t, 418, res.Status())
// port := start(t)
// defer test.Stop(func() {})
req = test.NewRequest(port).Route("/api/__yao/table/guard/get").Token(token(t))
res, err = req.Get()
if err != nil {
t.Fatal(err)
}
assert.Equal(t, 200, res.Status())
}
// req := test.NewRequest(port).Route("/api/__yao/table/guard/find/1")
// res, err := req.Get()
// if err != nil {
// t.Fatal(err)
// }
// assert.Equal(t, 403, res.Status())
func start(t *testing.T) int {
port := 0
load(t)
clear(t)
testData(t)
go test.Start(t, guards, port)
time.Sleep(200 * time.Millisecond)
return port
}
// req = test.NewRequest(port).Route("/api/__yao/table/guard/get")
// res, err = req.Get()
// if err != nil {
// t.Fatal(err)
// }
// assert.Equal(t, 403, res.Status())
func token(t *testing.T) string {
res, err := test.AutoLogin(1)
if err != nil {
t.Fatal(err)
}
// req = test.NewRequest(port).Route("/api/__yao/table/guard/get").Token(token(t)).Header("Unit-Test", "yes")
// res, err = req.Get()
// if err != nil {
// t.Fatal(err)
// }
// assert.Equal(t, 418, res.Status())
token, ok := res["token"].(string)
if !ok {
t.Fatal(fmt.Errorf("get token error %v", res))
}
return token
}
// req = test.NewRequest(port).Route("/api/__yao/table/guard/get").Token(token(t))
// res, err = req.Get()
// if err != nil {
// t.Fatal(err)
// }
// assert.Equal(t, 200, res.Status())
// }
// func start(t *testing.T) int {
// port := 0
// go test.Start(t, guards, port)
// time.Sleep(200 * time.Millisecond)
// return port
// }
// func token(t *testing.T) string {
// res, err := test.AutoLogin(1)
// if err != nil {
// t.Fatal(err)
// }
// token, ok := res["token"].(string)
// if !ok {
// t.Fatal(fmt.Errorf("get token error %v", res))
// }
// return token
// }

View file

@ -7,6 +7,7 @@ import (
"path/filepath"
"github.com/xuri/excelize/v2"
"github.com/yaoapp/gou/fs"
"github.com/yaoapp/kun/any"
"github.com/yaoapp/kun/log"
"github.com/yaoapp/kun/maps"
@ -43,7 +44,12 @@ func (dsl *DSL) Export(filename string, data interface{}, page int, chunkSize in
}
// filename = filepath.Join(xfs.Stor.Root, filename)
filename = filepath.Join("/data", filename)
fs, err := fs.Get("system")
if err != nil {
return err
}
filename = filepath.Join(fs.Root(), filename)
if _, err := os.Stat(filename); errors.Is(err, os.ErrNotExist) {
f := excelize.NewFile()
index := f.GetActiveSheetIndex()

View file

@ -34,6 +34,11 @@ func (fields *FieldsDSL) BindModel(m *model.Model) error {
}
// append columns
if _, has := fields.Table[tableField.Key]; !has {
if fields.Table == nil {
continue
}
fields.Table[tableField.Key] = *tableField
// PASSWORD Fields

View file

@ -5,12 +5,18 @@ import (
"github.com/stretchr/testify/assert"
"github.com/yaoapp/gou/model"
"github.com/yaoapp/yao/config"
"github.com/yaoapp/yao/test"
)
func TestFiledsBindModel(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
m := model.Select("pet")
tab := New("unit-test")
err := tab.Fields.BindModel(m)
@ -18,6 +24,6 @@ func TestFiledsBindModel(t *testing.T) {
t.Fatal(err)
}
assert.Equal(t, "id", tab.Fields.Table["ID"].Bind)
assert.Equal(t, 17, len(tab.Fields.Table))
assert.Equal(t, 6, len(tab.Fields.Filter))
assert.Equal(t, 18, len(tab.Fields.Table))
assert.Equal(t, 7, len(tab.Fields.Filter))
}

View file

@ -38,6 +38,10 @@ func (dsl *DSL) mapping() error {
}
}
if dsl.CProps == nil {
dsl.CProps = field.CloudProps{}
}
if dsl.Mapping == nil {
dsl.Mapping = &mapping.Mapping{}
}

View file

@ -7,10 +7,15 @@ import (
"github.com/stretchr/testify/assert"
"github.com/yaoapp/gou/process"
"github.com/yaoapp/kun/any"
"github.com/yaoapp/yao/config"
"github.com/yaoapp/yao/test"
)
func TestMapping(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
@ -29,7 +34,10 @@ func TestMapping(t *testing.T) {
func TestMappingFind(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
@ -44,7 +52,10 @@ func TestMappingFind(t *testing.T) {
func TestMappingGet(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
@ -63,7 +74,10 @@ func TestMappingGet(t *testing.T) {
func TestMappingSearch(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
@ -78,9 +92,13 @@ func TestMappingSearch(t *testing.T) {
}
func TestMappingSave(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
args := []interface{}{"compute", map[string]interface{}{
"name": " New Pet ",
"type": "cat",
@ -107,9 +125,13 @@ func TestMappingSave(t *testing.T) {
}
func TestMappingUpdate(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
args := []interface{}{"compute", 1, map[string]interface{}{
"name": " New Pet ",
"type": "cat",
@ -135,8 +157,12 @@ func TestMappingUpdate(t *testing.T) {
}
func TestMappingInsert(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
args := []interface{}{"compute",
[]string{"name", "type", "status", "mode", "stay", "cost", "doctor_id"},
[][]interface{}{

View file

@ -16,11 +16,15 @@ import (
"github.com/yaoapp/yao/config"
"github.com/yaoapp/yao/helper"
q "github.com/yaoapp/yao/query"
"github.com/yaoapp/yao/test"
)
func TestProcessSearch(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
@ -45,7 +49,10 @@ func TestProcessSearch(t *testing.T) {
func TestProcessGet(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
@ -72,7 +79,10 @@ func TestProcessGet(t *testing.T) {
func TestProcessFind(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
@ -87,9 +97,13 @@ func TestProcessFind(t *testing.T) {
}
func TestProcessSave(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
args := []interface{}{"pet", map[string]interface{}{
"name": "New Pet",
"type": "cat",
@ -116,9 +130,13 @@ func TestProcessSave(t *testing.T) {
}
func TestProcessCreate(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
args := []interface{}{"pet", map[string]interface{}{
"id": 6,
"name": "New Pet",
@ -146,9 +164,13 @@ func TestProcessCreate(t *testing.T) {
}
func TestProcessUpdate(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
args := []interface{}{"pet", 1, map[string]interface{}{
"name": "New Pet",
"type": "cat",
@ -174,9 +196,13 @@ func TestProcessUpdate(t *testing.T) {
}
func TestProcessUpdateWhere(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
args := []interface{}{"pet",
map[string]interface{}{"wheres": []map[string]interface{}{{"column": "id", "value": 1}}},
map[string]interface{}{
@ -204,9 +230,13 @@ func TestProcessUpdateWhere(t *testing.T) {
}
func TestProcessUpdateIn(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
args := []interface{}{"pet", "1",
map[string]interface{}{
"name": "New Pet",
@ -233,8 +263,12 @@ func TestProcessUpdateIn(t *testing.T) {
}
func TestProcessInsert(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
args := []interface{}{"pet",
[]string{"name", "type", "status", "mode", "stay", "cost", "doctor_id"},
[][]interface{}{
@ -259,9 +293,13 @@ func TestProcessInsert(t *testing.T) {
}
func TestProcessDelete(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
args := []interface{}{"pet", 1}
_, err := process.New("yao.table.Delete", args...).Exec()
@ -274,9 +312,13 @@ func TestProcessDelete(t *testing.T) {
}
func TestProcessDeleteWhere(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
args := []interface{}{
"pet",
map[string]interface{}{"wheres": []map[string]interface{}{{"column": "id", "value": 1}}},
@ -292,9 +334,13 @@ func TestProcessDeleteWhere(t *testing.T) {
}
func TestProcessDeleteIn(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
args := []interface{}{"pet", "1"}
_, err := process.New("yao.table.DeleteIn", args...).Exec()
@ -307,9 +353,13 @@ func TestProcessDeleteIn(t *testing.T) {
}
func TestProcessComponent(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
args := []interface{}{
"pet",
"fields.filter.状态.edit.props.xProps",
@ -338,9 +388,13 @@ func TestProcessComponent(t *testing.T) {
}
func TestProcessComponentError(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
args := []interface{}{
"pet",
"fields.filter.edit.props.状态.::not-exist",
@ -352,9 +406,13 @@ func TestProcessComponentError(t *testing.T) {
}
func TestProcessUpload(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
args := []interface{}{
"pet",
"fields.table.相关图片.edit.props",
@ -373,7 +431,10 @@ func TestProcessUpload(t *testing.T) {
}
func TestProcessDownload(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
@ -397,9 +458,13 @@ func TestProcessDownload(t *testing.T) {
}
func TestProcessSetting(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
args := []interface{}{"pet"}
res, err := process.New("yao.table.Setting", args...).Exec()
if err != nil {
@ -416,9 +481,13 @@ func TestProcessSetting(t *testing.T) {
}
func TestProcessXgen(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
args := []interface{}{"pet"}
res, err := process.New("yao.table.Xgen", args...).Exec()
if err != nil {
@ -436,7 +505,10 @@ func TestProcessXgen(t *testing.T) {
}
func TestProcessXgenWithPermissions(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
@ -484,9 +556,13 @@ func TestProcessXgenWithPermissions(t *testing.T) {
}
func TestProcessExport(t *testing.T) {
load(t)
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
clear(t)
testData(t)
args := []interface{}{"pet", model.QueryParam{Wheres: []model.QueryWhere{{Column: "mode", Value: "enabled"}}}, 2}
response := process.New("yao.table.Export", args...).Run()
assert.NotNil(t, response)

View file

@ -6,13 +6,13 @@ import (
"strings"
jsoniter "github.com/json-iterator/go"
"github.com/yaoapp/gou/application"
"github.com/yaoapp/gou/process"
"github.com/yaoapp/kun/exception"
"github.com/yaoapp/kun/log"
"github.com/yaoapp/yao/config"
"github.com/yaoapp/yao/share"
"github.com/yaoapp/yao/widgets/component"
"github.com/yaoapp/yao/widgets/environment"
"github.com/yaoapp/yao/widgets/field"
)
@ -101,70 +101,81 @@ func LoadAndExport(cfg config.Config) error {
return Load(cfg)
}
// Load load table
// Load load table dsl
func Load(cfg config.Config) error {
var root = filepath.Join(cfg.Root, "tables")
return LoadFrom(root, "")
}
// LoadID load by id
func LoadID(id string, root string) error {
dirs := strings.Split(id, ".")
name := fmt.Sprintf("%s.tab.json", dirs[len(dirs)-1])
elems := []string{root}
elems = append(elems, dirs[0:len(dirs)-1]...)
elems = append(elems, "tables", name)
filename := filepath.Join(elems...)
data, err := environment.ReadFile(filename)
if err != nil {
return fmt.Errorf("[table] LoadID %s root=%s %s", id, root, err.Error())
}
return LoadData(data, id, root)
}
// LoadFrom load from dir
func LoadFrom(dir string, prefix string) error {
if share.DirNotExists(dir) {
return fmt.Errorf("%s does not exists", dir)
}
messages := []string{}
err := share.Walk(dir, ".json", func(root, filename string) {
id := prefix + share.ID(root, filename)
data, err := environment.ReadFile(filename)
if err != nil {
messages = append(messages, fmt.Sprintf("[%s] %s", id, err.Error()))
return
exts := []string{"*.tab.yao", "*.tab.json", "*.tab.jsonc"}
err := application.App.Walk("tables", func(root, file string, isdir bool) error {
if isdir {
return nil
}
if err := LoadFile(root, file); err != nil {
messages = append(messages, err.Error())
}
err = LoadData(data, id, filepath.Dir(dir))
if err != nil {
messages = append(messages, fmt.Sprintf("[%s] %s", id, err.Error()))
return
}
})
return nil
}, exts...)
if len(messages) > 0 {
return fmt.Errorf(strings.Join(messages, ";"))
return fmt.Errorf(strings.Join(messages, ";\n"))
}
return err
}
// LoadData load table from source
func LoadData(data []byte, id string, root string) error {
dsl := New(id)
dsl.Root = root
// LoadID load table dsl by id
func LoadID(id string, root string) error {
err := jsoniter.Unmarshal(data, dsl)
if err != nil {
return fmt.Errorf("[Table] LoadData %s %s", id, err.Error())
file := filepath.Join("tables", share.File(id, ".tab.yao"))
if exists, _ := application.App.Exists(file); exists {
return LoadFile("tables", file)
}
file = filepath.Join("tables", share.File(id, ".tab.jsonc"))
if exists, _ := application.App.Exists(file); exists {
return LoadFile("tables", file)
}
file = filepath.Join("tables", share.File(id, ".tab.json"))
if exists, _ := application.App.Exists(file); exists {
return LoadFile("tables", file)
}
return fmt.Errorf("table %s not found", id)
}
// LoadFile load table dsl by file
func LoadFile(root string, file string) error {
id := share.ID(root, file)
data, err := application.App.Read(file)
if err != nil {
return err
}
dsl := &DSL{ID: id}
err = application.Parse(file, data, dsl)
if err != nil {
return fmt.Errorf("[%s] %s", id, err.Error())
}
err = dsl.parse(id, root)
if err != nil {
return err
}
Tables[id] = dsl
return nil
}
// parse parse table dsl source
func (dsl *DSL) parse(id string, root string) error {
dsl.Root = root // remove next version
if dsl.Action == nil {
dsl.Action = &ActionDSL{}
}
dsl.Action.SetDefaultProcess()
if dsl.Layout == nil {
@ -181,7 +192,7 @@ func LoadData(data []byte, id string, root string) error {
}
// Bind model / store / table / ...
err = dsl.Bind()
err := dsl.Bind()
if err != nil {
return fmt.Errorf("[Table] LoadData Bind %s %s", id, err.Error())
}
@ -233,6 +244,10 @@ func MustGet(table interface{}) *DSL {
// Xgen trans to xgen setting
func (dsl *DSL) Xgen(data map[string]interface{}, excludes map[string]bool) (map[string]interface{}, error) {
if dsl.Config == nil {
dsl.Config = map[string]interface{}{}
}
layout, err := dsl.Layout.Xgen(data, excludes, dsl.Mapping)
if err != nil {
return nil, err

View file

@ -7,19 +7,20 @@ import (
"github.com/stretchr/testify/assert"
"github.com/yaoapp/yao/config"
"github.com/yaoapp/yao/flow"
"github.com/yaoapp/yao/fs"
"github.com/yaoapp/yao/model"
"github.com/yaoapp/yao/script"
"github.com/yaoapp/yao/test"
_ "github.com/yaoapp/yao/utils"
"github.com/yaoapp/yao/widgets/app"
"github.com/yaoapp/yao/widgets/component"
"github.com/yaoapp/yao/widgets/expression"
"github.com/yaoapp/yao/widgets/field"
"github.com/yaoapp/yao/widgets/test"
)
func TestLoad(t *testing.T) {
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
err := Load(config.Conf)
if err != nil {
t.Fatal(err)
@ -28,7 +29,11 @@ func TestLoad(t *testing.T) {
}
func TestLoadID(t *testing.T) {
test.Prepare(t, config.Conf)
defer test.Clean()
prepare(t)
err := LoadID("pet", filepath.Join(config.Conf.Root))
if err != nil {
t.Fatal(err)
@ -36,37 +41,41 @@ func TestLoadID(t *testing.T) {
}
func prepare(t *testing.T, language ...string) {
// runtime.Load(config.Conf)
err := test.LoadEngine(language...)
if err != nil {
t.Fatal(err)
}
// load fs
err = fs.Load(config.Conf)
if err != nil {
t.Fatal(err)
}
// test.Prepare(t, config.Conf)
// defer test.Clean()
// load scripts
err = script.Load(config.Conf)
if err != nil {
t.Fatal(err)
}
// // runtime.Load(config.Conf)
// err := test.LoadEngine(language...)
// if err != nil {
// t.Fatal(err)
// }
// load models
err = model.Load(config.Conf)
if err != nil {
t.Fatal(err)
}
// // load fs
// err = fs.Load(config.Conf)
// if err != nil {
// t.Fatal(err)
// }
// // load scripts
// err = script.Load(config.Conf)
// if err != nil {
// t.Fatal(err)
// }
// // load models
// err = model.Load(config.Conf)
// if err != nil {
// t.Fatal(err)
// }
// load flows
err = flow.Load(config.Conf)
err := flow.Load(config.Conf)
if err != nil {
t.Fatal(err)
}
// load app widget
// load app
err = app.LoadAndExport(config.Conf)
if err != nil {
t.Fatal(err)
@ -90,10 +99,15 @@ func prepare(t *testing.T, language ...string) {
t.Fatal(err)
}
// Load table
err = Load(config.Conf)
if err != nil {
t.Fatal(err)
}
// export
err = Export()
if err != nil {
t.Fatal(err)
}
}