test(server,app): delete dead resume-workspace test; clarify plan_owner redirect
Remove the skipped client work_dir resume coverage that targeted a deleted entry point, and document why the real-PI stop-gate stays redirected to internal/server to avoid an import cycle. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -120,7 +120,11 @@ func TestLiveTaskStarterReplaysIdempotencyKey(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestTaskGenerateRealPIStopGate(t *testing.T) {
|
||||
// Real PI + PG + revoke/restart evidence lives in
|
||||
// TestMultiIntentU8_RealPI_ConfirmGenerate_PG (internal/server).
|
||||
// Permanent redirect, not a TODO: internal/app has no PG pool / pi-agent runner
|
||||
// harness, and internal/server already imports internal/app (server.go), so pulling
|
||||
// internal/server's real-PI+PG fixtures in here would create an import cycle.
|
||||
// Real PI + PG + revoke/restart evidence for this stop-gate lives in
|
||||
// TestMultiIntentU8_RealPI_ConfirmGenerate_PG (internal/server), which exercises the
|
||||
// same LiveTaskStarter path against a live pi-agent runner + isolated PG.
|
||||
t.Skip("redirect: run TestMultiIntentU8_RealPI_ConfirmGenerate_PG with TEST_DATABASE_URL + runner")
|
||||
}
|
||||
|
||||
@@ -182,59 +182,6 @@ func TestTaskStream_SoftFailure_ClassifiedResumable(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// TestTaskStream_ResumeInvalidWorkspace_ClassifiedResumable resume 模式:
|
||||
// work_dir 非空走 ResumeOrModifyWorkspace;目标工作区不存在 → 失败仍归类 resumable
|
||||
// 且 workspace_id 等于请求的 work_dir(工作区可被修复后继续)
|
||||
func TestTaskStream_ResumeInvalidWorkspace_ClassifiedResumable(t *testing.T) {
|
||||
t.Skip("P0 安全整改:客户端 work_dir 续跑入口已移除")
|
||||
cfg := &config.Config{
|
||||
Env: "test",
|
||||
AgentBackend: "stub",
|
||||
DataDir: t.TempDir(),
|
||||
KbDbPort: 5432,
|
||||
AdminUsername: "admin",
|
||||
AdminPassword: "admin-test-pass",
|
||||
AgentTimeout: 10 * time.Second,
|
||||
}
|
||||
svc := bizdev.MustNewService(t, cfg)
|
||||
srv := NewServer(cfg, svc)
|
||||
|
||||
ts := httptest.NewServer(srv.Routes())
|
||||
defer ts.Close()
|
||||
|
||||
body, _ := json.Marshal(map[string]any{
|
||||
"task_key": "intake",
|
||||
"project_name": "resume-test",
|
||||
"backend": "stub",
|
||||
})
|
||||
req, _ := http.NewRequest(http.MethodPost, ts.URL+"/api/v1/tasks/run/stream", bytes.NewReader(body))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
req.Header.Set("Authorization", "Bearer "+testBearerToken(t, ts.URL, cfg))
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
t.Fatalf("post tasks run stream failed: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
events := readSSEEvents(t, resp)
|
||||
errEv := findEvent(events, stream.EventError)
|
||||
if errEv == nil {
|
||||
t.Fatalf("expected event:error in stream, got %d events", len(events))
|
||||
}
|
||||
if errEv.ErrorInfo == nil {
|
||||
t.Fatal("error_info is nil")
|
||||
}
|
||||
if errEv.ErrorInfo.Class != stream.ErrorClassResumable {
|
||||
t.Fatalf("class=%q want resumable (upstream=%q)", errEv.ErrorInfo.Class, errEv.ErrorInfo.Upstream)
|
||||
}
|
||||
if errEv.ErrorInfo.WorkspaceID == "" {
|
||||
t.Fatal("workspace_id should be populated for resumable errors")
|
||||
}
|
||||
if !hasAction(errEv.ErrorInfo.Actions, "continue") || !hasAction(errEv.ErrorInfo.Actions, "restart") {
|
||||
t.Fatalf("actions=%v want [continue restart]", errEv.ErrorInfo.Actions)
|
||||
}
|
||||
}
|
||||
|
||||
// TestTaskStream_MaterialsInjection 验证前端传入的 materials(Base64 编码的附件内容)
|
||||
// 能被后端 HTTP handler 正确反序列化,透传给 ExecuteTask,并写入工作区的 materials_text/ 目录
|
||||
func TestTaskStream_MaterialsInjection(t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user