72 lines
2.6 KiB
Go
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")
|
|
}
|
|
}
|