82 lines
3.0 KiB
Go
82 lines
3.0 KiB
Go
package business
|
|
|
|
import (
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/glebarez/sqlite"
|
|
"gorm.io/gorm"
|
|
datasystem "kra/internal/data/system"
|
|
datatask "kra/internal/data/task"
|
|
)
|
|
|
|
func TestOtherSettingsUpgradeAddsStandaloneMenuForSuperAdmin(t *testing.T) {
|
|
db, err := gorm.Open(sqlite.Open(filepath.Join(t.TempDir(), "settings.db")), &gorm.Config{})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
pool, _ := db.DB()
|
|
t.Cleanup(func() { _ = pool.Close() })
|
|
for _, step := range append(datasystem.Migrations(), datatask.Migrations()...) {
|
|
if err := step.Migrate(db); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
if err := db.Exec("INSERT INTO sys_authorities(authority_id,authority_name,parent_id) VALUES(888,'admin',0),(901,'business',888)").Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := db.Exec("INSERT INTO sys_base_menus(name,title,parent_id,sort) VALUES('sw_AlertCenter','预警中心',0,4),('permission','权限管理',0,5)").Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := db.Exec("INSERT INTO sys_timed_tasks(name,method_name,spec,enabled) VALUES('旧检测任务','alertTriggerTask','*/5 * * * *',0)").Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for attempt := 0; attempt < 2; attempt++ {
|
|
for _, step := range Definition().Migrations {
|
|
if err := step.Migrate(db); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
}
|
|
var menu struct {
|
|
ID, ParentID uint
|
|
Sort int
|
|
Title, Component string
|
|
}
|
|
if err := db.Table("sys_base_menus").Where("name=?", "sw_OtherSettings").Take(&menu).Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if menu.ParentID != 0 || menu.Sort != 5 || menu.Title != "其他设置" || menu.Component != "view/sw/OtherSettings.vue" {
|
|
t.Fatalf("必须是独立菜单: %+v", menu)
|
|
}
|
|
var permissionSort int
|
|
if err := db.Table("sys_base_menus").Select("sort").Where("name='permission'").Scan(&permissionSort).Error; err != nil || permissionSort != 6 {
|
|
t.Fatal("其他设置必须紧接预警中心,后续菜单只应顺延一次")
|
|
}
|
|
var roles []uint
|
|
if err := db.Table("sys_authority_menus").Where("sys_base_menu_id=?", menu.ID).Pluck("sys_authority_authority_id", &roles).Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(roles) != 1 || roles[0] != 888 {
|
|
t.Fatalf("只有超管应收到菜单,重复升级不能重复授权: %v", roles)
|
|
}
|
|
var count int64
|
|
if err := db.Table("casbin_rule").Where("ptype='p' AND v1=? AND v0='888'", "/sw/settings/effectiveness").Count(&count).Error; err != nil || count != 2 {
|
|
t.Fatal("超管读写 API 授权缺失或重复")
|
|
}
|
|
if err := db.Table("casbin_rule").Where("ptype='p' AND v1=? AND v0<>'888'", "/sw/settings/effectiveness").Count(&count).Error; err != nil || count != 0 {
|
|
t.Fatal("不应向商务账号开放设置 API")
|
|
}
|
|
var alertTasks []struct {
|
|
Name string
|
|
Enabled bool
|
|
}
|
|
if err := db.Table("sys_timed_tasks").Where("method_name='alertTriggerTask'").Scan(&alertTasks).Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(alertTasks) != 1 || alertTasks[0].Name != "旧检测任务" || alertTasks[0].Enabled {
|
|
t.Fatalf("整个升级链不应额外创建或启用预警任务: %+v", alertTasks)
|
|
}
|
|
|
|
}
|