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.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, "✅ Бэкап готов: a<b>.example") || !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) } }