Files

112 lines
2.9 KiB
Go

package ctxmgr
import (
"context"
"testing"
"time"
)
func TestChatSearch_MemoryMode(t *testing.T) {
mgr := NewContextManager(nil, nil, DefaultTimeDecayConfig())
ctx := context.Background()
sessionID := "sess_test_search_001"
// 插入多条包含不同关键词和分类的消息
now := time.Now()
mgr.messages[sessionID] = []ChatMessageRecord{
{
ID: 1,
SessionID: sessionID,
Role: "user",
Content: "我们准备启动一款4K荧光内窥镜立项与预算测算,预计总投入200万",
DayKey: "2026-09-08",
Category: "task",
CreatedAt: now.Add(-48 * time.Hour),
},
{
ID: 2,
SessionID: sessionID,
Role: "assistant",
Content: "收到,立项预估200万预算中,光学镜头与主板BOM成本约占45%,其余为注册检测与临床试验费用",
DayKey: "2026-09-08",
Category: "consult",
CreatedAt: now.Add(-47 * time.Hour),
},
{
ID: 3,
SessionID: sessionID,
Role: "user",
Content: "下午与临床检验所对齐型检周期,GB 9706.1 电气安全摸底测试安排在下周三",
DayKey: "2026-09-09",
Category: "review",
CreatedAt: now.Add(-24 * time.Hour),
},
}
t.Run("搜索关键词命中", func(t *testing.T) {
hits, err := mgr.SearchChatMessages(ctx, ChatSearchQuery{
SessionID: sessionID,
Query: "200万",
Mode: SearchModeKeyword,
})
if err != nil {
t.Fatalf("search failed: %v", err)
}
if len(hits) != 2 {
t.Fatalf("expected 2 hits for '200万', got %d", len(hits))
}
if hits[0].MessageID != 2 || hits[1].MessageID != 1 {
t.Errorf("expected hits [2, 1], got [%d, %d]", hits[0].MessageID, hits[1].MessageID)
}
})
t.Run("按分类过滤", func(t *testing.T) {
hits, err := mgr.SearchChatMessages(ctx, ChatSearchQuery{
SessionID: sessionID,
Query: "200万",
Category: "task",
Mode: SearchModeKeyword,
})
if err != nil {
t.Fatalf("search with category failed: %v", err)
}
if len(hits) != 1 {
t.Fatalf("expected 1 hit for category task, got %d", len(hits))
}
if hits[0].MessageID != 1 {
t.Errorf("expected hit 1, got %d", hits[0].MessageID)
}
})
t.Run("按日期范围过滤", func(t *testing.T) {
hits, err := mgr.SearchChatMessages(ctx, ChatSearchQuery{
SessionID: sessionID,
Query: "测试",
DateFrom: "2026-09-09",
DateTo: "2026-09-09",
})
if err != nil {
t.Fatalf("search with date range failed: %v", err)
}
if len(hits) != 1 {
t.Fatalf("expected 1 hit on 2026-09-09, got %d", len(hits))
}
if hits[0].MessageID != 3 {
t.Errorf("expected hit 3, got %d", hits[0].MessageID)
}
})
t.Run("空关键词安全退出", func(t *testing.T) {
hits, err := mgr.SearchChatMessages(ctx, ChatSearchQuery{
SessionID: sessionID,
Query: " ",
})
if err != nil {
t.Fatalf("empty query error: %v", err)
}
if len(hits) != 0 {
t.Fatalf("expected 0 hits for empty query, got %d", len(hits))
}
})
}