Files

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")
}
}