@@ -28,6 +28,7 @@ import (
2828	"github.com/prometheus/common/model" 
2929	"github.com/stretchr/testify/require" 
3030
31+ 	"github.com/prometheus/alertmanager/alertobserver" 
3132	"github.com/prometheus/alertmanager/config" 
3233	"github.com/prometheus/alertmanager/dispatch" 
3334	"github.com/prometheus/alertmanager/pkg/labels" 
@@ -134,7 +135,7 @@ func TestAddAlerts(t *testing.T) {
134135		}
135136
136137		alertsProvider  :=  newFakeAlerts ([]* types.Alert {}, tc .err )
137- 		api  :=  New (alertsProvider , nil , newGetAlertStatus (alertsProvider ), nil , nil , nil )
138+ 		api  :=  New (alertsProvider , nil , newGetAlertStatus (alertsProvider ), nil , nil , nil ,  nil )
138139		defaultGlobalConfig  :=  config .DefaultGlobalConfig ()
139140		route  :=  config.Route {}
140141		api .Update (& config.Config {
@@ -153,6 +154,74 @@ func TestAddAlerts(t *testing.T) {
153154		body , _  :=  io .ReadAll (res .Body )
154155
155156		require .Equal (t , tc .code , w .Code , fmt .Sprintf ("test case: %d, StartsAt %v, EndsAt %v, Response: %s" , i , tc .start , tc .end , string (body )))
157+ 
158+ 		observer  :=  alertobserver .NewFakeLifeCycleObserver ()
159+ 		api .alertLCObserver  =  observer 
160+ 		r , err  =  http .NewRequest ("POST" , "/api/v1/alerts" , bytes .NewReader (b ))
161+ 		w  =  httptest .NewRecorder ()
162+ 		if  err  !=  nil  {
163+ 			t .Errorf ("Unexpected error %v" , err )
164+ 		}
165+ 		api .addAlerts (w , r )
166+ 		if  tc .code  ==  200  {
167+ 			require .Equal (t , observer .AlertsPerEvent [alertobserver .EventAlertReceived ][0 ].Fingerprint (), alerts [0 ].Fingerprint ())
168+ 		} else  {
169+ 			require .Equal (t , observer .AlertsPerEvent [alertobserver .EventAlertRejected ][0 ].Fingerprint (), alerts [0 ].Fingerprint ())
170+ 		}
171+ 	}
172+ }
173+ 
174+ func  TestAddAlertsWithAlertLCObserver (t  * testing.T ) {
175+ 	now  :=  func (offset  int ) time.Time  {
176+ 		return  time .Now ().Add (time .Duration (offset ) *  time .Second )
177+ 	}
178+ 
179+ 	for  i , tc  :=  range  []struct  {
180+ 		start , end  time.Time 
181+ 		err         bool 
182+ 		code        int 
183+ 	}{
184+ 		{time.Time {}, time.Time {}, false , 200 },
185+ 		{now (1 ), now (0 ), false , 400 },
186+ 		{now (0 ), time.Time {}, true , 500 },
187+ 	} {
188+ 		alerts  :=  []model.Alert {{
189+ 			StartsAt :    tc .start ,
190+ 			EndsAt :      tc .end ,
191+ 			Labels :      model.LabelSet {"label1" : "test1" },
192+ 			Annotations : model.LabelSet {"annotation1" : "some text" },
193+ 		}}
194+ 		b , err  :=  json .Marshal (& alerts )
195+ 		if  err  !=  nil  {
196+ 			t .Errorf ("Unexpected error %v" , err )
197+ 		}
198+ 
199+ 		alertsProvider  :=  newFakeAlerts ([]* types.Alert {}, tc .err )
200+ 		observer  :=  alertobserver .NewFakeLifeCycleObserver ()
201+ 		api  :=  New (alertsProvider , nil , newGetAlertStatus (alertsProvider ), nil , nil , nil , observer )
202+ 		defaultGlobalConfig  :=  config .DefaultGlobalConfig ()
203+ 		route  :=  config.Route {}
204+ 		api .Update (& config.Config {
205+ 			Global : & defaultGlobalConfig ,
206+ 			Route :  & route ,
207+ 		})
208+ 
209+ 		r , err  :=  http .NewRequest ("POST" , "/api/v1/alerts" , bytes .NewReader (b ))
210+ 		w  :=  httptest .NewRecorder ()
211+ 		if  err  !=  nil  {
212+ 			t .Errorf ("Unexpected error %v" , err )
213+ 		}
214+ 
215+ 		api .addAlerts (w , r )
216+ 		res  :=  w .Result ()
217+ 		body , _  :=  io .ReadAll (res .Body )
218+ 
219+ 		require .Equal (t , tc .code , w .Code , fmt .Sprintf ("test case: %d, StartsAt %v, EndsAt %v, Response: %s" , i , tc .start , tc .end , string (body )))
220+ 		if  tc .code  ==  200  {
221+ 			require .Equal (t , observer .AlertsPerEvent [alertobserver .EventAlertReceived ][0 ].Fingerprint (), alerts [0 ].Fingerprint ())
222+ 		} else  {
223+ 			require .Equal (t , observer .AlertsPerEvent [alertobserver .EventAlertRejected ][0 ].Fingerprint (), alerts [0 ].Fingerprint ())
224+ 		}
156225	}
157226}
158227
@@ -267,7 +336,7 @@ func TestListAlerts(t *testing.T) {
267336		},
268337	} {
269338		alertsProvider  :=  newFakeAlerts (alerts , tc .err )
270- 		api  :=  New (alertsProvider , nil , newGetAlertStatus (alertsProvider ), nil , nil , nil )
339+ 		api  :=  New (alertsProvider , nil , newGetAlertStatus (alertsProvider ), nil , nil , nil ,  nil )
271340		api .route  =  dispatch .NewRoute (& config.Route {Receiver : "def-receiver" }, nil )
272341
273342		r , err  :=  http .NewRequest ("GET" , "/api/v1/alerts" , nil )
0 commit comments