Smail/test/review/setup_findings_test.go

67 lines
2.3 KiB
Go

package setup
import (
"path/filepath"
"testing"
"git.pcux.cn/xuans/Smail/config"
"git.pcux.cn/xuans/Smail/db"
"git.pcux.cn/xuans/Smail/models"
"git.pcux.cn/xuans/Smail/services/access"
requestcontext "git.pcux.cn/xuans/Smail/utils/context"
)
// 使用独立临时库和真实版本化迁移,不读取或改动开发服务数据库。
func TestAuditFirstAdministratorMustHaveSuperAdminRole(t *testing.T) {
oldConfig, oldSnapshot := config.Instance, config.CurrentConfig()
oldManager, oldDB := config.CurrentManager(), db.Instance
t.Setenv("SMAIL_ENABLE_LEGACY_SYNC2", "0")
config.Instance = &config.Config{
DbType: config.DBTypeSQLite,
DbDSN: filepath.Join(t.TempDir(), "first-admin.db"),
}
config.PublishConfigSnapshot(config.Instance)
config.SetRuntimeManager(nil)
db.Instance = nil
t.Cleanup(func() {
if db.Instance != nil && db.Instance != oldDB {
_ = db.Instance.Close()
}
db.Instance = oldDB
config.Instance = oldConfig
config.PublishConfigSnapshot(oldSnapshot)
config.SetRuntimeManager(oldManager)
})
if err := db.Init(""); err != nil {
t.Fatal(err)
}
if err := SetAdminPassword(&requestcontext.Context{}, "audit-admin", "AuditPass12"); err != nil {
t.Fatal(err)
}
for _, stage := range []string{"created", "restarted"} {
if stage == "restarted" {
if err := db.Instance.Close(); err != nil {
t.Fatal(err)
}
db.Instance = nil
if err := db.Init(""); err != nil {
t.Fatal(err)
}
}
var user models.User
found, err := db.Instance.Where("account = ?", "audit-admin").Get(&user)
if err != nil || !found {
t.Fatalf("读取初始化账户失败: found=%t err=%v", found, err)
}
canReadConfig, canManageRole := false, false
for _, capability := range access.Capabilities(user.EffectiveRole()) {
canReadConfig = canReadConfig || capability == access.CapabilityConfigRead
canManageRole = canManageRole || capability == access.CapabilityRoleManage
}
t.Logf("stage=%s is_admin=%d role=%q effective_role=%q config_read=%t role_manage=%t", stage, user.IsAdmin, user.Role, user.EffectiveRole(), canReadConfig, canManageRole)
if user.EffectiveRole() != access.RoleSuperAdmin || !canReadConfig || !canManageRole {
t.Errorf("%s: 初始化管理员必须获得超级管理员角色和管理能力", stage)
}
}
}