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"}`}, nil) 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: "записала, кофе закончился"}, nil) 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}, nil) 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: ""}, nil) 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: "я всё поняла"}, nil) 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) }