Files
weichenandCursor 50c19aaee9 test(docgov): cover canonical task key collapse for project documents
锁定「7 份旧键本地克隆加 8 行服务端」收成 7 条 bd_*,以及列表与物化不再留下 intake 兄弟行。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-21 06:37:10 +00:00

94 lines
2.6 KiB
Go

package docgov_test
import (
"context"
"testing"
"chat-agent-system/internal/docgov"
)
func TestMaterializeTemplateDocsIdempotentAndSkipsRealContent(t *testing.T) {
ctx := context.Background()
engine := docgov.NewGovernanceEngine(nil)
specs := []docgov.TemplateDocSpec{{
TaskKey: "bd_intake",
Title: "用户初始需求收集表",
StageKey: "V0.1_triage",
Enabled: true,
DutyPolicy: "author_only",
AuthorUserID: 398,
AuthorName: "陈威",
ReviewerUserID: 398,
ApproverUserID: 398,
}, {
TaskKey: "bd_research",
Title: "调研报告",
Enabled: false,
}}
if err := engine.MaterializeTemplateDocs(ctx, 6579, specs); err != nil {
t.Fatal(err)
}
specs[0].AuthorName = "陈威"
if err := engine.MaterializeTemplateDocs(ctx, 6579, specs); err != nil {
t.Fatal(err)
}
docs, err := engine.ListWorkflowDocumentsByProject(ctx, 6579)
if err != nil {
t.Fatal(err)
}
if len(docs) != 1 {
t.Fatalf("documents=%d, want 1 enabled template", len(docs))
}
if docs[0].DocID != "doc_proj6579_bd_intake" || !docs[0].IsTemplateOnly || docs[0].AuthorID != 398 {
t.Fatalf("unexpected template doc: %+v", docs[0])
}
if docs[0].DutyPolicy != "author_only" {
t.Fatalf("duty policy=%q", docs[0].DutyPolicy)
}
const realID = "doc_proj6579_bd_intake"
if err := engine.MarkDocumentContentUpdated(ctx, realID, "abc", false); err != nil {
t.Fatal(err)
}
specs[0].AuthorUserID = 9
specs[0].AuthorName = "系统管理员"
specs[0].Title = "不应覆盖正文标题"
if err := engine.MaterializeTemplateDocs(ctx, 6579, specs); err != nil {
t.Fatal(err)
}
got, err := engine.GetDocument(ctx, realID)
if err != nil {
t.Fatal(err)
}
if got.IsTemplateOnly || got.AuthorID != 398 || got.Title != "用户初始需求收集表" {
t.Fatalf("real document was overwritten: %+v", got)
}
}
func TestMaterializeTemplateDocsSkipsCanonicalSibling(t *testing.T) {
ctx := context.Background()
engine := docgov.NewGovernanceEngine(nil)
if _, err := engine.CreateOrGetDocument(
ctx, "doc_proj70_intake", 70, "intake", "用户初始需求收集表", "V0.1", "",
1, "编制人", 0, "", 0, "",
); err != nil {
t.Fatal(err)
}
if err := engine.MaterializeTemplateDocs(ctx, 70, []docgov.TemplateDocSpec{{
TaskKey: "bd_intake",
Title: "用户初始需求收集表",
StageKey: "V0.1_triage",
Enabled: true,
}}); err != nil {
t.Fatal(err)
}
docs, err := engine.ListWorkflowDocumentsByProject(ctx, 70)
if err != nil {
t.Fatal(err)
}
if len(docs) != 1 || docs[0].DocID != "doc_proj70_intake" || docs[0].TaskKey != "intake" {
t.Fatalf("sibling bd_intake was inserted: %+v", docs)
}
}