alerting_test.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package api
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/grafana/grafana/pkg/api/dtos"
  6. "github.com/grafana/grafana/pkg/bus"
  7. m "github.com/grafana/grafana/pkg/models"
  8. "github.com/grafana/grafana/pkg/services/search"
  9. . "github.com/smartystreets/goconvey/convey"
  10. )
  11. func TestRemoveZeroUnitsFromInterval(t *testing.T) {
  12. tcs := []struct {
  13. interval time.Duration
  14. expected string
  15. }{
  16. {interval: time.Duration(time.Hour), expected: "1h"},
  17. {interval: time.Duration(time.Hour + time.Minute), expected: "1h1m"},
  18. {interval: time.Duration((time.Hour * 10) + time.Minute), expected: "10h1m"},
  19. }
  20. for _, tc := range tcs {
  21. got := removeZeroesFromDuration(tc.interval)
  22. if got != tc.expected {
  23. t.Errorf("expected %s got %s internval: %v", tc.expected, got, tc.interval)
  24. }
  25. }
  26. }
  27. func TestAlertingApiEndpoint(t *testing.T) {
  28. Convey("Given an alert in a dashboard with an acl", t, func() {
  29. singleAlert := &m.Alert{Id: 1, DashboardId: 1, Name: "singlealert"}
  30. bus.AddHandler("test", func(query *m.GetAlertByIdQuery) error {
  31. query.Result = singleAlert
  32. return nil
  33. })
  34. viewerRole := m.ROLE_VIEWER
  35. editorRole := m.ROLE_EDITOR
  36. aclMockResp := []*m.DashboardAclInfoDTO{}
  37. bus.AddHandler("test", func(query *m.GetDashboardAclInfoListQuery) error {
  38. query.Result = aclMockResp
  39. return nil
  40. })
  41. bus.AddHandler("test", func(query *m.GetTeamsByUserQuery) error {
  42. query.Result = []*m.Team{}
  43. return nil
  44. })
  45. Convey("When user is editor and not in the ACL", func() {
  46. Convey("Should not be able to pause the alert", func() {
  47. cmd := dtos.PauseAlertCommand{
  48. AlertId: 1,
  49. Paused: true,
  50. }
  51. postAlertScenario("When calling POST on", "/api/alerts/1/pause", "/api/alerts/:alertId/pause", m.ROLE_EDITOR, cmd, func(sc *scenarioContext) {
  52. CallPauseAlert(sc)
  53. So(sc.resp.Code, ShouldEqual, 403)
  54. })
  55. })
  56. })
  57. Convey("When user is editor and dashboard has default ACL", func() {
  58. aclMockResp = []*m.DashboardAclInfoDTO{
  59. {Role: &viewerRole, Permission: m.PERMISSION_VIEW},
  60. {Role: &editorRole, Permission: m.PERMISSION_EDIT},
  61. }
  62. Convey("Should be able to pause the alert", func() {
  63. cmd := dtos.PauseAlertCommand{
  64. AlertId: 1,
  65. Paused: true,
  66. }
  67. postAlertScenario("When calling POST on", "/api/alerts/1/pause", "/api/alerts/:alertId/pause", m.ROLE_EDITOR, cmd, func(sc *scenarioContext) {
  68. CallPauseAlert(sc)
  69. So(sc.resp.Code, ShouldEqual, 200)
  70. })
  71. })
  72. })
  73. loggedInUserScenarioWithRole("When calling GET on", "GET", "/api/alerts?dashboardId=1", "/api/alerts", m.ROLE_EDITOR, func(sc *scenarioContext) {
  74. var searchQuery *search.Query
  75. bus.AddHandler("test", func(query *search.Query) error {
  76. searchQuery = query
  77. return nil
  78. })
  79. var getAlertsQuery *m.GetAlertsQuery
  80. bus.AddHandler("test", func(query *m.GetAlertsQuery) error {
  81. getAlertsQuery = query
  82. return nil
  83. })
  84. sc.handlerFunc = GetAlerts
  85. sc.fakeReqWithParams("GET", sc.url, map[string]string{}).exec()
  86. So(searchQuery, ShouldBeNil)
  87. So(getAlertsQuery, ShouldNotBeNil)
  88. })
  89. loggedInUserScenarioWithRole("When calling GET on", "GET", "/api/alerts?dashboardId=1&dashboardId=2&folderId=3&dashboardTag=abc&dashboardQuery=dbQuery&limit=5&query=alertQuery", "/api/alerts", m.ROLE_EDITOR, func(sc *scenarioContext) {
  90. var searchQuery *search.Query
  91. bus.AddHandler("test", func(query *search.Query) error {
  92. searchQuery = query
  93. query.Result = search.HitList{
  94. &search.Hit{Id: 1},
  95. &search.Hit{Id: 2},
  96. }
  97. return nil
  98. })
  99. var getAlertsQuery *m.GetAlertsQuery
  100. bus.AddHandler("test", func(query *m.GetAlertsQuery) error {
  101. getAlertsQuery = query
  102. return nil
  103. })
  104. sc.handlerFunc = GetAlerts
  105. sc.fakeReqWithParams("GET", sc.url, map[string]string{}).exec()
  106. So(searchQuery, ShouldNotBeNil)
  107. So(searchQuery.DashboardIds[0], ShouldEqual, 1)
  108. So(searchQuery.DashboardIds[1], ShouldEqual, 2)
  109. So(searchQuery.FolderIds[0], ShouldEqual, 3)
  110. So(searchQuery.Tags[0], ShouldEqual, "abc")
  111. So(searchQuery.Title, ShouldEqual, "dbQuery")
  112. So(getAlertsQuery, ShouldNotBeNil)
  113. So(getAlertsQuery.DashboardIDs[0], ShouldEqual, 1)
  114. So(getAlertsQuery.DashboardIDs[1], ShouldEqual, 2)
  115. So(getAlertsQuery.Limit, ShouldEqual, 5)
  116. So(getAlertsQuery.Query, ShouldEqual, "alertQuery")
  117. })
  118. })
  119. }
  120. func CallPauseAlert(sc *scenarioContext) {
  121. bus.AddHandler("test", func(cmd *m.PauseAlertCommand) error {
  122. return nil
  123. })
  124. sc.fakeReqWithParams("POST", sc.url, map[string]string{}).exec()
  125. }
  126. func postAlertScenario(desc string, url string, routePattern string, role m.RoleType, cmd dtos.PauseAlertCommand, fn scenarioFunc) {
  127. Convey(desc+" "+url, func() {
  128. defer bus.ClearBusHandlers()
  129. sc := setupScenarioContext(url)
  130. sc.defaultHandler = wrap(func(c *m.ReqContext) Response {
  131. sc.context = c
  132. sc.context.UserId = TestUserID
  133. sc.context.OrgId = TestOrgID
  134. sc.context.OrgRole = role
  135. return PauseAlert(c, cmd)
  136. })
  137. sc.m.Post(routePattern, sc.defaultHandler)
  138. fn(sc)
  139. })
  140. }