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