feat: harden loose-offline sync for user JWT, schema, and console ops
Enable Binding-scoped agent push/pull, empty-table schema ensure, SyncPage inspect/drop-table, default module import, and agent-bound publish docs from the 宇恒联调意见. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
77
platform/internal/blueprint/ensure_ops_test.go
Normal file
77
platform/internal/blueprint/ensure_ops_test.go
Normal file
@@ -0,0 +1,77 @@
|
||||
package blueprint_test
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"testing"
|
||||
|
||||
"aijianzhan/platform/internal/blueprint"
|
||||
)
|
||||
|
||||
func TestEnsureDefaultImportExport(t *testing.T) {
|
||||
bp := &blueprint.Blueprint{
|
||||
Apis: blueprint.Apis{
|
||||
Resources: []blueprint.APIResource{
|
||||
{Entity: "a", Path: "/a", Operations: []string{"list", "get", "create", "update", "delete"}},
|
||||
{Entity: "ro", Path: "/ro", Operations: []string{"list", "get"}},
|
||||
{Entity: "b", Path: "/b", Operations: []string{"list", "create", "import"}},
|
||||
},
|
||||
},
|
||||
Pages: []blueprint.Page{
|
||||
{ID: "p1", Type: "list", Entity: "a", Layout: &blueprint.PageLayout{Actions: []string{"create", "edit", "delete", "refresh"}}},
|
||||
{ID: "p2", Type: "form", Entity: "a"},
|
||||
},
|
||||
}
|
||||
bp.EnsureDefaultImportExport()
|
||||
|
||||
ops0 := bp.Apis.Resources[0].Operations
|
||||
if !contains(ops0, "import") || !contains(ops0, "export") {
|
||||
t.Fatalf("writable resource should get import/export, got %v", ops0)
|
||||
}
|
||||
opsRO := bp.Apis.Resources[1].Operations
|
||||
if contains(opsRO, "import") {
|
||||
t.Fatalf("read-only should not get import, got %v", opsRO)
|
||||
}
|
||||
opsB := bp.Apis.Resources[2].Operations
|
||||
if !contains(opsB, "export") || countOp(opsB, "import") != 1 {
|
||||
t.Fatalf("should add export once, keep import: %v", opsB)
|
||||
}
|
||||
acts := bp.Pages[0].Layout.Actions
|
||||
if !contains(acts, "import") || !contains(acts, "export") {
|
||||
t.Fatalf("list actions should include import/export: %v", acts)
|
||||
}
|
||||
}
|
||||
|
||||
func TestEnsureDefaultImportExportDisabled(t *testing.T) {
|
||||
ui, _ := json.Marshal(map[string]any{"disable_default_import": true})
|
||||
bp := &blueprint.Blueprint{
|
||||
Meta: blueprint.Meta{UI: ui},
|
||||
Apis: blueprint.Apis{
|
||||
Resources: []blueprint.APIResource{
|
||||
{Entity: "a", Path: "/a", Operations: []string{"list", "create"}},
|
||||
},
|
||||
},
|
||||
}
|
||||
bp.EnsureDefaultImportExport()
|
||||
if contains(bp.Apis.Resources[0].Operations, "import") {
|
||||
t.Fatal("disable_default_import should skip")
|
||||
}
|
||||
}
|
||||
|
||||
func contains(ss []string, want string) bool {
|
||||
for _, s := range ss {
|
||||
if s == want {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func countOp(ss []string, want string) int {
|
||||
n := 0
|
||||
for _, s := range ss {
|
||||
if s == want {
|
||||
n++
|
||||
}
|
||||
}
|
||||
return n
|
||||
}
|
||||
Reference in New Issue
Block a user