82 lines
2.4 KiB
Go
82 lines
2.4 KiB
Go
package dingtalk
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"gitea.zheromiku.top/Weknora/dobotai-platform/internal/core"
|
|
"gitea.zheromiku.top/Weknora/dobotai-platform/internal/reasoningmode"
|
|
)
|
|
|
|
type fakeReasoningRouter struct {
|
|
called bool
|
|
message ReasoningMessage
|
|
decision ReasoningDecision
|
|
err error
|
|
}
|
|
|
|
func (f *fakeReasoningRouter) Prepare(_ context.Context, message ReasoningMessage) (ReasoningDecision, error) {
|
|
f.called = true
|
|
f.message = message
|
|
return f.decision, f.err
|
|
}
|
|
|
|
func TestReasoningControlCommandBypassesQA(t *testing.T) {
|
|
qa := &fakeQA{}
|
|
reply := &fakeReply{}
|
|
router := &fakeReasoningRouter{decision: ReasoningDecision{Handled: true, Reply: "mode enabled"}}
|
|
handler, err := NewHandlerWithOptions(
|
|
TenantConfig{TenantKey: "tenant-a", Channel: "dingtalk"},
|
|
qa,
|
|
reply,
|
|
HandlerOptions{ReasoningRouter: router},
|
|
)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
callback := directTextCallback()
|
|
callback.Text = "/think on"
|
|
if err = handler.Handle(context.Background(), callback); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !router.called || router.message.StaffID != "staff-123" || router.message.Text != "/think on" {
|
|
t.Fatalf("router=%+v", router)
|
|
}
|
|
if qa.called {
|
|
t.Fatal("reasoning control command must bypass QA")
|
|
}
|
|
if !reply.called || reply.lastText != "mode enabled" {
|
|
t.Fatalf("reply=%+v", reply)
|
|
}
|
|
}
|
|
|
|
func TestReasoningRouteAppliesQueryAgentAndExecutionToQARequest(t *testing.T) {
|
|
qa := &fakeQA{result: core.QAResult{TurnID: "turn-1", AnswerMessageID: "answer-1", Answer: "结果"}}
|
|
reply := &fakeReply{}
|
|
router := &fakeReasoningRouter{decision: ReasoningDecision{
|
|
Query: "分析根因", AgentID: "builtin-smart-reasoning",
|
|
Execution: reasoningmode.ExecutionReasoningSingle, Expired: true,
|
|
}}
|
|
handler, err := NewHandlerWithOptions(
|
|
TenantConfig{TenantKey: "tenant-a", Channel: "dingtalk"},
|
|
qa,
|
|
reply,
|
|
HandlerOptions{ReasoningRouter: router},
|
|
)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
callback := directTextCallback()
|
|
callback.Text = "/think 分析根因"
|
|
if err = handler.Handle(context.Background(), callback); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !qa.called {
|
|
t.Fatal("single-turn reasoning must call QA")
|
|
}
|
|
if qa.lastReq.Query != "分析根因" || qa.lastReq.AgentIDOverride != "builtin-smart-reasoning" ||
|
|
qa.lastReq.ReasoningExecution != string(reasoningmode.ExecutionReasoningSingle) || !qa.lastReq.ReasoningExpired {
|
|
t.Fatalf("QA request=%+v", qa.lastReq)
|
|
}
|
|
}
|