package main
import (
- "log"
"net/http"
"os"
"path/filepath"
require.Empty(t, telegram.Sent())
require.NotContains(t, terminal.Output(), "secret")
require.NotContains(t, logs.String(), "secret")
- require.Contains(t, logs.String(), "message ignored")
+ require.Contains(t, logs.String(), "<6>message ignored")
}
func TestBotAnswersThatOnlyTextIsSupported(t *testing.T) {
})
telegramWaitForSent(t, telegram, "ok")
- require.Contains(t, logs.String(), "502")
- require.Contains(t, logs.String(), "429")
+ require.Contains(t, logs.String(), "<4>receive failed retry=1ms: 502")
+ require.Contains(t, logs.String(), "<6>receive back after=")
+ require.Contains(t, logs.String(), "<4>send failed retry=1s: 429")
+ require.Contains(t, logs.String(), "<6>send back after=")
require.NotContains(t, logs.String(), telegramTestToken)
}
require.Equal(t, []string{"hello"}, telegram.Sent())
require.Len(t, telegram.Calls(), 2)
- require.Contains(t, logs.String(), "send failed: no answer in 50ms (retry in 1ms)\n")
- require.Contains(t, logs.String(), "send back after ")
+ require.Contains(t, logs.String(), "<4>send failed retry=1ms: no answer in 50ms\n")
+ require.Contains(t, logs.String(), "<6>send back after=")
require.Equal(t, 2, strings.Count(logs.String(), "\n"))
require.NotContains(t, logs.String(), telegramTestToken)
}
telegramWaitForSent(t, telegram, telegramTextOnly)
var sends []TelegramFakeCall
+
for _, call := range telegram.Calls() {
if call.method == "sendMessage" || call.method == "sendRichMessage" {
sends = append(sends, call)
methods: []string{"sendRichMessage", "sendMessage"},
sent: []string{"a secret word"},
lines: 1,
- logText: "reply sent with simple formatting",
+ logText: "<4>reply sent with simple formatting",
},
{
name: "unknown method sends the reply once with entities",
methods: []string{"sendRichMessage", "sendMessage"},
sent: []string{"a secret word"},
lines: 1,
- logText: "reply sent with simple formatting",
+ logText: "<4>reply sent with simple formatting",
},
{
name: "rate limit tries the rich message again",
methods: []string{"sendRichMessage", "sendRichMessage"},
sent: []string{"a **secret** word"},
lines: 2,
- logText: "send failed: 429",
+ logText: "<4>send failed retry=1s: 429",
},
{
name: "server error tries the rich message again",
methods: []string{"sendRichMessage", "sendRichMessage"},
sent: []string{"a **secret** word"},
lines: 2,
- logText: "send failed: 500",
+ logText: "<4>send failed retry=1ms: 500",
},
{
name: "other refusal drops the reply",
always: true,
methods: []string{"sendRichMessage"},
lines: 1,
- logText: "reply lost: 403",
+ logText: "<3>reply lost: 403",
},
}
})
var methods []string
+
for _, call := range telegram.Calls() {
methods = append(methods, call.method)
}
require.Equal(t, tc.sent, telegram.Sent())
require.Equal(t, tc.lines, strings.Count(logs.String(), "\n"))
require.Contains(t, logs.String(), tc.logText)
+
+ if tc.lines == 2 {
+ require.Contains(t, logs.String(), "<6>send back after=")
+ }
+
require.NotContains(t, logs.String(), telegramTestToken)
require.NotContains(t, logs.String(), "secret word")
})
var fallback, rich []string
+
for _, call := range telegram.Calls() {
switch {
case !call.ok:
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(), "reply sent as plain text")
+ require.Contains(t, logs.String(), "<4>reply sent as plain text")
require.NotContains(t, logs.String(), telegramTestToken)
require.NotContains(t, logs.String(), "secret word")
}
+func TestBotLogsALostPlainReplyAsAnError(t *testing.T) {
+ telegram := newTelegramFake(t)
+ telegram.fail = func(call TelegramFakeCall) (int, string) {
+ if call.method == "sendMessage" {
+ return http.StatusForbidden, "Forbidden"
+ }
+
+ return 0, ""
+ }
+
+ bot, logs := telegramStartTestBot(t, telegram)
+ bot.deliver(t.Context(), TelegramPart{text: "secret reply"})
+ require.Equal(t, "<3>reply lost: 403 Forbidden\n", logs.String())
+ require.Empty(t, telegram.Sent())
+}
+
func TestBotLogsNoTokenWhenTheNetworkFails(t *testing.T) {
telegram := newTelegramFake(t)
telegram.Close()
daemonStartTestWithBot(t, newModelFake(t), bot)
require.Eventually(t, func() bool {
- return strings.Contains(logs.String(), "receive failed: no answer: ")
+ return strings.Contains(logs.String(), "<4>receive failed retry=1ms: no answer: ")
}, 10*time.Second, time.Millisecond)
require.NotContains(t, logs.String(), telegramTestToken)
}
})
telegramWaitForSent(t, telegram, "ok")
+
lines := strings.Split(strings.TrimSuffix(logs.String(), "\n"), "\n")
require.Len(t, lines, 2)
- require.Equal(t, "receive failed: 502 Bad Gateway (retry in 1ms)", lines[0])
- require.Regexp(t, `^receive back after [0-9]+m?s$`, lines[1])
+ require.Equal(t, "<4>receive failed retry=1ms: 502 Bad Gateway", lines[0])
+ require.Regexp(t, `^<6>receive back after=[0-9]+m?s$`, lines[1])
require.NotContains(t, logs.String(), "secret word")
require.NotContains(t, logs.String(), strconv.FormatInt(telegramTestOwner, 10))
}
t.Helper()
logs := &SyncBuffer{}
- bot := newTelegramBot(newTelegramAPI(server.URL, telegramTestToken), telegramTestOwner, filepath.Join(t.TempDir(), telegramOffsetFileName), log.New(logs, "", 0))
+ bot := newTelegramBot(newTelegramAPI(server.URL, telegramTestToken), telegramTestOwner, filepath.Join(t.TempDir(), telegramOffsetFileName), daemonTestLogger(logs))
bot.minWait = time.Millisecond
bot.maxWait = 10 * time.Millisecond