alert_test.go 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  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, _ := getAlertById(1)
  57. stateDateBeforePause := alert.NewStateDate
  58. Convey("can pause all alerts", func() {
  59. pauseAllAlerts(true)
  60. Convey("cannot updated paused alert", func() {
  61. cmd := &m.SetAlertStateCommand{
  62. AlertId: 1,
  63. State: m.AlertStateOK,
  64. }
  65. err = SetAlertState(cmd)
  66. So(err, ShouldNotBeNil)
  67. })
  68. Convey("pausing alerts should update their NewStateDate", func() {
  69. alert, _ = getAlertById(1)
  70. stateDateAfterPause := alert.NewStateDate
  71. So(stateDateBeforePause, ShouldHappenBefore, stateDateAfterPause)
  72. })
  73. Convey("unpausing alerts should update their NewStateDate again", func() {
  74. pauseAllAlerts(false)
  75. alert, _ = getAlertById(1)
  76. stateDateAfterUnpause := alert.NewStateDate
  77. So(stateDateBeforePause, ShouldHappenBefore, stateDateAfterUnpause)
  78. })
  79. })
  80. })
  81. Convey("Can read properties", func() {
  82. alertQuery := m.GetAlertsQuery{DashboardId: testDash.Id, PanelId: 1, OrgId: 1, User: &m.SignedInUser{OrgRole: m.ROLE_ADMIN}}
  83. err2 := HandleAlertsQuery(&alertQuery)
  84. alert := alertQuery.Result[0]
  85. So(err2, ShouldBeNil)
  86. So(alert.Name, ShouldEqual, "Alerting title")
  87. So(alert.State, ShouldEqual, "pending")
  88. })
  89. Convey("Viewer cannot read alerts", func() {
  90. alertQuery := m.GetAlertsQuery{DashboardId: testDash.Id, PanelId: 1, OrgId: 1, User: &m.SignedInUser{OrgRole: m.ROLE_VIEWER}}
  91. err2 := HandleAlertsQuery(&alertQuery)
  92. So(err2, ShouldBeNil)
  93. So(alertQuery.Result, ShouldHaveLength, 0)
  94. })
  95. Convey("Alerts with same dashboard id and panel id should update", func() {
  96. modifiedItems := items
  97. modifiedItems[0].Name = "Name"
  98. modifiedCmd := m.SaveAlertsCommand{
  99. DashboardId: testDash.Id,
  100. OrgId: 1,
  101. UserId: 1,
  102. Alerts: modifiedItems,
  103. }
  104. err := SaveAlerts(&modifiedCmd)
  105. Convey("Can save alerts with same dashboard and panel id", func() {
  106. So(err, ShouldBeNil)
  107. })
  108. Convey("Alerts should be updated", func() {
  109. query := m.GetAlertsQuery{DashboardId: testDash.Id, OrgId: 1, User: &m.SignedInUser{OrgRole: m.ROLE_ADMIN}}
  110. err2 := HandleAlertsQuery(&query)
  111. So(err2, ShouldBeNil)
  112. So(len(query.Result), ShouldEqual, 1)
  113. So(query.Result[0].Name, ShouldEqual, "Name")
  114. Convey("Alert state should not be updated", func() {
  115. So(query.Result[0].State, ShouldEqual, "pending")
  116. })
  117. })
  118. Convey("Updates without changes should be ignored", func() {
  119. err3 := SaveAlerts(&modifiedCmd)
  120. So(err3, ShouldBeNil)
  121. })
  122. })
  123. Convey("Multiple alerts per dashboard", func() {
  124. multipleItems := []*m.Alert{
  125. {
  126. DashboardId: testDash.Id,
  127. PanelId: 1,
  128. Name: "1",
  129. OrgId: 1,
  130. Settings: simplejson.New(),
  131. },
  132. {
  133. DashboardId: testDash.Id,
  134. PanelId: 2,
  135. Name: "2",
  136. OrgId: 1,
  137. Settings: simplejson.New(),
  138. },
  139. {
  140. DashboardId: testDash.Id,
  141. PanelId: 3,
  142. Name: "3",
  143. OrgId: 1,
  144. Settings: simplejson.New(),
  145. },
  146. }
  147. cmd.Alerts = multipleItems
  148. err = SaveAlerts(&cmd)
  149. Convey("Should save 3 dashboards", func() {
  150. So(err, ShouldBeNil)
  151. queryForDashboard := m.GetAlertsQuery{DashboardId: testDash.Id, OrgId: 1, User: &m.SignedInUser{OrgRole: m.ROLE_ADMIN}}
  152. err2 := HandleAlertsQuery(&queryForDashboard)
  153. So(err2, ShouldBeNil)
  154. So(len(queryForDashboard.Result), ShouldEqual, 3)
  155. })
  156. Convey("should updated two dashboards and delete one", func() {
  157. missingOneAlert := multipleItems[:2]
  158. cmd.Alerts = missingOneAlert
  159. err = SaveAlerts(&cmd)
  160. Convey("should delete the missing alert", func() {
  161. query := m.GetAlertsQuery{DashboardId: testDash.Id, OrgId: 1, User: &m.SignedInUser{OrgRole: m.ROLE_ADMIN}}
  162. err2 := HandleAlertsQuery(&query)
  163. So(err2, ShouldBeNil)
  164. So(len(query.Result), ShouldEqual, 2)
  165. })
  166. })
  167. })
  168. Convey("When dashboard is removed", func() {
  169. items := []*m.Alert{
  170. {
  171. PanelId: 1,
  172. DashboardId: testDash.Id,
  173. Name: "Alerting title",
  174. Message: "Alerting message",
  175. },
  176. }
  177. cmd := m.SaveAlertsCommand{
  178. Alerts: items,
  179. DashboardId: testDash.Id,
  180. OrgId: 1,
  181. UserId: 1,
  182. }
  183. SaveAlerts(&cmd)
  184. err = DeleteDashboard(&m.DeleteDashboardCommand{
  185. OrgId: 1,
  186. Id: testDash.Id,
  187. })
  188. So(err, ShouldBeNil)
  189. Convey("Alerts should be removed", func() {
  190. query := m.GetAlertsQuery{DashboardId: testDash.Id, OrgId: 1, User: &m.SignedInUser{OrgRole: m.ROLE_ADMIN}}
  191. err2 := HandleAlertsQuery(&query)
  192. So(testDash.Id, ShouldEqual, 1)
  193. So(err2, ShouldBeNil)
  194. So(len(query.Result), ShouldEqual, 0)
  195. })
  196. })
  197. })
  198. }
  199. func TestPausingAlerts(t *testing.T) {
  200. mockTimeNow()
  201. defer resetTimeNow()
  202. Convey("Given an alert", t, func() {
  203. InitTestDB(t)
  204. testDash := insertTestDashboard("dashboard with alerts", 1, 0, false, "alert")
  205. alert, _ := insertTestAlert("Alerting title", "Alerting message", testDash.OrgId, testDash.Id, simplejson.New())
  206. stateDateBeforePause := alert.NewStateDate
  207. stateDateAfterPause := stateDateBeforePause
  208. Convey("when paused", func() {
  209. pauseAlert(testDash.OrgId, 1, true)
  210. Convey("the NewStateDate should be updated", func() {
  211. alert, _ := getAlertById(1)
  212. stateDateAfterPause = alert.NewStateDate
  213. So(stateDateBeforePause, ShouldHappenBefore, stateDateAfterPause)
  214. })
  215. })
  216. Convey("when unpaused", func() {
  217. pauseAlert(testDash.OrgId, 1, false)
  218. Convey("the NewStateDate should be updated again", func() {
  219. alert, _ := getAlertById(1)
  220. stateDateAfterUnpause := alert.NewStateDate
  221. So(stateDateAfterPause, ShouldHappenBefore, stateDateAfterUnpause)
  222. })
  223. })
  224. })
  225. }
  226. func pauseAlert(orgId int64, alertId int64, pauseState bool) (int64, error) {
  227. cmd := &m.PauseAlertCommand{
  228. OrgId: orgId,
  229. AlertIds: []int64{alertId},
  230. Paused: pauseState,
  231. }
  232. err := PauseAlert(cmd)
  233. So(err, ShouldBeNil)
  234. return cmd.ResultCount, err
  235. }
  236. func insertTestAlert(title string, message string, orgId int64, dashId int64, settings *simplejson.Json) (*m.Alert, error) {
  237. items := []*m.Alert{
  238. {
  239. PanelId: 1,
  240. DashboardId: dashId,
  241. OrgId: orgId,
  242. Name: title,
  243. Message: message,
  244. Settings: settings,
  245. Frequency: 1,
  246. },
  247. }
  248. cmd := m.SaveAlertsCommand{
  249. Alerts: items,
  250. DashboardId: dashId,
  251. OrgId: orgId,
  252. UserId: 1,
  253. }
  254. err := SaveAlerts(&cmd)
  255. return cmd.Alerts[0], err
  256. }
  257. func getAlertById(id int64) (*m.Alert, error) {
  258. q := &m.GetAlertByIdQuery{
  259. Id: id,
  260. }
  261. err := GetAlertById(q)
  262. So(err, ShouldBeNil)
  263. return q.Result, err
  264. }
  265. func pauseAllAlerts(pauseState bool) error {
  266. cmd := &m.PauseAllAlertCommand{
  267. Paused: pauseState,
  268. }
  269. err := PauseAllAlerts(cmd)
  270. So(err, ShouldBeNil)
  271. return err
  272. }