Files
dobotai-platform/internal/qa/mode_routing_test.go
T

114 lines
3.9 KiB
Go

package qa
import (
"context"
"testing"
"gitea.zheromiku.top/Weknora/dobotai-platform/internal/core"
"gitea.zheromiku.top/Weknora/dobotai-platform/internal/reasoningmode"
"gitea.zheromiku.top/Weknora/dobotai-platform/internal/session"
)
type fakeReasoningFinalizer struct {
repo *memoryRepository
calls int
input reasoningmode.TurnCompletion
completion reasoningmode.Completion
}
func (f *fakeReasoningFinalizer) Complete(_ context.Context, input reasoningmode.TurnCompletion) (reasoningmode.Completion, error) {
f.calls++
f.input = input
f.repo.mu.Lock()
finished := len(f.repo.finishTurns)
f.repo.mu.Unlock()
if finished == 0 {
panic("reasoning completion ran before successful Turn persistence")
}
return f.completion, nil
}
func TestAgentOverrideUsesSameWeKnoraSessionAsDefaultAgent(t *testing.T) {
repo := newMemoryRepository()
client := &fakeWeKnora{}
service, err := New(repo, fixedResolver{}, client, session.GroupShared)
if err != nil {
t.Fatal(err)
}
base := core.QARequest{
TenantKey: "tenant", Channel: "dingtalk", ConversationType: core.ConversationDirect,
ExternalUserID: "staff-1", SenderName: "张三", Query: "第一问",
}
base.ExternalMessageID = "message-quick"
quick, err := service.Ask(context.Background(), base)
if err != nil {
t.Fatal(err)
}
base.ExternalMessageID = "message-reasoning"
base.Query = "继续深入分析"
base.AgentIDOverride = "agent-reasoning"
reasoning, err := service.Ask(context.Background(), base)
if err != nil {
t.Fatal(err)
}
if quick.WeKnoraSessionID == "" || reasoning.WeKnoraSessionID != quick.WeKnoraSessionID {
t.Fatalf("quick session=%q reasoning session=%q", quick.WeKnoraSessionID, reasoning.WeKnoraSessionID)
}
client.mu.Lock()
defer client.mu.Unlock()
if client.sessions != 1 || len(client.requests) != 2 {
t.Fatalf("sessions=%d requests=%d", client.sessions, len(client.requests))
}
if client.requests[0].AgentID != "agent-1" || client.requests[1].AgentID != "agent-reasoning" {
t.Fatalf("agent requests=%q,%q", client.requests[0].AgentID, client.requests[1].AgentID)
}
repo.mu.Lock()
defer repo.mu.Unlock()
if len(repo.finishTurns) != 2 || repo.finishTurns[0].AgentID != "agent-1" || repo.finishTurns[1].AgentID != "agent-reasoning" {
t.Fatalf("finished turns=%+v", repo.finishTurns)
}
if repo.finishTurns[0].SessionKey != repo.finishTurns[1].SessionKey {
t.Fatalf("session keys diverged: %q vs %q", repo.finishTurns[0].SessionKey, repo.finishTurns[1].SessionKey)
}
}
func TestReasoningCompletionDecoratesPersistedAndReturnedAnswer(t *testing.T) {
repo := newMemoryRepository()
client := &fakeWeKnora{}
finalizer := &fakeReasoningFinalizer{
repo: repo,
completion: reasoningmode.Completion{
RoundNumber: 8,
ShowHint: true,
},
}
service, err := New(repo, fixedResolver{}, client, session.GroupShared, WithReasoningModeFinalizer(finalizer))
if err != nil {
t.Fatal(err)
}
request := core.QARequest{
TenantKey: "tenant", Channel: "dingtalk", ConversationType: core.ConversationDirect,
ExternalUserID: "staff-1", ExternalMessageID: "message-mode-completion",
Query: "分析", AgentIDOverride: "agent-reasoning",
ReasoningExecution: string(reasoningmode.ExecutionReasoning),
}
result, err := service.Ask(context.Background(), request)
if err != nil {
t.Fatal(err)
}
if finalizer.calls != 1 || finalizer.input.TurnID == "" || finalizer.input.Answer != "answer" {
t.Fatalf("finalizer calls=%d input=%+v", finalizer.calls, finalizer.input)
}
want := "【智能推理模式】\n\nanswer\n\n💡 推理模式还剩2轮,到期将自动关闭,如需继续可发送 /think on 重置轮次"
if result.Answer != want {
t.Fatalf("result answer=%q want=%q", result.Answer, want)
}
repo.mu.Lock()
defer repo.mu.Unlock()
stored := repo.turns["tenant:dingtalk:message-mode-completion"]
if stored.Answer != result.Answer {
t.Fatalf("stored answer=%q result=%q", stored.Answer, result.Answer)
}
}