Files
Agent-System/internal/bizdev/task_result_status_test.go
weichen f8730791b9 fix(coordinator): 回填会话项目绑定,避免受控投影被跳过
聊天入口只把项目 ID 放在授权字段,协调器仍读空的 UserCtx.Project.ID,受控任务因此以 project_id=0 跳过账本投影,回复却称正文已保存。
2026-09-28 12:34:32 +00:00

125 lines
4.2 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package bizdev_test
import (
"strings"
"testing"
"chat-agent-system/internal/bizdev"
"chat-agent-system/internal/docgov"
"chat-agent-system/internal/squad"
)
func TestTaskRunResult_PendingConfirmation_NotCompleted(t *testing.T) {
res := &bizdev.TaskRunResult{
Success: true,
ArtifactTitle: "用户初始需求收集表",
TaskKey: "intake",
RequiresAuthorApproval: true,
PendingAgentCandidateID: 42,
PendingChangeReportID: 7,
PendingRiskLevel: "high",
PendingConfirmationNote: "高风险变更待编制人确认",
DocRecord: &docgov.DocumentRecord{DocID: "doc_proj1_intake", ContentSHA256: "abc"},
}
if res.TerminalStatus() != bizdev.TaskStatusPendingAuthorConfirmation {
t.Fatalf("status=%q", res.TerminalStatus())
}
if res.IsProposalIntercept() {
t.Fatal("pending agent must not look like DocGov proposal intercept")
}
sum := res.CompletionSummary()
if strings.Contains(sum, "已完成") || strings.Contains(sum, "正文已保存") {
t.Fatalf("pending summary must not claim completed/saved: %s", sum)
}
if !strings.Contains(sum, "文档候选已生成") || !strings.Contains(sum, "待编制人确认") {
t.Fatalf("pending summary missing confirmation wording: %s", sum)
}
art := res.ArtifactMetadata()
if art["doc_id"] != "doc_proj1_intake" {
t.Fatalf("artifact doc_id=%v", art["doc_id"])
}
if art["pending_agent_candidate_id"] != int64(42) {
t.Fatalf("pending candidate meta=%v", art["pending_agent_candidate_id"])
}
if art["awaiting_author_confirmation"] != true {
t.Fatal("expected awaiting_author_confirmation")
}
}
func TestTaskRunResult_ProposalIntercept_DistinctFromPendingAgent(t *testing.T) {
res := &bizdev.TaskRunResult{
Success: false,
RequiresAuthorApproval: true,
PendingProposal: &docgov.ChangeProposal{ProposalID: "prop_1"},
ErrorReason: "认领拦截",
}
if !res.IsProposalIntercept() {
t.Fatal("expected proposal intercept")
}
if res.AwaitsAgentConfirmation() {
t.Fatal("proposal must not look like agent pending confirmation")
}
if res.TerminalStatus() != bizdev.TaskStatusFailed {
t.Fatalf("status=%q", res.TerminalStatus())
}
}
func TestTaskRunResult_CompletedWithoutLedger_SaysNotProjected(t *testing.T) {
res := &bizdev.TaskRunResult{
Success: true,
ArtifactTitle: "调研报告",
TaskKey: "research",
}
sum := res.CompletionSummary()
if !strings.Contains(sum, "尚未写入受控文档账本") {
t.Fatalf("summary=%s", sum)
}
}
func TestTaskRunResult_CompletedOnlyWhenCommitted(t *testing.T) {
res := &bizdev.TaskRunResult{
Success: true,
ArtifactTitle: "报价核算表",
TaskKey: "quote",
QualityReport: nil,
DocRecord: &docgov.DocumentRecord{DocID: "doc_proj1_quote"},
}
if res.TerminalStatus() != bizdev.TaskStatusCompleted {
t.Fatalf("status=%q", res.TerminalStatus())
}
sum := res.CompletionSummary()
if !strings.Contains(sum, "已完成") {
t.Fatalf("completed summary: %s", sum)
}
}
// 现场:score=40 / quality_failed 不得映射 completed;Success 已清仍保持 quality_failed。
func TestTaskRunResult_QualityFailed_NotCompleted(t *testing.T) {
res := &bizdev.TaskRunResult{
Success: false,
ArtifactTitle: "用户初始需求收集表",
TaskKey: "intake",
QualityReport: &squad.QualityReport{
Passed: false,
Score: 40,
ProhibitedPhrases: []string{"不做展开", "从略", "篇幅有限"},
Violations: []string{"检测到正文中的省略/敷衍写法(须实质展开;自检勿复述禁用原词)"},
},
DocRecord: &docgov.DocumentRecord{DocID: "doc_proj6098_intake"},
}
if res.TerminalStatus() != bizdev.TaskStatusQualityFailed {
t.Fatalf("status=%q want quality_failed", res.TerminalStatus())
}
sum := res.CompletionSummary()
if strings.Contains(sum, "已完成") {
t.Fatalf("quality_failed summary must not claim completed: %s", sum)
}
if !strings.Contains(sum, "质量检查未通过") {
t.Fatalf("summary missing quality fail wording: %s", sum)
}
art := res.ArtifactMetadata()
if art["quality_passed"] != false {
t.Fatalf("quality_passed=%v", art["quality_passed"])
}
}