test: align official bd_intake task key and scoped task-run fixtures
Official main.v2 uses bd_intake (not intake); stage gates stayed closed when fixtures approved the wrong task key. Task-run finalizers also require a real project_id for outbox event scope—seed scoped projects in PG fixtures. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -113,14 +113,14 @@ func TestChatHistoryRefresh_PG_PreActivationAndTaskScope(t *testing.T) {
|
||||
}
|
||||
|
||||
instSvc := projectinstance.NewService(projectinstance.NewStore(pool), nil, nil, nil)
|
||||
taskScope, err := instSvc.ResolveMessageScopeForTask(ctx, projectID, "intake")
|
||||
taskScope, err := instSvc.ResolveMessageScopeForTask(ctx, projectID, "bd_intake")
|
||||
if err != nil {
|
||||
t.Fatalf("resolve task scope: %v", err)
|
||||
}
|
||||
taskUserMeta := map[string]any{"project_id": projectID, "task_key": "intake", "client_turn_id": "turn-doc-1"}
|
||||
taskUserMeta := map[string]any{"project_id": projectID, "task_key": "bd_intake", "client_turn_id": "turn-doc-1"}
|
||||
projectinstance.ApplyScopeToMetadata(taskUserMeta, taskScope)
|
||||
_, _ = ctxMgr.RecordUserMessageWithID(ctx, sessID, creatorID, "user", "请生成 intake 文档", "TRIGGER_TASK", "", taskUserMeta)
|
||||
taskAsstMeta := map[string]any{"project_id": projectID, "task_key": "intake", "task_status": "completed"}
|
||||
taskAsstMeta := map[string]any{"project_id": projectID, "task_key": "bd_intake", "task_status": "completed"}
|
||||
projectinstance.ApplyScopeToMetadata(taskAsstMeta, taskScope)
|
||||
_, _ = ctxMgr.RecordUserMessageWithID(ctx, sessID, 0, "assistant", "文档已生成", "TRIGGER_TASK", "", taskAsstMeta)
|
||||
|
||||
|
||||
@@ -102,7 +102,7 @@ func setupPGProjectReadyToAdvance(t *testing.T, pool *pgxpool.Pool, handler http
|
||||
|
||||
docID := fmt.Sprintf("doc_p5_fault_%d", projectID)
|
||||
docEngine := bizdev.Snapshot(srv.BizdevService()).Gov
|
||||
_, _ = docEngine.CreateOrGetDocument(ctx, docID, projectID, "intake", "Intake", "V0.1", "", creatorID, "A", reviewerID, "R", approverID, "P")
|
||||
_, _ = docEngine.CreateOrGetDocument(ctx, docID, projectID, "bd_intake", "Intake", "V0.1", "", creatorID, "A", reviewerID, "R", approverID, "P")
|
||||
_ = docEngine.MarkDocumentContentUpdated(ctx, docID, "hash_p5_fault", false)
|
||||
_, _ = docEngine.SubmitForReview(ctx, docID, creatorID, "author", "Author")
|
||||
_, _ = docEngine.ReviewApprove(ctx, docID, reviewerID, "reviewer", "Reviewer", "ok")
|
||||
|
||||
@@ -48,6 +48,7 @@ func TestPhase5_RollingRestartReplay_PG(t *testing.T) {
|
||||
handler, srv := setupPGGovernanceServer(t, pool)
|
||||
token := loginTestUser(t, handler, "zhanggong", "123456")
|
||||
userID := fetchAuthUserID(t, handler, token)
|
||||
projectID := insertScopedTestProject(t, pool, userID, "pg-rolling")
|
||||
|
||||
store := taskrun.NewPGStore(pool)
|
||||
runID := "run_rolling_" + time.Now().Format("150405.000000")
|
||||
@@ -66,7 +67,7 @@ func TestPhase5_RollingRestartReplay_PG(t *testing.T) {
|
||||
})
|
||||
|
||||
record := &taskrun.RunRecord{
|
||||
RunID: runID, SessionID: "sess_roll", UserID: userID, TaskKey: "intake", Status: "running",
|
||||
RunID: runID, SessionID: "sess_roll", UserID: userID, ProjectID: projectID, TaskKey: "intake", Status: "running",
|
||||
}
|
||||
_, _ = srv.TaskRuns().CreateAndStart(context.Background(), runID, record, bizdev.TaskRunRequest{TaskKey: "intake"}, bizdev.StageRunRequest{}, "")
|
||||
t.Cleanup(func() {
|
||||
|
||||
@@ -25,6 +25,8 @@ func TestTaskRun_PersistenceAndReplayAfterRestart_PG(t *testing.T) {
|
||||
|
||||
handler, srv := setupPGGovernanceServer(t, pool)
|
||||
token := loginTestUser(t, handler, "zhanggong", "123456")
|
||||
userID := fetchAuthUserID(t, handler, token)
|
||||
projectID := insertScopedTestProject(t, pool, userID, "pg-persist")
|
||||
|
||||
runID := "run_pg_persist_" + time.Now().Format("150405")
|
||||
store := taskrun.NewPGStore(pool)
|
||||
@@ -45,8 +47,8 @@ func TestTaskRun_PersistenceAndReplayAfterRestart_PG(t *testing.T) {
|
||||
})
|
||||
|
||||
record := &taskrun.RunRecord{
|
||||
RunID: runID, SessionID: "sess_pg_persist", ProjectID: 0,
|
||||
UserID: fetchAuthUserID(t, handler, token), TaskKey: "intake", Status: "running",
|
||||
RunID: runID, SessionID: "sess_pg_persist", ProjectID: projectID,
|
||||
UserID: userID, TaskKey: "intake", Status: "running",
|
||||
}
|
||||
_, err := srv.TaskRuns().CreateAndStart(context.Background(), runID, record, bizdev.TaskRunRequest{TaskKey: "intake"}, bizdev.StageRunRequest{}, "")
|
||||
if err != nil {
|
||||
|
||||
@@ -41,6 +41,7 @@ func TestTaskRun_ResumeInterrupted_PG(t *testing.T) {
|
||||
handler := srv.Routes()
|
||||
token := loginTestUser(t, handler, "zhanggong", "123456")
|
||||
userID := fetchAuthUserID(t, handler, token)
|
||||
projectID := insertScopedTestProject(t, pool, userID, "pg-resume")
|
||||
|
||||
workDir := filepath.Join(cfg.DataDir, "workspaces", "bizdev", "resume_test")
|
||||
if err := os.MkdirAll(workDir, 0o755); err != nil {
|
||||
@@ -52,9 +53,9 @@ func TestTaskRun_ResumeInterrupted_PG(t *testing.T) {
|
||||
runID := "run_resume_" + time.Now().Format("150405.000000")
|
||||
_, err := pool.Exec(context.Background(), `
|
||||
INSERT INTO task_runs (
|
||||
run_id, session_id, user_id, task_key, status, workspace_id, error_message, created_at, updated_at
|
||||
) VALUES ($1, 'sess_resume', $2, 'intake', 'interrupted', $3, 'worker lease expired', now(), now())
|
||||
`, runID, userID, workDir)
|
||||
run_id, session_id, project_id, user_id, task_key, status, workspace_id, error_message, created_at, updated_at
|
||||
) VALUES ($1, 'sess_resume', $2, $3, 'intake', 'interrupted', $4, 'worker lease expired', now(), now())
|
||||
`, runID, projectID, userID, workDir)
|
||||
if err != nil {
|
||||
t.Fatalf("seed interrupted run: %v", err)
|
||||
}
|
||||
|
||||
@@ -162,3 +162,27 @@ func seedOfficialWorkflowManifest(t *testing.T, pool *pgxpool.Pool, workflowKey
|
||||
t.Fatalf("seed official workflow %s: %v", workflowKey, err)
|
||||
}
|
||||
}
|
||||
|
||||
// insertScopedTestProject creates a project row so task-run finalizers can emit
|
||||
// outbox events (Environment + ProjectID are both required by events.Validate).
|
||||
func insertScopedTestProject(t *testing.T, pool *pgxpool.Pool, creatorID int64, namePrefix string) int64 {
|
||||
t.Helper()
|
||||
if creatorID <= 0 {
|
||||
creatorID = 1
|
||||
}
|
||||
code := namePrefix + "-" + time.Now().Format("150405.000000")
|
||||
var projectID int64
|
||||
err := pool.QueryRow(context.Background(), `
|
||||
INSERT INTO projects (code, name, status, creator_user_id, lifecycle_status, active_workflow_key, workflow_selection_version, workflow_plan_revision)
|
||||
VALUES ($1, $2, 'active', $3, 'planning', '', 1, 0) RETURNING id
|
||||
`, code, namePrefix+" "+code, creatorID).Scan(&projectID)
|
||||
if err != nil {
|
||||
t.Fatalf("insert scoped project: %v", err)
|
||||
}
|
||||
_, _ = pool.Exec(context.Background(), `
|
||||
INSERT INTO project_members (project_id, user_id, project_role, status, joined_at, updated_at)
|
||||
VALUES ($1, $2, 'owner', 'active', now(), now()) ON CONFLICT DO NOTHING
|
||||
`, projectID, creatorID)
|
||||
t.Cleanup(func() { cleanupProject(t, pool, projectID) })
|
||||
return projectID
|
||||
}
|
||||
|
||||
@@ -220,7 +220,7 @@ func TestWorkflowGovernance_PG_ActivateApproveAdvanceChain(t *testing.T) {
|
||||
// 4. 文档批准链(经 bizdev DocGov 引擎,触发 onWorkflowDocumentApproved hook)
|
||||
docID := fmt.Sprintf("doc_pg_p5_intake_%d", projectID)
|
||||
docEngine := bizdev.Snapshot(srv.BizdevService()).Gov
|
||||
_, err = docEngine.CreateOrGetDocument(ctx, docID, projectID, "intake", "Intake Doc", "V0.1", "", creatorID, "Author", reviewerID, "Reviewer", approverID, "Approver")
|
||||
_, err = docEngine.CreateOrGetDocument(ctx, docID, projectID, "bd_intake", "Intake Doc", "V0.1", "", creatorID, "Author", reviewerID, "Reviewer", approverID, "Approver")
|
||||
if err != nil {
|
||||
t.Fatalf("create doc: %v", err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user