8 "github.com/stretchr/testify/require"
11 func TestTelegramVoiceNotesReachTheAgentAsStoredText(t *testing.T) {
12 server := newModelFake(t)
13 test := newTestTurnLoop(t, server)
14 telegram := newTelegramFake(t)
15 bot, logs := telegramStartTestBot(t, telegram)
16 _, bot.voice = voiceTestInput(t, voiceTestScript)
17 audio := []byte("made-up Telegram voice")
18 telegram.Image("voice", audio)
20 message := telegramOwnerMessage("")
21 message.Voice = &TelegramVoice{FileID: "voice"}
22 message.Caption = "A voice caption."
23 require.NoError(t, bot.handle(t.Context(), test.loop, nil, TelegramUpdate{Message: message}))
24 test.events.WaitFor(t, "idle", 1)
26 logged, err := test.memory.Message(0)
27 require.NoError(t, err)
28 require.Contains(t, logged.Text, "[voice ")
29 require.Contains(t, logged.Text, "A made-up voice transcript.\nA voice caption.")
31 files, err := os.ReadDir(test.agent.Voices().dir)
32 require.NoError(t, err)
33 require.Len(t, files, 1)
35 saved, err := os.ReadFile(filepath.Join(test.agent.Voices().dir, files[0].Name()))
36 require.NoError(t, err)
37 require.Equal(t, audio, saved)
38 require.Contains(t, string(server.Call(0).raw), "A made-up voice transcript.")
39 require.NotContains(t, logs.String(), "A made-up")
40 require.NotContains(t, logs.String(), "A voice caption")
43 func TestTelegramVoiceFailuresKeepFollowingTextMoving(t *testing.T) {
44 testCases := []struct {
51 name: "oversize metadata prevents a download",
52 size: voiceMaxBytes + 1,
54 marker: "(voice not downloaded)",
57 name: "download failure becomes text",
59 marker: "(voice not downloaded)",
62 name: "missing model preserves stored audio",
64 marker: "transcriber or model is not available",
68 for _, tc := range testCases {
69 t.Run(tc.name, func(t *testing.T) {
70 test := newTestTurnLoop(t, newModelFake(t))
71 telegram := newTelegramFake(t)
72 bot, _ := telegramStartTestBot(t, telegram)
73 bot.voice.config.Model = filepath.Join(t.TempDir(), "missing")
75 telegram.Image("voice", []byte("made-up voice"))
77 message := telegramOwnerMessage("")
78 message.Voice = &TelegramVoice{
82 require.NoError(t, bot.handle(t.Context(), test.loop, nil, TelegramUpdate{Message: message}))
83 require.NoError(t, bot.handle(t.Context(), test.loop, nil, TelegramUpdate{Message: telegramOwnerMessage("Next text.")}))
84 require.NoError(t, test.loop.Flush(t.Context()))
86 logged, err := test.memory.Message(0)
87 require.NoError(t, err)
88 require.Contains(t, logged.Text, tc.marker)
91 for n := 0; n < test.memory.Len(); n++ {
92 logged, err = test.memory.Message(n)
93 require.NoError(t, err)
95 found = found || logged.Text == "Next text."
98 require.True(t, found)
103 func TestTelegramIgnoresVoiceNotesFromOtherSenders(t *testing.T) {
104 test := newTestTurnLoop(t, newModelFake(t))
105 telegram := newTelegramFake(t)
106 bot, _ := telegramStartTestBot(t, telegram)
107 message := telegramOwnerMessage("")
108 message.Voice = &TelegramVoice{FileID: "voice"}
110 require.NoError(t, bot.handle(t.Context(), test.loop, nil, TelegramUpdate{Message: message}))
111 require.Empty(t, telegram.Calls())
112 require.Zero(t, test.memory.Len())