@ -31,12 +31,14 @@ import (
"github.com/grafana/grafana/pkg/services/guardian"
"github.com/grafana/grafana/pkg/services/libraryelements"
"github.com/grafana/grafana/pkg/services/live"
"github.com/grafana/grafana/pkg/services/org"
pref "github.com/grafana/grafana/pkg/services/preference"
"github.com/grafana/grafana/pkg/services/preference/preftest"
"github.com/grafana/grafana/pkg/services/provisioning"
"github.com/grafana/grafana/pkg/services/quota/quotaimpl"
"github.com/grafana/grafana/pkg/services/sqlstore"
"github.com/grafana/grafana/pkg/services/sqlstore/mockstore"
"github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/web"
)
@ -45,7 +47,7 @@ func TestGetHomeDashboard(t *testing.T) {
httpReq , err := http . NewRequest ( http . MethodGet , "" , nil )
require . NoError ( t , err )
httpReq . Header . Add ( "Content-Type" , "application/json" )
req := & models . ReqContext { SignedInUser : & models . SignedInUser { } , Context : & web . Context { Req : httpReq } }
req := & models . ReqContext { SignedInUser : & user . SignedInUser { } , Context : & web . Context { Req : httpReq } }
cfg := setting . NewCfg ( )
cfg . StaticRootPath = "../../public/"
prefService := preftest . NewPreferenceServiceFake ( )
@ -145,8 +147,8 @@ func TestDashboardAPIEndpoint(t *testing.T) {
}
setUp := func ( ) {
viewerRole := models . ROLE_VIEWER
editorRole := models . ROLE_EDITOR
viewerRole := org . RoleViewer
editorRole := org . RoleEditor
dashboardService . On ( "GetDashboardACLInfoList" , mock . Anything , mock . AnythingOfType ( "*models.GetDashboardACLInfoListQuery" ) ) . Run ( func ( args mock . Arguments ) {
q := args . Get ( 1 ) . ( * models . GetDashboardACLInfoListQuery )
q . Result = [ ] * models . DashboardACLInfoDTO {
@ -162,7 +164,7 @@ func TestDashboardAPIEndpoint(t *testing.T) {
// 2. user is an org editor
t . Run ( "When user is an Org Viewer" , func ( t * testing . T ) {
role := models . ROLE_VIEWER
role := org . RoleViewer
loggedInUserScenarioWithRole ( t , "When calling GET on" , "GET" , "/api/dashboards/uid/abcdefghi" ,
"/api/dashboards/uid/:uid" , role , func ( sc * scenarioContext ) {
setUp ( )
@ -194,7 +196,7 @@ func TestDashboardAPIEndpoint(t *testing.T) {
} )
t . Run ( "When user is an Org Editor" , func ( t * testing . T ) {
role := models . ROLE_EDITOR
role := org . RoleEditor
loggedInUserScenarioWithRole ( t , "When calling GET on" , "GET" , "/api/dashboards/uid/abcdefghi" ,
"/api/dashboards/uid/:uid" , role , func ( sc * scenarioContext ) {
setUp ( )
@ -283,7 +285,7 @@ func TestDashboardAPIEndpoint(t *testing.T) {
// 6. user is an org editor AND has been granted a view permission
t . Run ( "When user is an Org Viewer and has no permissions for this dashboard" , func ( t * testing . T ) {
role := models . ROLE_VIEWER
role := org . RoleViewer
loggedInUserScenarioWithRole ( t , "When calling GET on" , "GET" , "/api/dashboards/uid/abcdefghi" ,
"/api/dashboards/uid/:uid" , role , func ( sc * scenarioContext ) {
setUp ( )
@ -322,7 +324,7 @@ func TestDashboardAPIEndpoint(t *testing.T) {
} )
t . Run ( "When user is an Org Editor and has no permissions for this dashboard" , func ( t * testing . T ) {
role := models . ROLE_EDITOR
role := org . RoleEditor
loggedInUserScenarioWithRole ( t , "When calling GET on" , "GET" , "/api/dashboards/uid/abcdefghi" ,
"/api/dashboards/uid/:uid" , role , func ( sc * scenarioContext ) {
setUp ( )
@ -359,7 +361,7 @@ func TestDashboardAPIEndpoint(t *testing.T) {
} )
t . Run ( "When user is an Org Viewer but has an edit permission" , func ( t * testing . T ) {
role := models . ROLE_VIEWER
role := org . RoleViewer
setUpInner := func ( ) {
origCanEdit := setting . ViewersCanEdit
@ -421,7 +423,7 @@ func TestDashboardAPIEndpoint(t *testing.T) {
} )
t . Run ( "When user is an Org Viewer and viewers can edit" , func ( t * testing . T ) {
role := models . ROLE_VIEWER
role := org . RoleViewer
setUpInner := func ( ) {
origCanEdit := setting . ViewersCanEdit
@ -461,7 +463,7 @@ func TestDashboardAPIEndpoint(t *testing.T) {
} )
t . Run ( "When user is an Org Viewer but has an admin permission" , func ( t * testing . T ) {
role := models . ROLE_VIEWER
role := org . RoleViewer
setUpInner := func ( ) {
origCanEdit := setting . ViewersCanEdit
@ -520,7 +522,7 @@ func TestDashboardAPIEndpoint(t *testing.T) {
} )
t . Run ( "When user is an Org Editor but has a view permission" , func ( t * testing . T ) {
role := models . ROLE_EDITOR
role := org . RoleEditor
setUpInner := func ( ) {
dashboardService := dashboards . NewFakeDashboardService ( t )
@ -758,7 +760,7 @@ func TestDashboardAPIEndpoint(t *testing.T) {
}
t . Run ( "when user does not have permission" , func ( t * testing . T ) {
role := models . ROLE_VIEWER
role := org . RoleViewer
postDiffScenario ( t , "When calling POST on" , "/api/dashboards/calculate-diff" , "/api/dashboards/calculate-diff" , cmd , role , func ( sc * scenarioContext ) {
setUp ( )
@ -768,7 +770,7 @@ func TestDashboardAPIEndpoint(t *testing.T) {
} )
t . Run ( "when user does have permission" , func ( t * testing . T ) {
role := models . ROLE_ADMIN
role := org . RoleAdmin
postDiffScenario ( t , "When calling POST on" , "/api/dashboards/calculate-diff" , "/api/dashboards/calculate-diff" , cmd , role , func ( sc * scenarioContext ) {
// This test shouldn't hit GetDashboardACLInfoList, so no setup needed
sc . dashboardVersionService = fakeDashboardVersionService
@ -872,7 +874,7 @@ func TestDashboardAPIEndpoint(t *testing.T) {
} ) . Return ( nil )
guardian . InitLegacyGuardian ( mockSQLStore , dashboardService )
loggedInUserScenarioWithRole ( t , "When calling GET on" , "GET" , "/api/dashboards/uid/dash" , "/api/dashboards/uid/:uid" , models . ROLE_EDITOR , func ( sc * scenarioContext ) {
loggedInUserScenarioWithRole ( t , "When calling GET on" , "GET" , "/api/dashboards/uid/dash" , "/api/dashboards/uid/:uid" , org . RoleEditor , func ( sc * scenarioContext ) {
fakeProvisioningService := provisioning . NewProvisioningServiceMock ( context . Background ( ) )
fakeProvisioningService . GetDashboardProvisionerResolvedPathFunc = func ( name string ) string {
return "/tmp/grafana/dashboards"
@ -883,7 +885,7 @@ func TestDashboardAPIEndpoint(t *testing.T) {
assert . Equal ( t , "../../../dashboard1.json" , dash . Meta . ProvisionedExternalId , mockSQLStore )
} , mockSQLStore )
loggedInUserScenarioWithRole ( t , "When allowUiUpdates is true and calling GET on" , "GET" , "/api/dashboards/uid/dash" , "/api/dashboards/uid/:uid" , models . ROLE_EDITOR , func ( sc * scenarioContext ) {
loggedInUserScenarioWithRole ( t , "When allowUiUpdates is true and calling GET on" , "GET" , "/api/dashboards/uid/dash" , "/api/dashboards/uid/:uid" , org . RoleEditor , func ( sc * scenarioContext ) {
fakeProvisioningService := provisioning . NewProvisioningServiceMock ( context . Background ( ) )
fakeProvisioningService . GetDashboardProvisionerResolvedPathFunc = func ( name string ) string {
return "/tmp/grafana/dashboards"
@ -1032,7 +1034,7 @@ func postDashboardScenario(t *testing.T, desc string, url string, routePattern s
c . Req . Body = mockRequestBody ( cmd )
c . Req . Header . Add ( "Content-Type" , "application/json" )
sc . context = c
sc . context . SignedInUser = & models . SignedInUser { OrgId : cmd . OrgId , UserId : cmd . UserId }
sc . context . SignedInUser = & user . SignedInUser { OrgId : cmd . OrgId , UserId : cmd . UserId }
return hs . PostDashboard ( c )
} )
@ -1044,7 +1046,7 @@ func postDashboardScenario(t *testing.T, desc string, url string, routePattern s
}
func postDiffScenario ( t * testing . T , desc string , url string , routePattern string , cmd dtos . CalculateDiffOptions ,
role models . RoleType , fn scenarioFunc , sqlmock sqlstore . Store , fakeDashboardVersionService * dashvertest . FakeDashboardVersionService ) {
role org . RoleType , fn scenarioFunc , sqlmock sqlstore . Store , fakeDashboardVersionService * dashvertest . FakeDashboardVersionService ) {
t . Run ( fmt . Sprintf ( "%s %s" , desc , url ) , func ( t * testing . T ) {
cfg := setting . NewCfg ( )
hs := HTTPServer {
@ -1065,7 +1067,7 @@ func postDiffScenario(t *testing.T, desc string, url string, routePattern string
c . Req . Body = mockRequestBody ( cmd )
c . Req . Header . Add ( "Content-Type" , "application/json" )
sc . context = c
sc . context . SignedInUser = & models . SignedInUser {
sc . context . SignedInUser = & user . SignedInUser {
OrgId : testOrgID ,
UserId : testUserID ,
}
@ -1106,11 +1108,11 @@ func restoreDashboardVersionScenario(t *testing.T, desc string, url string, rout
c . Req . Body = mockRequestBody ( cmd )
c . Req . Header . Add ( "Content-Type" , "application/json" )
sc . context = c
sc . context . SignedInUser = & models . SignedInUser {
sc . context . SignedInUser = & user . SignedInUser {
OrgId : testOrgID ,
UserId : testUserID ,
}
sc . context . OrgRole = models . ROLE_ADMIN
sc . context . OrgRole = org . RoleAdmin
return hs . RestoreDashboardVersion ( c )
} )
@ -1148,23 +1150,23 @@ func (m *mockLibraryPanelService) CleanLibraryPanelsForDashboard(dash *models.Da
return nil
}
func ( m * mockLibraryPanelService ) ConnectLibraryPanelsForDashboard ( c context . Context , signedInUser * models . SignedInUser , dash * models . Dashboard ) error {
func ( m * mockLibraryPanelService ) ConnectLibraryPanelsForDashboard ( c context . Context , signedInUser * user . SignedInUser , dash * models . Dashboard ) error {
return nil
}
func ( m * mockLibraryPanelService ) ImportLibraryPanelsForDashboard ( c context . Context , signedInUser * models . SignedInUser , libraryPanels * simplejson . Json , panels [ ] interface { } , folderID int64 ) error {
func ( m * mockLibraryPanelService ) ImportLibraryPanelsForDashboard ( c context . Context , signedInUser * user . SignedInUser , libraryPanels * simplejson . Json , panels [ ] interface { } , folderID int64 ) error {
return nil
}
type mockLibraryElementService struct {
}
func ( l * mockLibraryElementService ) CreateElement ( c context . Context , signedInUser * models . SignedInUser , cmd libraryelements . CreateLibraryElementCommand ) ( libraryelements . LibraryElementDTO , error ) {
func ( l * mockLibraryElementService ) CreateElement ( c context . Context , signedInUser * user . SignedInUser , cmd libraryelements . CreateLibraryElementCommand ) ( libraryelements . LibraryElementDTO , error ) {
return libraryelements . LibraryElementDTO { } , nil
}
// GetElement gets an element from a UID.
func ( l * mockLibraryElementService ) GetElement ( c context . Context , signedInUser * models . SignedInUser , UID string ) ( libraryelements . LibraryElementDTO , error ) {
func ( l * mockLibraryElementService ) GetElement ( c context . Context , signedInUser * user . SignedInUser , UID string ) ( libraryelements . LibraryElementDTO , error ) {
return libraryelements . LibraryElementDTO { } , nil
}
@ -1174,7 +1176,7 @@ func (l *mockLibraryElementService) GetElementsForDashboard(c context.Context, d
}
// ConnectElementsToDashboard connects elements to a specific dashboard.
func ( l * mockLibraryElementService ) ConnectElementsToDashboard ( c context . Context , signedInUser * models . SignedInUser , elementUIDs [ ] string , dashboardID int64 ) error {
func ( l * mockLibraryElementService ) ConnectElementsToDashboard ( c context . Context , signedInUser * user . SignedInUser , elementUIDs [ ] string , dashboardID int64 ) error {
return nil
}
@ -1184,6 +1186,6 @@ func (l *mockLibraryElementService) DisconnectElementsFromDashboard(c context.Co
}
// DeleteLibraryElementsInFolder deletes all elements for a specific folder.
func ( l * mockLibraryElementService ) DeleteLibraryElementsInFolder ( c context . Context , signedInUser * models . SignedInUser , folderUID string ) error {
func ( l * mockLibraryElementService ) DeleteLibraryElementsInFolder ( c context . Context , signedInUser * user . SignedInUser , folderUID string ) error {
return nil
}