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",
67 for _, tc := range testCases {
68 t.Run(tc.name, func(t *testing.T) {
69 test := newTestTurnLoop(t, newModelFake(t))
70 telegram := newTelegramFake(t)
71 bot, _ := telegramStartTestBot(t, telegram)
72 bot.voice.config.Model = filepath.Join(t.TempDir(), "missing")
74 telegram.Image("voice", []byte("made-up voice"))
76 message := telegramOwnerMessage("")
77 message.Voice = &TelegramVoice{
81 require.NoError(t, bot.handle(t.Context(), test.loop, nil, TelegramUpdate{Message: message}))
82 require.NoError(t, bot.handle(t.Context(), test.loop, nil, TelegramUpdate{Message: telegramOwnerMessage("Next text.")}))
83 require.NoError(t, test.loop.Flush(t.Context()))
85 logged, err := test.memory.Message(0)
86 require.NoError(t, err)
87 require.Contains(t, logged.Text, tc.marker)
90 for n := 0; n < test.memory.Len(); n++ {
91 logged, err = test.memory.Message(n)
92 require.NoError(t, err)
94 found = found || logged.Text == "Next text."
97 require.True(t, found)
102 func TestTelegramIgnoresVoiceNotesFromOtherSenders(t *testing.T) {
103 test := newTestTurnLoop(t, newModelFake(t))
104 telegram := newTelegramFake(t)
105 bot, _ := telegramStartTestBot(t, telegram)
106 message := telegramOwnerMessage("")
107 message.Voice = &TelegramVoice{FileID: "voice"}
109 require.NoError(t, bot.handle(t.Context(), test.loop, nil, TelegramUpdate{Message: message}))
110 require.Empty(t, telegram.Calls())
111 require.Zero(t, test.memory.Len())