package sender import ( "encoding/json" "io" "net/http" "net/http/httptest" "sync" "testing" amv2 "github.com/prometheus/alertmanager/api/v2/models" "github.com/prometheus/common/model" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) type FakeExternalAlertmanager struct { t *testing.T mtx sync.Mutex alerts amv2.PostableAlerts Server *httptest.Server } func NewFakeExternalAlertmanager(t *testing.T) *FakeExternalAlertmanager { t.Helper() am := &FakeExternalAlertmanager{ t: t, alerts: amv2.PostableAlerts{}, } am.Server = httptest.NewServer(http.HandlerFunc(am.Handler())) return am } func (am *FakeExternalAlertmanager) URL() string { return am.Server.URL } func (am *FakeExternalAlertmanager) AlertNamesCompare(expected []string) bool { n := []string{} alerts := am.Alerts() if len(expected) != len(alerts) { return false } for _, a := range am.Alerts() { for k, v := range a.Alert.Labels { if k == model.AlertNameLabel { n = append(n, v) } } } return assert.ObjectsAreEqual(expected, n) } func (am *FakeExternalAlertmanager) AlertsCount() int { am.mtx.Lock() defer am.mtx.Unlock() return len(am.alerts) } func (am *FakeExternalAlertmanager) Alerts() amv2.PostableAlerts { am.mtx.Lock() defer am.mtx.Unlock() return am.alerts } func (am *FakeExternalAlertmanager) Handler() func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) { b, err := io.ReadAll(r.Body) require.NoError(am.t, err) a := amv2.PostableAlerts{} require.NoError(am.t, json.Unmarshal(b, &a)) am.mtx.Lock() am.alerts = append(am.alerts, a...) am.mtx.Unlock() } } func (am *FakeExternalAlertmanager) Close() { am.Server.Close() }