94 lines
3.0 KiB
Go
94 lines
3.0 KiB
Go
package notify
|
|
|
|
import "context"
|
|
import "encoding/json"
|
|
import "io"
|
|
import "net/http"
|
|
import "net/http/httptest"
|
|
import "testing"
|
|
|
|
import "codit/internal/models"
|
|
import "codit/internal/monitor"
|
|
|
|
func TestBuildTeamsPayload(t *testing.T) {
|
|
var card teamsMessageCard
|
|
card = buildTeamsPayload(models.Event{Title: "down", Body: "refused", Severity: models.EventSeverityCritical})
|
|
if card.Type != "MessageCard" {
|
|
t.Fatalf("wrong @type: %q", card.Type)
|
|
}
|
|
if card.ThemeColor != "D93025" {
|
|
t.Fatalf("critical should be red, got %q", card.ThemeColor)
|
|
}
|
|
if card.Title != "down" || card.Text != "refused" {
|
|
t.Fatalf("unexpected card: %+v", card)
|
|
}
|
|
}
|
|
|
|
func TestBuildSlackPayload(t *testing.T) {
|
|
var msg slackMessage
|
|
msg = buildSlackPayload(models.Event{Title: "degraded", Body: "slow", Severity: models.EventSeverityWarning, SourceType: "monitor", SourceID: "m1", CreatedAt: 1700000000})
|
|
if len(msg.Attachments) != 1 {
|
|
t.Fatalf("expected one attachment, got %d", len(msg.Attachments))
|
|
}
|
|
if msg.Attachments[0].Color != "#F9AB00" {
|
|
t.Fatalf("warning should be amber, got %q", msg.Attachments[0].Color)
|
|
}
|
|
if msg.Attachments[0].Footer != "monitor:m1" {
|
|
t.Fatalf("unexpected footer: %q", msg.Attachments[0].Footer)
|
|
}
|
|
}
|
|
|
|
func TestDeliverSlackPostsPayload(t *testing.T) {
|
|
var gotType string
|
|
var payload slackMessage
|
|
var srv *httptest.Server
|
|
var d *Dispatcher
|
|
var err error
|
|
|
|
srv = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
var body []byte
|
|
gotType = r.Header.Get("Content-Type")
|
|
body, _ = io.ReadAll(r.Body)
|
|
_ = json.Unmarshal(body, &payload)
|
|
w.WriteHeader(http.StatusOK)
|
|
}))
|
|
defer srv.Close()
|
|
|
|
d = NewDispatcher(nil, "", "", monitor.DefaultEgressPolicy(), "", nil)
|
|
err = d.deliverSlack(context.Background(), models.DeliveryTarget{ChannelName: "alerts", TransportType: models.TransportTypeSlack, Address: srv.URL}, models.Event{Title: "down", Body: "refused", Severity: models.EventSeverityCritical})
|
|
if err != nil {
|
|
t.Fatalf("deliverSlack error: %v", err)
|
|
}
|
|
if gotType != "application/json" {
|
|
t.Fatalf("expected application/json, got %q", gotType)
|
|
}
|
|
if payload.Text == "" {
|
|
t.Fatalf("empty slack text")
|
|
}
|
|
}
|
|
|
|
func TestDeliverTeamsErrorsOnBadStatus(t *testing.T) {
|
|
var srv *httptest.Server
|
|
var d *Dispatcher
|
|
var err error
|
|
srv = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
w.WriteHeader(http.StatusBadRequest)
|
|
}))
|
|
defer srv.Close()
|
|
d = NewDispatcher(nil, "", "", monitor.DefaultEgressPolicy(), "", nil)
|
|
err = d.deliverTeams(context.Background(), models.DeliveryTarget{ChannelName: "t", TransportType: models.TransportTypeMSTeams, Address: srv.URL}, models.Event{Title: "x"})
|
|
if err == nil {
|
|
t.Fatalf("expected error on 400 status")
|
|
}
|
|
}
|
|
|
|
func TestPostJSONErrorsOnEmptyURL(t *testing.T) {
|
|
var d *Dispatcher
|
|
var err error
|
|
d = NewDispatcher(nil, "", "", monitor.DefaultEgressPolicy(), "", nil)
|
|
err = d.postJSON(context.Background(), "c", "", map[string]string{})
|
|
if err == nil {
|
|
t.Fatalf("expected error on empty URL")
|
|
}
|
|
}
|