package services import ( "strings" "testing" ) // TestChatHistoryBudgetTrim 历史按字符预算裁剪:超预算时最旧被丢、标记注入。 // 通过构造超长历史走 RunAIChat 会因未启用而提前返回,这里直接测裁剪语义的独立函数化验证—— // 为可测性把裁剪抽成了 trimHistory。 func TestChatHistoryBudgetTrim(t *testing.T) { long := strings.Repeat("a", 15000) history := []ChatMessage{ {Role: "user", Content: long}, {Role: "assistant", Content: long}, {Role: "user", Content: "最后一句"}, } kept, truncated := trimHistory(history, 24000) if !truncated { t.Fatal("超出预算应标记 truncated") } if len(kept) != 2 { t.Fatalf("应保留最近 2 条(丢弃最旧的 15000 字条目),got %d", len(kept)) } if kept[0].Content != long || kept[len(kept)-1].Content != "最后一句" { t.Fatal("应保留最近的消息") } // 不超预算时全保留 small := []ChatMessage{{Role: "user", Content: "hi"}, {Role: "assistant", Content: "ok"}} kept2, truncated2 := trimHistory(small, 24000) if truncated2 || len(kept2) != 2 { t.Fatalf("小历史不应裁剪: %v %d", truncated2, len(kept2)) } }