test: cover multi-user permission boundaries

Co-authored-by: naiba/CloudCode <hi+cloudcode@nai.ba>
This commit is contained in:
naiba
2026-05-17 10:24:19 +08:00
co-authored by naiba/CloudCode
parent 2573ba7522
commit 7061651587
5 changed files with 801 additions and 15 deletions
+45 -3
View File
@@ -115,16 +115,34 @@ func TestValidateServersRejectsForeignTriggerTasks(t *testing.T) {
func newMemberValidationContext(t *testing.T) *gin.Context {
t.Helper()
return newValidationContext(t, 200, model.RoleMember)
}
func newAdminValidationContext(t *testing.T) *gin.Context {
t.Helper()
return newValidationContext(t, 1, model.RoleAdmin)
}
func newValidationContext(t *testing.T, userID uint64, role model.Role) *gin.Context {
t.Helper()
originalDB := singleton.DB
originalLoc := singleton.Loc
originalLocalizer := singleton.Localizer
originalCronShared := singleton.CronShared
originalServerShared := singleton.ServerShared
originalUserInfo := singleton.UserInfoMap
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
assert.NoError(t, err)
assert.NoError(t, db.AutoMigrate(&model.Cron{}, &model.Server{}))
assert.NoError(t, db.AutoMigrate(
&model.Cron{},
&model.Server{},
&model.NotificationGroup{},
&model.NotificationGroupNotification{},
&model.ServerGroup{},
&model.ServerGroupServer{},
))
assert.NoError(t, db.Create(&model.Cron{
Common: model.Common{ID: 42, UserID: 1},
Name: "foreign trigger task",
@@ -132,25 +150,49 @@ func newMemberValidationContext(t *testing.T) *gin.Context {
TaskType: model.CronTypeTriggerTask,
Cover: model.CronCoverAlertTrigger,
}).Error)
assert.NoError(t, db.Create(&model.Cron{
Common: model.Common{ID: 43, UserID: 200},
Name: "member trigger task",
Command: "member-task",
TaskType: model.CronTypeTriggerTask,
Cover: model.CronCoverAlertTrigger,
}).Error)
assert.NoError(t, db.Create(&model.NotificationGroup{
Common: model.Common{ID: 7, UserID: 1},
Name: "admin group",
}).Error)
assert.NoError(t, db.Create(&model.NotificationGroup{
Common: model.Common{ID: 8, UserID: 200},
Name: "member group",
}).Error)
singleton.DB = db
singleton.Loc = time.Local
singleton.Localizer = i18n.NewLocalizer("en_US", "nezha", "translations", i18n.Translations)
singleton.CronShared = singleton.NewCronClass()
singleton.ServerShared = singleton.NewServerClass()
singleton.UserLock.Lock()
singleton.UserInfoMap = map[uint64]model.UserInfo{
1: {Role: model.RoleAdmin},
200: {Role: model.RoleMember},
}
singleton.UserLock.Unlock()
t.Cleanup(func() {
singleton.DB = originalDB
singleton.Loc = originalLoc
singleton.Localizer = originalLocalizer
singleton.CronShared = originalCronShared
singleton.ServerShared = originalServerShared
singleton.UserLock.Lock()
singleton.UserInfoMap = originalUserInfo
singleton.UserLock.Unlock()
})
gin.SetMode(gin.TestMode)
ctx, _ := gin.CreateTestContext(httptest.NewRecorder())
ctx.Set(model.CtxKeyAuthorizedUser, &model.User{
Common: model.Common{ID: 200},
Role: model.RoleMember,
Common: model.Common{ID: userID},
Role: role,
})
return ctx
}