package sqlstore import ( "testing" "github.com/grafana/grafana/pkg/components/simplejson" m "github.com/grafana/grafana/pkg/models" . "github.com/smartystreets/goconvey/convey" ) func TestAlertingDataAccess(t *testing.T) { Convey("Testing Alerting data access", t, func() { InitTestDB(t) testDash := insertTestDashboard("dashboard with alerts", 1, "alert") items := []*m.Alert{ { PanelId: 1, DashboardId: testDash.Id, OrgId: testDash.OrgId, Name: "Alerting title", Message: "Alerting message", Settings: simplejson.New(), Frequency: 1, }, } cmd := m.SaveAlertsCommand{ Alerts: items, DashboardId: testDash.Id, OrgId: 1, UserId: 1, } err := SaveAlerts(&cmd) Convey("Can create one alert", func() { So(err, ShouldBeNil) }) Convey("Can set new states", func() { Convey("new state ok", func() { cmd := &m.SetAlertStateCommand{ AlertId: 1, State: m.AlertStateOK, } err = SetAlertState(cmd) So(err, ShouldBeNil) }) Convey("can pause alert", func() { cmd := &m.PauseAllAlertCommand{ Paused: true, } err = PauseAllAlerts(cmd) So(err, ShouldBeNil) Convey("cannot updated paused alert", func() { cmd := &m.SetAlertStateCommand{ AlertId: 1, State: m.AlertStateOK, } err = SetAlertState(cmd) So(err, ShouldNotBeNil) }) }) }) Convey("Can read properties", func() { alertQuery := m.GetAlertsQuery{DashboardId: testDash.Id, PanelId: 1, OrgId: 1} err2 := HandleAlertsQuery(&alertQuery) alert := alertQuery.Result[0] So(err2, ShouldBeNil) So(alert.Name, ShouldEqual, "Alerting title") So(alert.Message, ShouldEqual, "Alerting message") So(alert.State, ShouldEqual, "pending") So(alert.Frequency, ShouldEqual, 1) }) Convey("Alerts with same dashboard id and panel id should update", func() { modifiedItems := items modifiedItems[0].Name = "Name" modifiedCmd := m.SaveAlertsCommand{ DashboardId: testDash.Id, OrgId: 1, UserId: 1, Alerts: modifiedItems, } err := SaveAlerts(&modifiedCmd) Convey("Can save alerts with same dashboard and panel id", func() { So(err, ShouldBeNil) }) Convey("Alerts should be updated", func() { query := m.GetAlertsQuery{DashboardId: testDash.Id, OrgId: 1} err2 := HandleAlertsQuery(&query) So(err2, ShouldBeNil) So(len(query.Result), ShouldEqual, 1) So(query.Result[0].Name, ShouldEqual, "Name") Convey("Alert state should not be updated", func() { So(query.Result[0].State, ShouldEqual, "pending") }) }) Convey("Updates without changes should be ignored", func() { err3 := SaveAlerts(&modifiedCmd) So(err3, ShouldBeNil) }) }) Convey("Multiple alerts per dashboard", func() { multipleItems := []*m.Alert{ { DashboardId: testDash.Id, PanelId: 1, Name: "1", OrgId: 1, Settings: simplejson.New(), }, { DashboardId: testDash.Id, PanelId: 2, Name: "2", OrgId: 1, Settings: simplejson.New(), }, { DashboardId: testDash.Id, PanelId: 3, Name: "3", OrgId: 1, Settings: simplejson.New(), }, } cmd.Alerts = multipleItems err = SaveAlerts(&cmd) Convey("Should save 3 dashboards", func() { So(err, ShouldBeNil) queryForDashboard := m.GetAlertsQuery{DashboardId: testDash.Id, OrgId: 1} err2 := HandleAlertsQuery(&queryForDashboard) So(err2, ShouldBeNil) So(len(queryForDashboard.Result), ShouldEqual, 3) }) Convey("should updated two dashboards and delete one", func() { missingOneAlert := multipleItems[:2] cmd.Alerts = missingOneAlert err = SaveAlerts(&cmd) Convey("should delete the missing alert", func() { query := m.GetAlertsQuery{DashboardId: testDash.Id, OrgId: 1} err2 := HandleAlertsQuery(&query) So(err2, ShouldBeNil) So(len(query.Result), ShouldEqual, 2) }) }) }) Convey("When dashboard is removed", func() { items := []*m.Alert{ { PanelId: 1, DashboardId: testDash.Id, Name: "Alerting title", Message: "Alerting message", }, } cmd := m.SaveAlertsCommand{ Alerts: items, DashboardId: testDash.Id, OrgId: 1, UserId: 1, } SaveAlerts(&cmd) err = DeleteDashboard(&m.DeleteDashboardCommand{ OrgId: 1, Slug: testDash.Slug, }) So(err, ShouldBeNil) Convey("Alerts should be removed", func() { query := m.GetAlertsQuery{DashboardId: testDash.Id, OrgId: 1} err2 := HandleAlertsQuery(&query) So(testDash.Id, ShouldEqual, 1) So(err2, ShouldBeNil) So(len(query.Result), ShouldEqual, 0) }) }) }) }