- configs package embeds agents/ + shared/ prompt assets; templates package embeds xlsx/ (cdo_quote.xlsx) - template.GetAgentInstructionFile: disk-first with embedded fallback for instructions and writing.md (dev behavior unchanged) - quote.CalculateAndFill: embedded xlsx fallback when the on-disk template walk misses (single-binary deployments) - presence test guards the embedded asset set - verified: vet + template/quote/bizdev/squad/arch green
93 lines
2.9 KiB
Go
93 lines
2.9 KiB
Go
package template_test
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"chat-agent-system/configs"
|
|
"chat-agent-system/internal/template"
|
|
"chat-agent-system/templates"
|
|
)
|
|
|
|
func TestLoadDocTemplatesAndAgents(t *testing.T) {
|
|
tmpl, err := template.GetDocTemplate("intake")
|
|
if err != nil {
|
|
t.Fatalf("failed to load intake template: %v", err)
|
|
}
|
|
if !strings.Contains(tmpl, "用户初始需求收集表") {
|
|
t.Errorf("template intake.md missing title header")
|
|
}
|
|
if !strings.Contains(tmpl, "写满四段式") {
|
|
t.Errorf("template intake.md missing self-describing guidance '写满四段式'")
|
|
}
|
|
|
|
inst, err := template.GetAgentInstruction("leader")
|
|
if err != nil {
|
|
t.Fatalf("failed to load leader agent instructions: %v", err)
|
|
}
|
|
if !strings.Contains(inst, "商务对接负责人") {
|
|
t.Errorf("leader.md missing expected role definition")
|
|
}
|
|
|
|
rendered := template.RenderDoc(tmpl, map[string]string{
|
|
"project_name": "测试手术机器人",
|
|
"customer_name": "水木医疗",
|
|
})
|
|
if !strings.Contains(rendered, "测试手术机器人") {
|
|
t.Errorf("render failed to replace project_name")
|
|
}
|
|
if !strings.Contains(rendered, "水木医疗") {
|
|
t.Errorf("render failed to replace customer_name")
|
|
}
|
|
}
|
|
|
|
func TestGetDocTemplate_PrelimDesignOfficialNotStub(t *testing.T) {
|
|
tmpl, err := template.GetDocTemplate("prelim_design")
|
|
if err != nil {
|
|
t.Fatalf("prelim_design must load from embed/disk: %v", err)
|
|
}
|
|
if !strings.Contains(tmpl, "系统初步设计方案") {
|
|
t.Fatalf("official prelim_design title missing")
|
|
}
|
|
if !strings.Contains(tmpl, "```mermaid") {
|
|
t.Fatalf("official prelim_design must keep mermaid context diagram")
|
|
}
|
|
if strings.Contains(tmpl, "## 1. 结论") && strings.Contains(tmpl, "待确认") && !strings.Contains(tmpl, "子系统划分") {
|
|
t.Fatalf("must not fall back to two-section stub")
|
|
}
|
|
}
|
|
|
|
func TestGetDocTemplate_WorksWithoutDiskCheckout(t *testing.T) {
|
|
t.Chdir(t.TempDir())
|
|
for _, key := range []string{"intake", "prelim_design", "research"} {
|
|
tmpl, err := template.GetDocTemplate(key)
|
|
if err != nil {
|
|
t.Fatalf("%s must resolve from embed when cwd has no templates/: %v", key, err)
|
|
}
|
|
if strings.TrimSpace(tmpl) == "" {
|
|
t.Fatalf("%s embed was empty", key)
|
|
}
|
|
}
|
|
}
|
|
|
|
// TestEmbeddedPromptAssetsPresent 校验 U10a 内嵌资产齐备(单文件部署回退源)。
|
|
// embed 在编译期捕获源码树,这里防止资产被意外移出嵌入范围。
|
|
func TestEmbeddedPromptAssetsPresent(t *testing.T) {
|
|
for _, name := range []string{"agents/leader.md", "agents/engineer.md", "shared/writing.md"} {
|
|
b, err := configs.Assets.ReadFile(name)
|
|
if err != nil {
|
|
t.Fatalf("embedded configs asset %s: %v", name, err)
|
|
}
|
|
if len(b) == 0 {
|
|
t.Fatalf("embedded configs asset %s is empty", name)
|
|
}
|
|
}
|
|
xl, err := templates.XlsxAssets.ReadFile("xlsx/cdo_quote.xlsx")
|
|
if err != nil {
|
|
t.Fatalf("embedded xlsx asset: %v", err)
|
|
}
|
|
if len(xl) == 0 {
|
|
t.Fatal("embedded xlsx asset is empty")
|
|
}
|
|
}
|