2018-01-30 07:41:25 -06:00
package api
import (
"testing"
"github.com/grafana/grafana/pkg/api/dtos"
"github.com/grafana/grafana/pkg/bus"
2019-08-12 13:03:48 -05:00
"github.com/grafana/grafana/pkg/models"
2018-06-01 07:36:40 -05:00
"github.com/grafana/grafana/pkg/services/search"
2018-01-30 07:41:25 -06:00
. "github.com/smartystreets/goconvey/convey"
)
func TestAlertingApiEndpoint ( t * testing . T ) {
Convey ( "Given an alert in a dashboard with an acl" , t , func ( ) {
2019-08-12 13:03:48 -05:00
singleAlert := & models . Alert { Id : 1 , DashboardId : 1 , Name : "singlealert" }
2018-01-30 07:41:25 -06:00
2019-08-12 13:03:48 -05:00
bus . AddHandler ( "test" , func ( query * models . GetAlertByIdQuery ) error {
2018-01-30 07:41:25 -06:00
query . Result = singleAlert
return nil
} )
2019-08-12 13:03:48 -05:00
viewerRole := models . ROLE_VIEWER
editorRole := models . ROLE_EDITOR
2018-01-30 07:41:25 -06:00
2019-08-12 13:03:48 -05:00
aclMockResp := [ ] * models . DashboardAclInfoDTO { }
bus . AddHandler ( "test" , func ( query * models . GetDashboardAclInfoListQuery ) error {
2018-01-30 07:41:25 -06:00
query . Result = aclMockResp
return nil
} )
2019-08-12 13:03:48 -05:00
bus . AddHandler ( "test" , func ( query * models . GetTeamsByUserQuery ) error {
query . Result = [ ] * models . TeamDTO { }
2018-01-30 07:41:25 -06:00
return nil
} )
Convey ( "When user is editor and not in the ACL" , func ( ) {
Convey ( "Should not be able to pause the alert" , func ( ) {
cmd := dtos . PauseAlertCommand {
AlertId : 1 ,
Paused : true ,
}
2019-08-12 13:03:48 -05:00
postAlertScenario ( "When calling POST on" , "/api/alerts/1/pause" , "/api/alerts/:alertId/pause" , models . ROLE_EDITOR , cmd , func ( sc * scenarioContext ) {
2018-01-30 07:41:25 -06:00
CallPauseAlert ( sc )
So ( sc . resp . Code , ShouldEqual , 403 )
} )
} )
} )
Convey ( "When user is editor and dashboard has default ACL" , func ( ) {
2019-08-12 13:03:48 -05:00
aclMockResp = [ ] * models . DashboardAclInfoDTO {
{ Role : & viewerRole , Permission : models . PERMISSION_VIEW } ,
{ Role : & editorRole , Permission : models . PERMISSION_EDIT } ,
2018-01-30 07:41:25 -06:00
}
Convey ( "Should be able to pause the alert" , func ( ) {
cmd := dtos . PauseAlertCommand {
AlertId : 1 ,
Paused : true ,
}
2019-08-12 13:03:48 -05:00
postAlertScenario ( "When calling POST on" , "/api/alerts/1/pause" , "/api/alerts/:alertId/pause" , models . ROLE_EDITOR , cmd , func ( sc * scenarioContext ) {
2018-01-30 07:41:25 -06:00
CallPauseAlert ( sc )
So ( sc . resp . Code , ShouldEqual , 200 )
} )
} )
} )
2018-06-01 07:36:40 -05:00
2019-08-12 13:03:48 -05:00
loggedInUserScenarioWithRole ( "When calling GET on" , "GET" , "/api/alerts?dashboardId=1" , "/api/alerts" , models . ROLE_EDITOR , func ( sc * scenarioContext ) {
2018-06-01 07:36:40 -05:00
var searchQuery * search . Query
bus . AddHandler ( "test" , func ( query * search . Query ) error {
searchQuery = query
return nil
} )
2019-08-12 13:03:48 -05:00
var getAlertsQuery * models . GetAlertsQuery
bus . AddHandler ( "test" , func ( query * models . GetAlertsQuery ) error {
2018-06-01 07:36:40 -05:00
getAlertsQuery = query
return nil
} )
sc . handlerFunc = GetAlerts
sc . fakeReqWithParams ( "GET" , sc . url , map [ string ] string { } ) . exec ( )
So ( searchQuery , ShouldBeNil )
So ( getAlertsQuery , ShouldNotBeNil )
} )
2019-08-12 13:03:48 -05:00
loggedInUserScenarioWithRole ( "When calling GET on" , "GET" , "/api/alerts?dashboardId=1&dashboardId=2&folderId=3&dashboardTag=abc&dashboardQuery=dbQuery&limit=5&query=alertQuery" , "/api/alerts" , models . ROLE_EDITOR , func ( sc * scenarioContext ) {
2018-06-01 07:36:40 -05:00
var searchQuery * search . Query
bus . AddHandler ( "test" , func ( query * search . Query ) error {
searchQuery = query
query . Result = search . HitList {
& search . Hit { Id : 1 } ,
& search . Hit { Id : 2 } ,
}
return nil
} )
2019-08-12 13:03:48 -05:00
var getAlertsQuery * models . GetAlertsQuery
bus . AddHandler ( "test" , func ( query * models . GetAlertsQuery ) error {
2018-06-01 07:36:40 -05:00
getAlertsQuery = query
return nil
} )
sc . handlerFunc = GetAlerts
sc . fakeReqWithParams ( "GET" , sc . url , map [ string ] string { } ) . exec ( )
So ( searchQuery , ShouldNotBeNil )
So ( searchQuery . DashboardIds [ 0 ] , ShouldEqual , 1 )
So ( searchQuery . DashboardIds [ 1 ] , ShouldEqual , 2 )
So ( searchQuery . FolderIds [ 0 ] , ShouldEqual , 3 )
So ( searchQuery . Tags [ 0 ] , ShouldEqual , "abc" )
So ( searchQuery . Title , ShouldEqual , "dbQuery" )
So ( getAlertsQuery , ShouldNotBeNil )
So ( getAlertsQuery . DashboardIDs [ 0 ] , ShouldEqual , 1 )
So ( getAlertsQuery . DashboardIDs [ 1 ] , ShouldEqual , 2 )
So ( getAlertsQuery . Limit , ShouldEqual , 5 )
So ( getAlertsQuery . Query , ShouldEqual , "alertQuery" )
} )
2019-01-13 13:30:20 -06:00
2019-08-12 13:03:48 -05:00
loggedInUserScenarioWithRole ( "When calling GET on" , "GET" , "/api/alert-notifications/1" , "/alert-notifications/:notificationId" , models . ROLE_ADMIN , func ( sc * scenarioContext ) {
2019-01-13 13:30:20 -06:00
sc . handlerFunc = GetAlertNotificationByID
sc . fakeReqWithParams ( "GET" , sc . url , map [ string ] string { } ) . exec ( )
So ( sc . resp . Code , ShouldEqual , 404 )
} )
2018-01-30 07:41:25 -06:00
} )
}
func CallPauseAlert ( sc * scenarioContext ) {
2019-08-12 13:03:48 -05:00
bus . AddHandler ( "test" , func ( cmd * models . PauseAlertCommand ) error {
2018-01-30 07:41:25 -06:00
return nil
} )
sc . fakeReqWithParams ( "POST" , sc . url , map [ string ] string { } ) . exec ( )
}
2019-08-12 13:03:48 -05:00
func postAlertScenario ( desc string , url string , routePattern string , role models . RoleType , cmd dtos . PauseAlertCommand , fn scenarioFunc ) {
2018-01-30 07:41:25 -06:00
Convey ( desc + " " + url , func ( ) {
defer bus . ClearBusHandlers ( )
sc := setupScenarioContext ( url )
2019-08-12 13:03:48 -05:00
sc . defaultHandler = Wrap ( func ( c * models . ReqContext ) Response {
2018-01-30 07:41:25 -06:00
sc . context = c
sc . context . UserId = TestUserID
sc . context . OrgId = TestOrgID
sc . context . OrgRole = role
return PauseAlert ( c , cmd )
} )
sc . m . Post ( routePattern , sc . defaultHandler )
fn ( sc )
} )
}