Files
agent-desk-ng/internal/ai/rag/answer_test.go
mono 2f7a491666 feat: harden support, localize knowledge and add operator availability [skip ci]
Source-only publication of reviewed commit 64e96a7f423673dc29ad56485be9fc79bce8af1c.

Passed in isolation: focused frontend/backend tests, race checks, TypeScript typecheck, lint, Go compilation, Flowgram build, and deterministic SDK build/tests.

Not accepted as a production release: Next.js export/native assembly remains blocked by environment memory limits; browser interaction and MySQL staging acceptance remain unverified. No production server, database/schema, runtime configuration, deployment, release tag, or workflow execution was performed.

Expected source tree: 0a4a7528e9.
2026-10-16 15:21:42 +00:00

128 lines
3.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Modified in the independent AgentDesk fork: localized knowledge workflows and safe display errors.
package rag
import (
"context"
"testing"
"agent-desk/internal/pkg/i18nx"
"agent-desk/internal/models"
"agent-desk/internal/pkg/dto/response"
"agent-desk/internal/pkg/enums"
)
func TestBuildFallbackAnswer(t *testing.T) {
tests := []struct {
name string
mode enums.AIAgentFallbackMode
expected string
}{
{
name: "no answer",
mode: enums.AIAgentFallbackModeNoAnswer,
expected: "当前知识库暂无明确信息。",
},
{
name: "suggest retry",
mode: enums.AIAgentFallbackModeSuggestRetry,
expected: "当前知识库里没有找到足够明确的信息,你可以换个更具体的问法再试一次。",
},
}
for _, tt := range tests {
if got := buildFallbackAnswer(i18nx.WithLocale(context.Background(), i18nx.LocaleZhCN), tt.mode); got != tt.expected {
t.Fatalf("%s: expected %q, got %q", tt.name, tt.expected, got)
}
}
}
func TestGetAnswerStatusName(t *testing.T) {
if got := getAnswerStatusName(i18nx.WithLocale(context.Background(), i18nx.LocaleZhCN), enums.KnowledgeAnswerStatusNoAnswer); got != "无答案" {
t.Fatalf("expected no-answer label, got %q", got)
}
if got := getAnswerStatusName(i18nx.WithLocale(context.Background(), i18nx.LocaleZhCN), enums.KnowledgeAnswerStatusFallback); got != i18nx.Getf(i18nx.LocaleZhCN, "knowledge.labels.answer.3") {
t.Fatalf("expected fallback label, got %q", got)
}
}
func TestResolveRerankLimit(t *testing.T) {
tests := []struct {
name string
requestLimit int
defaultLimit int
expected int
}{
{
name: "request overrides default",
requestLimit: 3,
defaultLimit: 5,
expected: 3,
},
{
name: "default used when request missing",
requestLimit: 0,
defaultLimit: 5,
expected: 5,
},
{
name: "zero when both missing",
requestLimit: 0,
defaultLimit: 0,
expected: 0,
},
}
for _, tt := range tests {
if got := resolveRerankLimit(tt.requestLimit, tt.defaultLimit); got != tt.expected {
t.Fatalf("%s: expected %d, got %d", tt.name, tt.expected, got)
}
}
}
func TestResolveDefaultRerankLimit(t *testing.T) {
items := []models.KnowledgeBase{
{ID: 11, DefaultRerankLimit: 3},
{ID: 22, DefaultRerankLimit: 7},
{ID: 33, DefaultRerankLimit: 5},
}
if got := resolveDefaultRerankLimit(items); got != 7 {
t.Fatalf("expected max rerank limit 7, got %d", got)
}
}
func TestBuildKnowledgeCitations(t *testing.T) {
hits := []response.KnowledgeSearchResult{
{
DocumentID: 11,
DocumentTitle: "退款手册",
ChunkNo: 0,
Title: "退款说明",
SectionPath: "售后 > 退款说明",
Content: "退款申请提交后,预计1-3个工作日到账。",
Score: 0.91,
},
{
DocumentID: 11,
DocumentTitle: "退款手册",
ChunkNo: 0,
Title: "退款说明",
SectionPath: "售后 > 退款说明",
Content: "重复内容",
Score: 0.89,
},
}
citations := buildKnowledgeCitations(hits, 3)
if len(citations) != 1 {
t.Fatalf("expected 1 citation, got %d", len(citations))
}
if citations[0].DocumentID != 11 {
t.Fatalf("expected document id 11, got %d", citations[0].DocumentID)
}
if citations[0].SectionPath != "售后 > 退款说明" {
t.Fatalf("unexpected section path: %q", citations[0].SectionPath)
}
}