- второй канал рядом с ntfy, оба необязательные: токен бота, несколько chat id, тема форума, свой адрес Bot API - успешные бэкапы приходят без звука, в сообщениях ссылка на карточку клиента - тестовая отправка синхронная: в настройках виден результат по каждому каналу - токен бота не попадает в тексты ошибок и логи Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
77 lines
2.4 KiB
Go
77 lines
2.4 KiB
Go
package server
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"sync"
|
|
"testing"
|
|
)
|
|
|
|
func TestTelegramSend(t *testing.T) {
|
|
var mu sync.Mutex
|
|
var got []map[string]any
|
|
api := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
if r.URL.Path != "/botTOKEN/sendMessage" {
|
|
http.NotFound(w, r)
|
|
return
|
|
}
|
|
var body map[string]any
|
|
_ = json.NewDecoder(r.Body).Decode(&body)
|
|
mu.Lock()
|
|
got = append(got, body)
|
|
mu.Unlock()
|
|
if body["chat_id"] == "bad" {
|
|
w.WriteHeader(http.StatusBadRequest)
|
|
w.Write([]byte(`{"ok":false,"description":"Bad Request: chat not found"}`))
|
|
return
|
|
}
|
|
w.Write([]byte(`{"ok":true}`))
|
|
}))
|
|
defer api.Close()
|
|
|
|
tg := telegram{api: api.URL, token: "TOKEN", chats: []string{"1", "-1002"}, thread: "7"}
|
|
n := notification{Title: "Бэкап готов: a<b>.example", Msg: "1 ГБ", Priority: "low", Tags: "white_check_mark", Link: "https://bm.test/clients/1"}
|
|
if err := tg.send(context.Background(), n); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(got) != 2 {
|
|
t.Fatalf("отправлено %d сообщений, ожидалось 2", len(got))
|
|
}
|
|
m := got[0]
|
|
text, _ := m["text"].(string)
|
|
if !strings.HasPrefix(text, "✅ <b>Бэкап готов: a<b>.example</b>") || !strings.Contains(text, `href="https://bm.test/clients/1"`) {
|
|
t.Errorf("текст: %q", text)
|
|
}
|
|
if m["parse_mode"] != "HTML" || m["disable_notification"] != true || m["message_thread_id"] != float64(7) {
|
|
t.Errorf("параметры: %v", m)
|
|
}
|
|
|
|
tg.chats = []string{"bad"}
|
|
err := tg.send(context.Background(), notification{Title: "x", Priority: "high"})
|
|
if err == nil || !strings.Contains(err.Error(), "chat not found") {
|
|
t.Fatalf("ошибка: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestChannelsFromSettings(t *testing.T) {
|
|
s, _ := newTestServer(t)
|
|
if len(s.channels()) != 0 {
|
|
t.Fatal("без настроек каналов быть не должно")
|
|
}
|
|
_ = s.st.SetSetting(settingTGToken, "T")
|
|
if len(s.channels()) != 0 {
|
|
t.Fatal("Telegram без chat id включаться не должен")
|
|
}
|
|
_ = s.st.SetSetting(settingTGChats, "1")
|
|
_ = s.st.SetSetting(settingNtfyURL, "https://ntfy.test/x")
|
|
if n := len(s.channels()); n != 2 {
|
|
t.Fatalf("каналов %d, ожидалось 2", n)
|
|
}
|
|
if got := splitList("1, -100;2\n 3"); strings.Join(got, ",") != "1,-100,2,3" {
|
|
t.Fatalf("splitList: %v", got)
|
|
}
|
|
}
|