f7442c3aea
Formatting only: import order, and statements that were packed onto one line split out. `git diff -w` shows nothing but that. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CGeSZxh1DCtRxmFVSYVGvJ
70 lines
2.2 KiB
Go
70 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/kami/maven/internal/llm"
|
|
"github.com/kami/maven/internal/router"
|
|
"github.com/kami/maven/internal/voice"
|
|
)
|
|
|
|
type mockCompleter struct {
|
|
out string
|
|
err error
|
|
}
|
|
|
|
func (m mockCompleter) Complete(_ context.Context, _ llm.Req) (string, error) { return m.out, m.err }
|
|
|
|
func TestLLMReplierReturnsLLMReply(t *testing.T) {
|
|
r := newLLMReplier(mockCompleter{out: `{"response":"записала, кофе закончился","mood":"neutral"}`})
|
|
got := r.Reply(router.Decision{Intent: router.IntentNote, Slots: router.Slots{Text: "кофе закончился"}})
|
|
if got != "записала, кофе закончился" {
|
|
t.Errorf("got %q, want %q", got, "записала, кофе закончился")
|
|
}
|
|
}
|
|
|
|
func TestLLMReplierFallsBackToPlainText(t *testing.T) {
|
|
r := newLLMReplier(mockCompleter{out: "записала, кофе закончился"})
|
|
got := r.Reply(router.Decision{Intent: router.IntentNote, Slots: router.Slots{Text: "кофе закончился"}})
|
|
if got != "записала, кофе закончился" {
|
|
t.Errorf("got %q, want %q", got, "записала, кофе закончился")
|
|
}
|
|
}
|
|
|
|
func TestLLMReplierFallsBackToStubOnError(t *testing.T) {
|
|
r := newLLMReplier(mockCompleter{err: errTestLLMDown})
|
|
noteDec := router.Decision{Intent: router.IntentNote}
|
|
got := r.Reply(noteDec)
|
|
want := voice.NewStubReplier().Reply(noteDec)
|
|
if got != want {
|
|
t.Errorf("on llm error: got %q, want stub %q", got, want)
|
|
}
|
|
}
|
|
|
|
func TestLLMReplierFallsBackToStubOnEmpty(t *testing.T) {
|
|
r := newLLMReplier(mockCompleter{out: ""})
|
|
noteDec := router.Decision{Intent: router.IntentNote}
|
|
got := r.Reply(noteDec)
|
|
want := voice.NewStubReplier().Reply(noteDec)
|
|
if got != want {
|
|
t.Errorf("on empty llm: got %q, want stub %q", got, want)
|
|
}
|
|
}
|
|
|
|
func TestLLMReplierClarifyUsesStub(t *testing.T) {
|
|
r := newLLMReplier(mockCompleter{out: "я всё поняла"})
|
|
clarifyDec := router.Decision{Clarify: true}
|
|
got := r.Reply(clarifyDec)
|
|
want := voice.NewStubReplier().Reply(clarifyDec)
|
|
if got != want {
|
|
t.Errorf("on clarify: got %q, want stub %q", got, want)
|
|
}
|
|
}
|
|
|
|
var errTestLLMDown = errTest("llm down")
|
|
|
|
type errTest string
|
|
|
|
func (e errTest) Error() string { return string(e) }
|