alert_test.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. package sqlstore
  2. import (
  3. "testing"
  4. "github.com/grafana/grafana/pkg/components/simplejson"
  5. m "github.com/grafana/grafana/pkg/models"
  6. . "github.com/smartystreets/goconvey/convey"
  7. "time"
  8. )
  9. func mockTimeNow() {
  10. var timeSeed int64
  11. timeNow = func() time.Time {
  12. fakeNow := time.Unix(timeSeed, 0)
  13. timeSeed += 1
  14. return fakeNow
  15. }
  16. }
  17. func resetTimeNow() {
  18. timeNow = time.Now
  19. }
  20. func TestAlertingDataAccess(t *testing.T) {
  21. mockTimeNow()
  22. defer resetTimeNow()
  23. Convey("Testing Alerting data access", t, func() {
  24. InitTestDB(t)
  25. testDash := insertTestDashboard("dashboard with alerts", 1, 0, false, "alert")
  26. items := []*m.Alert{
  27. {
  28. PanelId: 1,
  29. DashboardId: testDash.Id,
  30. OrgId: testDash.OrgId,
  31. Name: "Alerting title",
  32. Message: "Alerting message",
  33. Settings: simplejson.New(),
  34. Frequency: 1,
  35. },
  36. }
  37. cmd := m.SaveAlertsCommand{
  38. Alerts: items,
  39. DashboardId: testDash.Id,
  40. OrgId: 1,
  41. UserId: 1,
  42. }
  43. err := SaveAlerts(&cmd)
  44. Convey("Can create one alert", func() {
  45. So(err, ShouldBeNil)
  46. })
  47. Convey("Can set new states", func() {
  48. Convey("new state ok", func() {
  49. cmd := &m.SetAlertStateCommand{
  50. AlertId: 1,
  51. State: m.AlertStateOK,
  52. }
  53. err = SetAlertState(cmd)
  54. So(err, ShouldBeNil)
  55. })
  56. alert, err := getAlertById(1)
  57. So(err, ShouldBeNil)
  58. stateDateBeforePause := alert.NewStateDate
  59. Convey("can pause all alerts", func() {
  60. pauseAllAlerts(true)
  61. Convey("cannot updated paused alert", func() {
  62. cmd := &m.SetAlertStateCommand{
  63. AlertId: 1,
  64. State: m.AlertStateOK,
  65. }
  66. err = SetAlertState(cmd)
  67. So(err, ShouldNotBeNil)
  68. })
  69. Convey("pausing alerts should update their NewStateDate", func() {
  70. alert, _ = getAlertById(1)
  71. stateDateAfterPause := alert.NewStateDate
  72. So(stateDateBeforePause, ShouldHappenBefore, stateDateAfterPause)
  73. })
  74. Convey("unpausing alerts should update their NewStateDate again", func() {
  75. pauseAllAlerts(false)
  76. alert, _ = getAlertById(1)
  77. stateDateAfterUnpause := alert.NewStateDate
  78. So(stateDateBeforePause, ShouldHappenBefore, stateDateAfterUnpause)
  79. })
  80. })
  81. })
  82. Convey("Can read properties", func() {
  83. alertQuery := m.GetAlertsQuery{DashboardId: testDash.Id, PanelId: 1, OrgId: 1}
  84. err2 := HandleAlertsQuery(&alertQuery)
  85. alert := alertQuery.Result[0]
  86. So(err2, ShouldBeNil)
  87. So(alert.Name, ShouldEqual, "Alerting title")
  88. So(alert.Message, ShouldEqual, "Alerting message")
  89. So(alert.State, ShouldEqual, "pending")
  90. So(alert.Frequency, ShouldEqual, 1)
  91. })
  92. Convey("Alerts with same dashboard id and panel id should update", func() {
  93. modifiedItems := items
  94. modifiedItems[0].Name = "Name"
  95. modifiedCmd := m.SaveAlertsCommand{
  96. DashboardId: testDash.Id,
  97. OrgId: 1,
  98. UserId: 1,
  99. Alerts: modifiedItems,
  100. }
  101. err := SaveAlerts(&modifiedCmd)
  102. Convey("Can save alerts with same dashboard and panel id", func() {
  103. So(err, ShouldBeNil)
  104. })
  105. Convey("Alerts should be updated", func() {
  106. query := m.GetAlertsQuery{DashboardId: testDash.Id, OrgId: 1}
  107. err2 := HandleAlertsQuery(&query)
  108. So(err2, ShouldBeNil)
  109. So(len(query.Result), ShouldEqual, 1)
  110. So(query.Result[0].Name, ShouldEqual, "Name")
  111. Convey("Alert state should not be updated", func() {
  112. So(query.Result[0].State, ShouldEqual, "pending")
  113. })
  114. })
  115. Convey("Updates without changes should be ignored", func() {
  116. err3 := SaveAlerts(&modifiedCmd)
  117. So(err3, ShouldBeNil)
  118. })
  119. })
  120. Convey("Multiple alerts per dashboard", func() {
  121. multipleItems := []*m.Alert{
  122. {
  123. DashboardId: testDash.Id,
  124. PanelId: 1,
  125. Name: "1",
  126. OrgId: 1,
  127. Settings: simplejson.New(),
  128. },
  129. {
  130. DashboardId: testDash.Id,
  131. PanelId: 2,
  132. Name: "2",
  133. OrgId: 1,
  134. Settings: simplejson.New(),
  135. },
  136. {
  137. DashboardId: testDash.Id,
  138. PanelId: 3,
  139. Name: "3",
  140. OrgId: 1,
  141. Settings: simplejson.New(),
  142. },
  143. }
  144. cmd.Alerts = multipleItems
  145. err = SaveAlerts(&cmd)
  146. Convey("Should save 3 dashboards", func() {
  147. So(err, ShouldBeNil)
  148. queryForDashboard := m.GetAlertsQuery{DashboardId: testDash.Id, OrgId: 1}
  149. err2 := HandleAlertsQuery(&queryForDashboard)
  150. So(err2, ShouldBeNil)
  151. So(len(queryForDashboard.Result), ShouldEqual, 3)
  152. })
  153. Convey("should updated two dashboards and delete one", func() {
  154. missingOneAlert := multipleItems[:2]
  155. cmd.Alerts = missingOneAlert
  156. err = SaveAlerts(&cmd)
  157. Convey("should delete the missing alert", func() {
  158. query := m.GetAlertsQuery{DashboardId: testDash.Id, OrgId: 1}
  159. err2 := HandleAlertsQuery(&query)
  160. So(err2, ShouldBeNil)
  161. So(len(query.Result), ShouldEqual, 2)
  162. })
  163. })
  164. })
  165. Convey("When dashboard is removed", func() {
  166. items := []*m.Alert{
  167. {
  168. PanelId: 1,
  169. DashboardId: testDash.Id,
  170. Name: "Alerting title",
  171. Message: "Alerting message",
  172. },
  173. }
  174. cmd := m.SaveAlertsCommand{
  175. Alerts: items,
  176. DashboardId: testDash.Id,
  177. OrgId: 1,
  178. UserId: 1,
  179. }
  180. SaveAlerts(&cmd)
  181. err = DeleteDashboard(&m.DeleteDashboardCommand{
  182. OrgId: 1,
  183. Id: testDash.Id,
  184. })
  185. So(err, ShouldBeNil)
  186. Convey("Alerts should be removed", func() {
  187. query := m.GetAlertsQuery{DashboardId: testDash.Id, OrgId: 1}
  188. err2 := HandleAlertsQuery(&query)
  189. So(testDash.Id, ShouldEqual, 1)
  190. So(err2, ShouldBeNil)
  191. So(len(query.Result), ShouldEqual, 0)
  192. })
  193. })
  194. })
  195. }
  196. func pauseAllAlerts(pauseState bool) error {
  197. cmd := &m.PauseAllAlertCommand{
  198. Paused: pauseState,
  199. }
  200. err := PauseAllAlerts(cmd)
  201. So(err, ShouldBeNil)
  202. return err
  203. }
  204. func TestPausingAlerts(t *testing.T) {
  205. mockTimeNow()
  206. defer resetTimeNow()
  207. Convey("Given an alert", t, func() {
  208. InitTestDB(t)
  209. testDash := insertTestDashboard("dashboard with alerts", 1, 0, false, "alert")
  210. alert, _ := insertTestAlert("Alerting title", "Alerting message", testDash.OrgId, testDash.Id, simplejson.New())
  211. stateDateBeforePause := alert.NewStateDate
  212. stateDateAfterPause := stateDateBeforePause
  213. Convey("when paused", func() {
  214. pauseAlert(testDash.OrgId, 1, true)
  215. Convey("the NewStateDate should be updated", func() {
  216. alert, err := getAlertById(1)
  217. So(err, ShouldBeNil)
  218. stateDateAfterPause = alert.NewStateDate
  219. So(stateDateBeforePause, ShouldHappenBefore, stateDateAfterPause)
  220. })
  221. })
  222. Convey("when unpaused", func() {
  223. pauseAlert(testDash.OrgId, 1, false)
  224. Convey("the NewStateDate should be updated again", func() {
  225. alert, err := getAlertById(1)
  226. So(err, ShouldBeNil)
  227. stateDateAfterUnpause := alert.NewStateDate
  228. So(stateDateAfterPause, ShouldHappenBefore, stateDateAfterUnpause)
  229. })
  230. })
  231. })
  232. }
  233. func pauseAlert(orgId int64, alertId int64, pauseState bool) (int64, error) {
  234. cmd := &m.PauseAlertCommand{
  235. OrgId: orgId,
  236. AlertIds: []int64{alertId},
  237. Paused: pauseState,
  238. }
  239. err := PauseAlert(cmd)
  240. So(err, ShouldBeNil)
  241. return cmd.ResultCount, err
  242. }
  243. func insertTestAlert(title string, message string, orgId int64, dashId int64, settings *simplejson.Json) (*m.Alert, error) {
  244. items := []*m.Alert{
  245. {
  246. PanelId: 1,
  247. DashboardId: dashId,
  248. OrgId: orgId,
  249. Name: title,
  250. Message: message,
  251. Settings: settings,
  252. Frequency: 1,
  253. },
  254. }
  255. cmd := m.SaveAlertsCommand{
  256. Alerts: items,
  257. DashboardId: dashId,
  258. OrgId: orgId,
  259. UserId: 1,
  260. }
  261. err := SaveAlerts(&cmd)
  262. return cmd.Alerts[0], err
  263. }
  264. func getAlertById(id int64) (*m.Alert, error) {
  265. q := &m.GetAlertByIdQuery{
  266. Id: id,
  267. }
  268. err := GetAlertById(q)
  269. So(err, ShouldBeNil)
  270. return q.Result, err
  271. }