Files
Agent-System/internal/server/project_handlers_test.go
T
weichenandCursor 7fdbee6c0c test(server): adapt fixtures to IAM dual-gate fail-closed
Boot memory IAM only via explicit test env opt-in; strict auth cases
disable AllowInMemory after startup.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-16 09:42:07 +00:00

99 lines
3.1 KiB
Go

package server
import (
"bytes"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
"chat-agent-system/internal/bizdev"
"chat-agent-system/internal/config"
"chat-agent-system/internal/projectworkflow"
)
func TestHandleListProjects_AdminCanSeeProjectsOwnedByOtherUsers(t *testing.T) {
cfg := &config.Config{DataDir: t.TempDir(), AgentBackend: "stub", AllowInMemory: true, Env: "test"}
svc := bizdev.MustNewService(t, cfg)
srv := NewServer(cfg, svc)
ctx := t.Context()
creator, err := srv.AuthService().GetUserByID(ctx, 2)
if err != nil {
t.Fatalf("load creator: %v", err)
}
created, err := srv.pwSvc.CreateProject(ctx, creator, projectworkflow.CreateProjectInput{
Name: "非管理员创建的项目",
})
if err != nil {
t.Fatalf("create project: %v", err)
}
admin, err := srv.AuthService().GetUserByID(ctx, 1)
if err != nil {
t.Fatalf("load admin: %v", err)
}
req := httptest.NewRequest(http.MethodGet, "/api/v1/projects", nil)
req = req.WithContext(withPrincipal(req.Context(), admin))
rec := httptest.NewRecorder()
srv.handleListProjects(rec, req)
if rec.Code != http.StatusOK {
t.Fatalf("expected 200, got %d: %s", rec.Code, rec.Body.String())
}
var projects []*projectworkflow.Project
if err := json.NewDecoder(rec.Body).Decode(&projects); err != nil {
t.Fatalf("decode projects: %v", err)
}
for _, project := range projects {
if project.ID == created.ID {
return
}
}
t.Fatalf("admin response should include project %d", created.ID)
}
func TestHandleRunProjectWorkflow_DecodesBodyWithoutContentLength(t *testing.T) {
cfg := &config.Config{
DataDir: t.TempDir(),
AgentBackend: "stub",
}
svc := bizdev.MustNewService(t, cfg)
srv := NewServer(cfg, svc)
ctx := t.Context()
srDocID := "doc_proj1001_system_reqs"
_, err := bizdev.Snapshot(svc).Gov.CreateOrGetDocument(
ctx, srDocID, 1001, "system_reqs", "系统需求规格书", "V0.5", "",
2, "张工", 3, "李主管", 4, "王总监",
)
if err != nil {
t.Fatalf("CreateOrGetDocument: %v", err)
}
_ = bizdev.Snapshot(svc).Gov.MarkDocumentContentUpdated(ctx, srDocID, "hash_v1", false)
_, _ = bizdev.Snapshot(svc).Gov.SubmitForReview(ctx, srDocID, 2, "author", "张工")
_, _ = bizdev.Snapshot(svc).Gov.ReviewApprove(ctx, srDocID, 3, "reviewer", "李主管", "同意")
_, err = bizdev.Snapshot(svc).Gov.ApproverApprove(ctx, srDocID, 4, "approver", "王总监", "批准")
if err != nil {
t.Fatalf("ApproverApprove: %v", err)
}
body, _ := json.Marshal(map[string]any{
"task_key": "test_manager",
"project_name": "智能肺功能仪",
"backend": "stub",
})
user, err := srv.AuthService().GetUserByID(ctx, 2)
if err != nil {
t.Fatalf("GetUserByUsername: %v", err)
}
req := httptest.NewRequest(http.MethodPost, "/api/v1/projects/1001/workflows/test_manager/run", bytes.NewReader(body))
req = req.WithContext(withPrincipal(req.Context(), user))
req.SetPathValue("id", "1001")
req.SetPathValue("workflow_key", "test_manager")
rec := httptest.NewRecorder()
srv.handleRunProjectWorkflow(rec, req)
if rec.Code != http.StatusOK {
t.Fatalf("expected 200, got %d: %s", rec.Code, rec.Body.String())
}
}