feat: publish standalone worker
Separate worker packaging and service lifecycle from the control plane.
Этот коммит содержится в:
110
internal/notify/telegram_network_test.go
Обычный файл
110
internal/notify/telegram_network_test.go
Обычный файл
@@ -0,0 +1,110 @@
|
||||
package notify
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"net/url"
|
||||
"strings"
|
||||
"sync/atomic"
|
||||
"testing"
|
||||
|
||||
"rsgit.ru/rsmon/rsmon/app/models"
|
||||
)
|
||||
|
||||
func TestTelegram_Network_MockBotAPI(t *testing.T) {
|
||||
var (
|
||||
gotPath atomic.Value
|
||||
gotMethod atomic.Value
|
||||
gotContentTy atomic.Value
|
||||
gotForm atomic.Pointer[url.Values]
|
||||
)
|
||||
gotPath.Store("")
|
||||
gotMethod.Store("")
|
||||
gotContentTy.Store("")
|
||||
|
||||
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
gotPath.Store(r.URL.Path)
|
||||
gotMethod.Store(r.Method)
|
||||
gotContentTy.Store(r.Header.Get("Content-Type"))
|
||||
if err := r.ParseForm(); err == nil {
|
||||
form := r.PostForm
|
||||
gotForm.Store(&form)
|
||||
}
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
_, _ = w.Write([]byte(`{"ok":true,"result":{"id":1,"is_bot":true,"first_name":"Test","username":"test_bot"}}`))
|
||||
}))
|
||||
defer srv.Close()
|
||||
|
||||
enabled := true
|
||||
cred := &models.NotificationCredential{
|
||||
Kind: models.CredentialKindTelegram,
|
||||
Name: "test-bot",
|
||||
BotName: strPtr("test_bot"),
|
||||
APIURL: strPtr(srv.URL),
|
||||
Enabled: &enabled,
|
||||
SecretEnc: "plain:FAKE_TOKEN_FOR_TEST",
|
||||
}
|
||||
|
||||
if err := Telegram(cred, 123456789, "hello from test"); err != nil {
|
||||
t.Fatalf("Telegram returned error: %v", err)
|
||||
}
|
||||
|
||||
path := gotPath.Load().(string)
|
||||
method := gotMethod.Load().(string)
|
||||
ct := gotContentTy.Load().(string)
|
||||
if method != http.MethodPost {
|
||||
t.Errorf("method = %s; want POST", method)
|
||||
}
|
||||
if !strings.HasPrefix(path, "/botFAKE_TOKEN_FOR_TEST/") {
|
||||
t.Errorf("unexpected path: %s", path)
|
||||
}
|
||||
if !strings.HasSuffix(path, "/sendMessage") {
|
||||
t.Errorf("expected path to end with /sendMessage, got: %s", path)
|
||||
}
|
||||
if !strings.Contains(ct, "application/x-www-form-urlencoded") {
|
||||
t.Errorf("content-type = %q; want application/x-www-form-urlencoded", ct)
|
||||
}
|
||||
|
||||
formPtr := gotForm.Load()
|
||||
if formPtr == nil {
|
||||
t.Fatal("form body was not captured")
|
||||
}
|
||||
form := *formPtr
|
||||
if got := form.Get("chat_id"); got != "123456789" {
|
||||
t.Errorf("chat_id = %q; want 123456789", got)
|
||||
}
|
||||
if got := form.Get("text"); got != "hello from test" {
|
||||
t.Errorf("text = %q; want %q", got, "hello from test")
|
||||
}
|
||||
}
|
||||
|
||||
func TestTelegram_Network_BasicAuthProxy(t *testing.T) {
|
||||
var gotAuth atomic.Value
|
||||
gotAuth.Store("")
|
||||
|
||||
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
gotAuth.Store(r.Header.Get("Authorization"))
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
_, _ = w.Write([]byte(`{"ok":true,"result":{"id":1,"username":"t"}}`))
|
||||
}))
|
||||
defer srv.Close()
|
||||
|
||||
authedURL := strings.Replace(srv.URL, "http://", "http://gleb:rokBelHoho@", 1)
|
||||
|
||||
enabled := true
|
||||
cred := &models.NotificationCredential{
|
||||
Kind: models.CredentialKindTelegram,
|
||||
Name: "proxy-bot",
|
||||
APIURL: strPtr(authedURL),
|
||||
Enabled: &enabled,
|
||||
SecretEnc: "plain:TOKEN",
|
||||
}
|
||||
|
||||
if err := Telegram(cred, 1, "x"); err != nil {
|
||||
t.Fatalf("Telegram returned error: %v", err)
|
||||
}
|
||||
got := gotAuth.Load().(string)
|
||||
if !strings.HasPrefix(got, "Basic ") {
|
||||
t.Errorf("expected Basic auth header, got %q", got)
|
||||
}
|
||||
}
|
||||
Ссылка в новой задаче
Block a user