66 lines
2.1 KiB
Go
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)
|
|
}
|
|
}
|