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) } }