Files

72 lines
2.6 KiB
Go

package alertnotify
import (
"io"
"net/http"
"strings"
"testing"
"vpn-platform/backend/internal/model"
"vpn-platform/backend/internal/store"
)
type roundTripFunc func(*http.Request) (*http.Response, error)
func (f roundTripFunc) RoundTrip(r *http.Request) (*http.Response, error) { return f(r) }
func TestConfigSecretsAndValidation(t *testing.T) {
if err := store.Init(t.TempDir()); err != nil {
t.Fatal(err)
}
for _, raw := range []string{"http://open.feishu.cn/open-apis/bot/v2/hook/id", "https://localhost/open-apis/bot/v2/hook/id", "https://open.feishu.cn.evil.test/open-apis/bot/v2/hook/id", "https://open.feishu.cn/open-apis/bot/v2/hook/id?x=1"} {
if validWebhook(raw) {
t.Errorf("accepted invalid webhook: %s", raw)
}
}
webhook := "https://open.feishu.cn/open-apis/bot/v2/hook/abc-123"
status, err := Save(Input{RateThresholdMbps: 75, Enabled: true, Webhook: webhook, SigningSecret: "sign-me"})
if err != nil {
t.Fatal(err)
}
if !status.Configured || !status.Signed || !status.Enabled || status.RateThresholdMbps != 75 {
t.Fatalf("unexpected status: %+v", status)
}
var row model.AlertSetting
if err := store.DB.First(&row, 1).Error; err != nil {
t.Fatal(err)
}
if strings.Contains(row.WebhookEncrypted, webhook) || strings.Contains(row.SigningEncrypted, "sign-me") {
t.Fatal("plaintext credentials stored")
}
if _, err := Save(Input{RateThresholdMbps: 0}); err == nil {
t.Fatal("accepted zero threshold")
}
if _, err := Save(Input{RateThresholdMbps: 75, Enabled: true}); err != nil {
t.Fatal("empty secret fields should retain stored credentials", err)
}
}
func TestSendChecksProviderResponse(t *testing.T) {
old := client
t.Cleanup(func() { client = old })
client = &http.Client{Transport: roundTripFunc(func(r *http.Request) (*http.Response, error) {
if r.URL.Host != "open.feishu.cn" {
t.Fatal("wrong destination")
}
body, _ := io.ReadAll(r.Body)
if !strings.Contains(string(body), `"sign":`) {
t.Fatal("missing bot signature")
}
return &http.Response{StatusCode: 200, Body: io.NopCloser(strings.NewReader(`{"code":0}`)), Header: make(http.Header)}, nil
})}
if err := send("https://open.feishu.cn/open-apis/bot/v2/hook/id", "secret", "test"); err != nil {
t.Fatal(err)
}
client.Transport = roundTripFunc(func(*http.Request) (*http.Response, error) {
return &http.Response{StatusCode: 200, Body: io.NopCloser(strings.NewReader(`{"code":19021}`)), Header: make(http.Header)}, nil
})
if err := send("https://open.feishu.cn/open-apis/bot/v2/hook/id", "", "test"); err == nil {
t.Fatal("accepted provider rejection")
}
}