112 lines
2.9 KiB
Go
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))
|
|
}
|
|
})
|
|
}
|