Files

64 lines
2.1 KiB
Go

package ctxmgr_test
import (
"context"
"testing"
"time"
"chat-agent-system/internal/ctxmgr"
)
func TestContextManager_ChatHistoryAndSessionRestoration(t *testing.T) {
mgr := ctxmgr.NewContextManager(nil, nil, ctxmgr.DefaultTimeDecayConfig())
ctx := context.Background()
sessID := "sess_history_test_001"
userID := int64(101)
// 1. 模拟记录多轮会话
_ = mgr.RecordUserMessage(ctx, sessID, userID, "user", "我想了解超声手术刀注册审批要求", "QUERY_PROGRESS", "PREEMPT", nil)
time.Sleep(10 * time.Millisecond)
_ = mgr.RecordUserMessage(ctx, sessID, 0, "assistant", "超声软组织切割设备通常按二类或三类申报,需执行GB 9706.1-2020", "ADVISOR_BRIEF", "EXPECTATION_HIT", nil)
time.Sleep(10 * time.Millisecond)
_ = mgr.RecordUserMessage(ctx, sessID, userID, "user", "帮我查查大致工期和报价", "SUPPLEMENT_INFO", "EXPECTATION_HIT", nil)
// 2. 分页查询历史消息
msgs, err := mgr.GetChatHistory(ctx, sessID, 10, 0)
if err != nil {
t.Fatalf("GetChatHistory failed: %v", err)
}
if len(msgs) != 3 {
t.Fatalf("expected 3 messages, got %d", len(msgs))
}
if msgs[0].Content != "我想了解超声手术刀注册审批要求" {
t.Errorf("unexpected first message: %s", msgs[0].Content)
}
// 3. 查询会话列表
sessions, err := mgr.ListChatSessions(ctx, ctxmgr.SessionFilter{UserID: userID, Limit: 10})
if err != nil {
t.Fatalf("ListChatSessions failed: %v", err)
}
if len(sessions) != 1 {
t.Fatalf("expected 1 session, got %d", len(sessions))
}
if sessions[0].SessionID != sessID || sessions[0].MessageCount != 3 {
t.Errorf("session summary mismatch: %+v", sessions[0])
}
// 4. 从历史中恢复上下文与消息队列
restored, err := mgr.RestoreSessionContext(ctx, sessID)
if err != nil {
t.Fatalf("RestoreSessionContext failed: %v", err)
}
if restored == nil {
t.Fatalf("restored context is nil")
}
if len(restored.Messages) != 3 {
t.Fatalf("restored chat messages expected 3, got %d", len(restored.Messages))
}
if restored.Messages[2].Content != "帮我查查大致工期和报价" {
t.Errorf("unexpected last message: %s", restored.Messages[2].Content)
}
}