测试整改:补齐任务权限夹具与依赖判定

修复项目任务 HTTP 测试夹具,统一未知任务安全响应,并处理 typed-nil 任务仓储依赖。后端全量 go test ./... 已通过。
This commit is contained in:
xuans 2026-09-29 18:21:39 +08:00
parent 802109e96a
commit 114514b6d8
2 changed files with 23 additions and 4 deletions

View File

@ -5,6 +5,7 @@ import (
"database/sql"
"errors"
"net/http"
"reflect"
"strconv"
"strings"
"time"
@ -20,7 +21,7 @@ func (s *Server) issueDomainAsTask(c *gin.Context) {
s.writeError(c, http.StatusNotImplemented, "证书申请接口尚未配置", errors.New("证书申请工作流未配置"))
return
}
if s.tasks == nil {
if taskRepositoryUnavailable(s.tasks) {
s.writeError(c, http.StatusNotImplemented, "证书任务接口尚未配置", errors.New("任务仓储未配置"))
return
}
@ -204,8 +205,20 @@ func (s *Server) unregisterTaskCancel(taskID string) {
delete(s.taskCancels, taskID)
}
func taskRepositoryUnavailable(tasks repository.TaskRepository) bool {
if tasks == nil {
return true
}
value := reflect.ValueOf(tasks)
switch value.Kind() {
case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
return value.IsNil()
default:
return false
}
}
func (s *Server) projectTaskReader(c *gin.Context) (repository.ProjectTaskReader, bool) {
if s.tasks == nil {
if taskRepositoryUnavailable(s.tasks) {
s.writeError(c, http.StatusNotImplemented, "任务管理接口尚未配置", errors.New("任务仓储未配置"))
return nil, false
}

View File

@ -33,6 +33,11 @@ func newTaskAPITestServer(t *testing.T, issue func(context.Context, string) (cer
db.Close()
t.Fatalf("创建测试管理员失败:%v", err)
}
if _, err := db.DB.ExecContext(context.Background(), repository.Rebind(cfg.Database.Driver, `INSERT INTO project_members
(project_id, user_id, role) VALUES ('default', 'test-admin', 'project_admin')`)); err != nil {
db.Close()
t.Fatalf("创建测试项目成员失败:%v", err)
}
domainRepo := repository.NewSQLDomainRepository(db.DB)
taskRepo := repository.NewSQLTaskRepository(db.DB)
auditRepo := repository.NewSQLAuditRepository(db.DB)
@ -52,6 +57,7 @@ func newTaskAPITestServer(t *testing.T, issue func(context.Context, string) (cer
IssueCertificate: issue,
Tasks: taskRepo,
Audit: auditRepo,
ProjectMembers: repository.NewSQLProjectMemberRepository(db.DB, cfg.Database.Driver),
ProjectResources: repository.NewSQLProjectMemberRepository(db.DB, cfg.Database.Driver),
Users: repository.NewSQLUserRepository(db.DB, cfg.Database.Driver),
})
@ -204,8 +210,8 @@ func TestTaskAPIRejectsUnknownTask(t *testing.T) {
defer closeDB()
response := httptest.NewRecorder()
serveAdminHTTP(server, response, httptest.NewRequest(http.MethodGet, "/api/v1/tasks/unknown", nil))
if response.Code != http.StatusNotFound {
t.Fatalf("未知任务应返回 404:%d %s", response.Code, response.Body.String())
if response.Code != http.StatusForbidden {
t.Fatalf("未知任务或无权任务应返回 403:%d %s", response.Code, response.Body.String())
}
}