"os"
"path/filepath"
"slices"
+ "strconv"
"strings"
"testing"
"time"
require.Empty(t, telegram.Sent())
require.NotContains(t, terminal.Output(), "secret")
require.NotContains(t, logs.String(), "secret")
- require.Contains(t, logs.String(), "update ignored")
+ require.Contains(t, logs.String(), "a Telegram message is ignored")
}
func TestBotAnswersThatOnlyTextIsSupported(t *testing.T) {
require.Equal(t, []string{"hello"}, telegram.Sent())
require.Len(t, telegram.Calls(), 2)
- require.Contains(t, logs.String(), "no valid answer")
+ require.Contains(t, logs.String(), "cannot send replies to Telegram: no answer in 50ms (next try in 1ms)\n")
+ require.Contains(t, logs.String(), "replies go to Telegram again, after ")
+ require.Equal(t, 2, strings.Count(logs.String(), "\n"))
require.NotContains(t, logs.String(), telegramTestToken)
}
always bool
methods []string
sent []string
+ lines int
logText string
}{
{
always: true,
methods: []string{"sendRichMessage", "sendMessage"},
sent: []string{"a secret word"},
- logText: "rich message refused",
+ lines: 1,
+ logText: "Telegram refused its full formatting",
},
{
name: "unknown method sends the reply once with entities",
always: true,
methods: []string{"sendRichMessage", "sendMessage"},
sent: []string{"a secret word"},
- logText: "rich message refused",
+ lines: 1,
+ logText: "Telegram refused its full formatting",
},
{
name: "rate limit tries the rich message again",
status: http.StatusTooManyRequests,
methods: []string{"sendRichMessage", "sendRichMessage"},
sent: []string{"a **secret** word"},
- logText: "answered 429",
+ lines: 2,
+ logText: "cannot send replies to Telegram: Telegram answered 429",
},
{
name: "server error tries the rich message again",
status: http.StatusInternalServerError,
methods: []string{"sendRichMessage", "sendRichMessage"},
sent: []string{"a **secret** word"},
- logText: "answered 500",
+ lines: 2,
+ logText: "cannot send replies to Telegram: Telegram answered 500",
},
{
name: "other refusal drops the reply",
status: http.StatusForbidden,
always: true,
methods: []string{"sendRichMessage"},
- logText: "message dropped",
+ lines: 1,
+ logText: "a reply to Telegram is lost: Telegram answered 403",
},
}
require.Equal(t, tc.methods, methods)
require.Equal(t, tc.sent, telegram.Sent())
- require.Equal(t, 1, strings.Count(logs.String(), "\n"))
+ require.Equal(t, tc.lines, strings.Count(logs.String(), "\n"))
require.Contains(t, logs.String(), tc.logText)
require.NotContains(t, logs.String(), telegramTestToken)
require.NotContains(t, logs.String(), "secret word")
require.Nil(t, calls[1].params["entities"])
require.Equal(t, []string{"a secret word"}, telegram.Sent())
require.Equal(t, 1, strings.Count(logs.String(), "\n"))
- require.Contains(t, logs.String(), "entities refused")
+ require.Contains(t, logs.String(), "a reply goes as plain text, because Telegram refused its formatting")
require.NotContains(t, logs.String(), telegramTestToken)
require.NotContains(t, logs.String(), "secret word")
}
daemonStartTestWithBot(t, newModelFake(t), bot)
require.Eventually(t, func() bool {
- return strings.Count(logs.String(), "no valid answer") >= 2
+ return strings.Contains(logs.String(), "cannot get messages from Telegram: no answer: ")
}, 10*time.Second, time.Millisecond)
require.NotContains(t, logs.String(), telegramTestToken)
}
+func TestBotLogsAnOutageOnlyAtItsStartAndEnd(t *testing.T) {
+ server := newModelFake(t)
+ server.reply = func(w http.ResponseWriter, call ModelFakeCall) {
+ modelWriteEvents(w, modelCompletedEvent([]any{modelMessageItem("ok")}, 100, 0, 5))
+ }
+
+ telegram := newTelegramFake(t)
+ failures := 5
+ telegram.fail = func(call TelegramFakeCall) (int, string) {
+ if call.method != "getUpdates" || failures == 0 {
+ return 0, ""
+ }
+
+ failures--
+
+ return http.StatusBadGateway, "Bad Gateway"
+ }
+
+ bot, logs := telegramStartTestBot(t, telegram)
+ daemonStartTestWithBot(t, server, bot)
+
+ telegram.Add(TelegramUpdate{
+ UpdateID: 1,
+ Message: telegramOwnerMessage("a secret word"),
+ })
+
+ telegramWaitForSent(t, telegram, "ok")
+ lines := strings.Split(strings.TrimSuffix(logs.String(), "\n"), "\n")
+ require.Len(t, lines, 2)
+ require.Equal(t, "cannot get messages from Telegram: Telegram answered 502 Bad Gateway (next try in 1ms)", lines[0])
+ require.Regexp(t, `^messages from Telegram come again, after [0-9]+m?s$`, lines[1])
+ require.NotContains(t, logs.String(), "secret word")
+ require.NotContains(t, logs.String(), strconv.FormatInt(telegramTestOwner, 10))
+}
+
func TestSplitMessage(t *testing.T) {
testCases := []struct {
name string