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