Files
agent-bot 2c75dcaf69
CI / go-vet (pull_request) Successful in 13s
CI / short-tests-report (pull_request) Failing after 35s
CI / backup-restore-drill (pull_request) Successful in 36s
CI / web (pull_request) Successful in 32s
refactor(squad): AssetProvider port replaces direct template dependency
KTD1 fifth step (behavior preserved):
- squad.AssetProvider{DocTemplate,RenderDoc,AgentInstruction,
  AgentInstructionFile} injected via Options.Assets into Service,
  WorkspaceEngine and AdaptivePlanner
- bizdev templateAssetProvider maps port to internal/template (assembly side)
- nil-provider paths degrade to the same fallbacks the old error branches
  used (placeholder template, role header) — fail-visible, no guessing
- squad -> template import eliminated; arch edge moved bizdev->template
- verified: build/vet/arch green, squad+bizdev short tests pass
2026-09-29 06:29:51 +00:00

84 lines
2.3 KiB
Go

package squad_test
import (
"os"
"path/filepath"
"strings"
"testing"
"chat-agent-system/internal/squad"
)
func TestContextManager_InjectAndFormat(t *testing.T) {
tmpDir := t.TempDir()
engine := squad.NewWorkspaceEngine(nil)
ws, err := engine.PrepareWorkspace(squad.WorkspacePrepareRequest{
WorkDir: tmpDir,
TaskKey: "research",
StageTitle: "技术与市场调研报告",
ProjectName: "微创吻合器",
CustomerName: "水木测试医疗",
Materials: []squad.MaterialItem{
{Filename: "PIR.docx.txt", Content: []byte("客户要求符合YY 9706.210标准,具备双通道输出。")},
},
KnowledgeHits: []squad.KnowledgeHit{
{
DocCode: "GB 9706.1-2020",
Category: "standards",
Title: "医用电气设备",
Content: "防电击与基本性能通用要求",
Source: "法规知识库",
},
},
PriorDocs: []squad.PriorDocItem{
{
DocKey: "BD-INTAKE",
Title: "用户初始需求收集表",
Filename: "BD-INTAKE.md",
Content: "# 用户初始需求收集表\n\n已锁定客户为水木测试医疗。\n",
Stage: "intake",
},
},
})
if err != nil {
t.Fatalf("PrepareWorkspace failed: %v", err)
}
cm := squad.NewContextManager()
// 1. 验证 LoadContextIndex
idx, err := cm.LoadContextIndex(ws.WorkDir)
if err != nil {
t.Fatalf("LoadContextIndex failed: %v", err)
}
if len(idx.Items) < 4 {
t.Errorf("expected at least 4 context items, got %d", len(idx.Items))
}
// 2. 验证 context/README.md 包含权威度说明
readmePath := filepath.Join(ws.WorkDir, "context", "README.md")
readmeContent, err := os.ReadFile(readmePath)
if err != nil {
t.Fatalf("read context/README.md failed: %v", err)
}
if !strings.Contains(string(readmeContent), "authoritative") {
t.Errorf("README.md missing 'authoritative' level")
}
// 3. 验证 FormatPromptContext 能为专员生成清晰的上下文导引
navPrompt, err := cm.FormatPromptContext(ws.WorkDir, "writer")
if err != nil {
t.Fatalf("FormatPromptContext failed: %v", err)
}
if !strings.Contains(navPrompt, "微创吻合器") {
t.Errorf("navPrompt missing ProjectName")
}
if !strings.Contains(navPrompt, "PIR.docx.txt") {
t.Errorf("navPrompt missing material reference PIR.docx.txt")
}
if !strings.Contains(navPrompt, "GB 9706.1-2020") {
t.Errorf("navPrompt missing standard reference GB 9706.1-2020")
}
}