62 lines
2.0 KiB
Go
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)
|
|
}
|
|
}
|