111 lines
4.0 KiB
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))
|
|
}
|
|
}
|