Files

62 lines
2.0 KiB
Go

package ctxmgr
import (
"context"
"testing"
"time"
)
func TestRecategorizeMessages_MemoryMode(t *testing.T) {
mgr := NewContextManager(nil, nil, DefaultTimeDecayConfig())
ctx := context.Background()
sessID := "sess-recat-test"
// 构造测试数据:
// 1. 用户发送咨询请求 (intent=QUERY_REGULATIONS) -> 当前被错填或历史未填分类
now := time.Now()
_, _ = mgr.RecordUserMessageWithID(ctx, sessID, 1, "user", "请问NMPA注册要求", "QUERY_REGULATIONS", "", map[string]any{
"created_at": now,
})
// 2. 助手在 10s 后回复,由于历史数据缺失 turn_intent,被初始化成了 uncategorized
asstID, _ := mgr.RecordUserMessageWithID(ctx, sessID, 0, "assistant", "NMPA申报需准备以下资料...", "", "", map[string]any{
"created_at": now.Add(10 * time.Second),
"category_override": CategoryUncategorized, // 人为模拟历史错误分类
})
// 执行重分类
res, err := mgr.RecategorizeMessages(ctx, sessID)
if err != nil {
t.Fatalf("RecategorizeMessages failed: %v", err)
}
if res.TotalProcessed != 2 {
t.Errorf("expected 2 processed, got %d", res.TotalProcessed)
}
if res.TotalUpdated < 1 {
t.Errorf("expected at least 1 updated, got %d", res.TotalUpdated)
}
// 验证 assistant 消息已被回填为 consult
msgs := mgr.messages[sessID]
for _, m := range msgs {
if m.ID == asstID {
if m.Category != CategoryConsult {
t.Errorf("expected assistant message category to be %s, got %s", CategoryConsult, m.Category)
}
if m.Metadata["turn_intent"] != "QUERY_REGULATIONS" {
t.Errorf("expected turn_intent to be backfilled as QUERY_REGULATIONS, got %v", m.Metadata["turn_intent"])
}
}
}
// 再次执行,幂等性验证(不应产生任何新更新)
res2, err := mgr.RecategorizeMessages(ctx, sessID)
if err != nil {
t.Fatalf("RecategorizeMessages idempotent failed: %v", err)
}
if res2.TotalUpdated != 0 {
t.Errorf("expected 0 updated on second run, got %d", res2.TotalUpdated)
}
}