]> git.giacomolli.uk - onechat/blob - telegram_voice_test.go
ee5ee3fd35af1d99b5114185596c098ad6b3e603
[onechat] / telegram_voice_test.go
1 package main
2
3 import (
4 "os"
5 "path/filepath"
6 "testing"
7
8 "github.com/stretchr/testify/require"
9 )
10
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)
19
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)
25
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.")
30
31 files, err := os.ReadDir(test.agent.Voices().dir)
32 require.NoError(t, err)
33 require.Len(t, files, 1)
34
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")
41 }
42
43 func TestTelegramVoiceFailuresKeepFollowingTextMoving(t *testing.T) {
44 testCases := []struct {
45 name string
46 size int64
47 file string
48 marker string
49 }{
50 {
51 name: "oversize metadata prevents a download",
52 size: voiceMaxBytes + 1,
53 file: "voice",
54 marker: "(voice not downloaded)",
55 },
56 {
57 name: "download failure becomes text",
58 file: "absent",
59 marker: "(voice not downloaded)",
60 },
61 {
62 name: "missing model preserves stored audio",
63 file: "voice",
64 marker: "transcriber or model is not available",
65 },
66 }
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")
73
74 telegram.Image("voice", []byte("made-up voice"))
75
76 message := telegramOwnerMessage("")
77 message.Voice = &TelegramVoice{
78 FileID: tc.file,
79 FileSize: tc.size,
80 }
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()))
84
85 logged, err := test.memory.Message(0)
86 require.NoError(t, err)
87 require.Contains(t, logged.Text, tc.marker)
88
89 found := false
90 for n := 0; n < test.memory.Len(); n++ {
91 logged, err = test.memory.Message(n)
92 require.NoError(t, err)
93
94 found = found || logged.Text == "Next text."
95 }
96
97 require.True(t, found)
98 })
99 }
100 }
101
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"}
108 message.From.ID++
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())
112 }