kra-new/internal/data/system/surface_upgrade_test.go

111 lines
4.0 KiB
Go

package system
import (
"testing"
"github.com/google/uuid"
platformmodule "kra/pkg/module"
)
func TestEnsureAdminSurfaceAndPolicyInheritance(t *testing.T) {
db, err := openWithDriver("sqlite", "file:"+t.Name()+"-"+uuid.NewString()+"?mode=memory&cache=shared")
if err != nil {
t.Fatal(err)
}
if err = migrateAll(db); err != nil {
t.Fatal(err)
}
parent := menuPO{Name: "extensions", Path: "extensions", Title: "扩展功能"}
if err = db.Create(&parent).Error; err != nil {
t.Fatal(err)
}
rootParent := uint(0)
if err = db.Create(&[]authorityPO{
{AuthorityID: 888, AuthorityName: "root", ParentID: &rootParent},
{AuthorityID: 999, AuthorityName: "operator", ParentID: &rootParent},
}).Error; err != nil {
t.Fatal(err)
}
if err = db.Create(&[]casbinRulePO{
newPolicyRule(999, "/payment/orders", "GET"),
newPolicyRule(999, "/payment/orders/:provider/:tradeNo", "GET"),
}).Error; err != nil {
t.Fatal(err)
}
surface := platformmodule.Surface{
Menus: []platformmodule.Menu{
{Name: "paymentOrders", Path: "paymentOrders", ParentName: "extensions", Component: "view/payment/orders.vue", Title: "支付订单", Sort: 6},
{Name: "paymentConfig", Path: "paymentConfig", ParentName: "extensions", Component: "view/payment/config.vue", Title: "支付配置", Sort: 7},
},
APIs: []platformmodule.API{
{Path: "/payment/orders", Method: "GET", Group: "支付", Description: "订单列表"},
{Path: "/payment/orders/summary", Method: "GET", Group: "支付", Description: "订单汇总"},
{Path: "/payment/orders/:provider/:tradeNo", Method: "GET", Group: "支付", Description: "订单详情"},
{Path: "/payment/orders/:provider/:tradeNo/events", Method: "GET", Group: "支付", Description: "订单事件"},
{Path: "/payment/refund", Method: "POST", Group: "支付", Description: "退款"},
},
}
for attempt := 0; attempt < 2; attempt++ {
if err = EnsureAdminSurface(db, surface, 888); err != nil {
t.Fatal(err)
}
var paymentMenu menuPO
if err = db.Where("name = ?", "paymentOrders").First(&paymentMenu).Error; err != nil {
t.Fatal(err)
}
var linkCount int64
if err = db.Model(&authorityMenuPO{}).Where("sys_authority_authority_id = ? AND sys_base_menu_id = ?", 999, paymentMenu.ID).Count(&linkCount).Error; err != nil {
t.Fatal(err)
}
if linkCount == 0 {
if err = db.Create(&authorityMenuPO{SysAuthorityAuthorityID: 999, SysBaseMenuID: paymentMenu.ID}).Error; err != nil {
t.Fatal(err)
}
}
if err = InheritAPIPolicy(db, "/payment/orders", "GET", "/payment/orders/summary", "GET"); err != nil {
t.Fatal(err)
}
if err = InheritAPIPolicy(db, "/payment/orders/:provider/:tradeNo", "GET", "/payment/orders/:provider/:tradeNo/events", "GET"); err != nil {
t.Fatal(err)
}
if err = GrantMenuAPIs(db, "paymentOrders", surface.APIs[:4]); err != nil {
t.Fatal(err)
}
}
for _, test := range []struct {
authority uint
path string
method string
want bool
}{
{888, "/payment/orders", "GET", true},
{888, "/payment/refund", "POST", true},
{999, "/payment/orders/summary", "GET", true},
{999, "/payment/orders", "GET", true},
{999, "/payment/orders/:provider/:tradeNo/events", "GET", true},
{999, "/payment/refund", "POST", false},
} {
exists, checkErr := policyExists(db, test.authority, test.path, test.method)
if checkErr != nil {
t.Fatal(checkErr)
}
if exists != test.want {
t.Fatalf("policy %d %s %s = %v, want %v", test.authority, test.method, test.path, exists, test.want)
}
}
var apiCount int64
if err = db.Model(&apiPO{}).Where("path LIKE ?", "/payment/%").Count(&apiCount).Error; err != nil {
t.Fatal(err)
}
if apiCount != int64(len(surface.APIs)) {
t.Fatalf("payment APIs = %d, want %d", apiCount, len(surface.APIs))
}
var rootLinks int64
if err = db.Model(&authorityMenuPO{}).Where("sys_authority_authority_id = ?", 888).Count(&rootLinks).Error; err != nil {
t.Fatal(err)
}
if rootLinks != int64(len(surface.Menus)) {
t.Fatalf("root menu links = %d, want %d", rootLinks, len(surface.Menus))
}
}