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.
128 lines
3.4 KiB
Go
128 lines
3.4 KiB
Go
// 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)
|
||
}
|
||
}
|