Files
LinkPort/internal/alerts/delivery_boundary_test.go
T

66 lines
2.1 KiB
Go

package alerts
import (
"context"
"linkport/internal/gateway"
"linkport/internal/model"
"linkport/internal/store"
"net/http"
"net/http/httptest"
"sync/atomic"
"testing"
)
// The HTTP endpoints are local fixtures, not external notification services.
func TestCheckAndDeliveryKeepNotificationsSeparate(t *testing.T) {
s := fixtureStore(t)
var received, redirected atomic.Int64
var accept atomic.Bool
other := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
redirected.Add(1)
w.WriteHeader(http.StatusNoContent)
}))
defer other.Close()
webhook := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
received.Add(1)
if accept.Load() {
w.WriteHeader(http.StatusNoContent)
return
}
http.Redirect(w, r, other.URL, http.StatusFound)
}))
defer webhook.Close()
c := store.DefaultAlertSettings()
c.WebhookEnabled, c.WebhookURL = true, webhook.URL
if err := s.SaveAlertSettings(c); err != nil {
t.Fatal(err)
}
if err := s.SaveTarget(model.Target{ID: "target"}); err != nil {
t.Fatal(err)
}
e := New(s, &fixtureSource{health: []gateway.HealthResult{{TargetID: "target", Healthy: false}}})
if err := e.Check(context.Background()); err != nil {
t.Fatal(err)
}
if received.Load() != 0 {
t.Fatal("checking conditions contacted the webhook")
}
if err := e.Deliver(context.Background()); err != nil {
t.Fatal(err)
}
items, err := s.Alerts()
if err != nil || len(items) != 1 || items[0].DeliveryStatus != "pending" || items[0].DeliveryAttempts != 1 || received.Load() != 1 || redirected.Load() != 0 {
t.Fatalf("redirect must remain a failed attempt: items=%+v received=%d redirected=%d err=%v", items, received.Load(), redirected.Load(), err)
}
accept.Store(true)
for range 2 {
if err := e.Deliver(context.Background()); err != nil {
t.Fatal(err)
}
}
items, err = s.Alerts()
if err != nil || len(items) != 1 || items[0].DeliveryStatus != "sent" || items[0].DeliveryAttempts != 2 || received.Load() != 2 {
t.Fatalf("successful transition was not terminal: items=%+v received=%d err=%v", items, received.Load(), err)
}
}