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)) } }