@ -27,6 +27,8 @@ import (
"github.com/grafana/grafana/pkg/services/dashboards"
"github.com/grafana/grafana/pkg/services/dashboards/database"
"github.com/grafana/grafana/pkg/services/dashboards/service"
dashver "github.com/grafana/grafana/pkg/services/dashboardversion"
"github.com/grafana/grafana/pkg/services/dashboardversion/dashvertest"
"github.com/grafana/grafana/pkg/services/featuremgmt"
"github.com/grafana/grafana/pkg/services/guardian"
"github.com/grafana/grafana/pkg/services/libraryelements"
@ -49,13 +51,15 @@ func TestGetHomeDashboard(t *testing.T) {
cfg := setting . NewCfg ( )
cfg . StaticRootPath = "../../public/"
prefService := preftest . NewPreferenceServiceFake ( )
dashboardVersionService := dashvertest . NewDashboardVersionServiceFake ( )
hs := & HTTPServer {
Cfg : cfg ,
pluginStore : & fakePluginStore { } ,
SQLStore : mockstore . NewSQLStoreMock ( ) ,
CoremodelRegistry : setupDashboardCoremodel ( t ) ,
preferenceService : prefService ,
Cfg : cfg ,
pluginStore : & fakePluginStore { } ,
SQLStore : mockstore . NewSQLStoreMock ( ) ,
preferenceService : prefService ,
dashboardVersionService : dashboardVersionService ,
CoremodelRegistry : setupDashboardCoremodel ( t ) ,
}
tests := [ ] struct {
@ -122,6 +126,8 @@ func TestDashboardAPIEndpoint(t *testing.T) {
fakeDash . Id = 1
fakeDash . FolderId = 1
fakeDash . HasAcl = false
fakeDashboardVersionService := dashvertest . NewDashboardVersionServiceFake ( )
fakeDashboardVersionService . ExpectedDashboardVersion = & dashver . DashboardVersion { }
dashboardService := dashboards . NewFakeDashboardService ( t )
dashboardService . On ( "GetDashboard" , mock . Anything , mock . AnythingOfType ( "*models.GetDashboardQuery" ) ) . Run ( func ( args mock . Arguments ) {
q := args . Get ( 1 ) . ( * models . GetDashboardQuery )
@ -131,13 +137,14 @@ func TestDashboardAPIEndpoint(t *testing.T) {
mockSQLStore := mockstore . NewSQLStoreMock ( )
hs := & HTTPServer {
Cfg : setting . NewCfg ( ) ,
pluginStore : & fakePluginStore { } ,
SQLStore : mockSQLStore ,
CoremodelRegistry : setupDashboardCoremodel ( t ) ,
AccessControl : accesscontrolmock . New ( ) ,
Features : featuremgmt . WithFeatures ( ) ,
dashboardService : dashboardService ,
Cfg : setting . NewCfg ( ) ,
pluginStore : & fakePluginStore { } ,
SQLStore : mockSQLStore ,
AccessControl : accesscontrolmock . New ( ) ,
Features : featuremgmt . WithFeatures ( ) ,
dashboardService : dashboardService ,
dashboardVersionService : fakeDashboardVersionService ,
CoremodelRegistry : setupDashboardCoremodel ( t ) ,
}
setUp := func ( ) {
@ -225,6 +232,8 @@ func TestDashboardAPIEndpoint(t *testing.T) {
fakeDash . Id = 1
fakeDash . FolderId = 1
fakeDash . HasAcl = true
fakeDashboardVersionService := dashvertest . NewDashboardVersionServiceFake ( )
fakeDashboardVersionService . ExpectedDashboardVersion = & dashver . DashboardVersion { }
dashboardService := dashboards . NewFakeDashboardService ( t )
dashboardService . On ( "GetDashboard" , mock . Anything , mock . AnythingOfType ( "*models.GetDashboardQuery" ) ) . Run ( func ( args mock . Arguments ) {
q := args . Get ( 1 ) . ( * models . GetDashboardQuery )
@ -236,14 +245,15 @@ func TestDashboardAPIEndpoint(t *testing.T) {
sql := sqlstore . InitTestDB ( t )
hs := & HTTPServer {
Cfg : cfg ,
Live : newTestLive ( t , sql ) ,
LibraryPanelService : & mockLibraryPanelService { } ,
LibraryElementService : & mockLibraryElementService { } ,
CoremodelRegistry : setupDashboardCoremodel ( t ) ,
SQLStore : mockSQLStore ,
AccessControl : accesscontrolmock . New ( ) ,
dashboardService : dashboardService ,
Cfg : cfg ,
Live : newTestLive ( t , sql ) ,
LibraryPanelService : & mockLibraryPanelService { } ,
LibraryElementService : & mockLibraryElementService { } ,
SQLStore : mockSQLStore ,
AccessControl : accesscontrolmock . New ( ) ,
dashboardService : dashboardService ,
dashboardVersionService : fakeDashboardVersionService ,
CoremodelRegistry : setupDashboardCoremodel ( t ) ,
}
setUp := func ( ) {
@ -389,6 +399,7 @@ func TestDashboardAPIEndpoint(t *testing.T) {
loggedInUserScenarioWithRole ( t , "When calling GET on" , "GET" , "/api/dashboards/id/2/versions/1" , "/api/dashboards/id/:dashboardId/versions/:id" , role , func ( sc * scenarioContext ) {
setUpInner ( )
sc . sqlStore = mockSQLStore
sc . dashboardVersionService = fakeDashboardVersionService
hs . callGetDashboardVersion ( sc )
assert . Equal ( t , 200 , sc . resp . Code )
@ -705,6 +716,23 @@ func TestDashboardAPIEndpoint(t *testing.T) {
"title" : "Dash2" ,
} ) } ,
}
fakeDashboardVersionService := dashvertest . NewDashboardVersionServiceFake ( )
fakeDashboardVersionService . ExpectedDashboardVersions = [ ] * dashver . DashboardVersion {
{
DashboardID : 1 ,
Version : 1 ,
Data : simplejson . NewFromAny ( map [ string ] interface { } {
"title" : "Dash1" ,
} ) ,
} ,
{
DashboardID : 2 ,
Version : 2 ,
Data : simplejson . NewFromAny ( map [ string ] interface { } {
"title" : "Dash2" ,
} ) ,
} ,
}
sqlmock := mockstore . SQLStoreMock { ExpectedDashboardVersions : dashboardvs }
setUp := func ( ) {
mockResult := [ ] * models . DashboardAclInfoDTO { }
@ -730,7 +758,7 @@ func TestDashboardAPIEndpoint(t *testing.T) {
callPostDashboard ( sc )
assert . Equal ( t , 403 , sc . resp . Code )
} , & sqlmock )
} , & sqlmock , fakeDashboardVersionService )
} )
t . Run ( "when user does have permission" , func ( t * testing . T ) {
@ -739,9 +767,10 @@ func TestDashboardAPIEndpoint(t *testing.T) {
postDiffScenario ( t , "When calling POST on" , "/api/dashboards/calculate-diff" , "/api/dashboards/calculate-diff" , cmd , role , func ( sc * scenarioContext ) {
setUp ( )
sc . dashboardVersionService = fakeDashboardVersionService
callPostDashboard ( sc )
assert . Equal ( t , 200 , sc . resp . Code )
} , & sqlmock )
} , & sqlmock , fakeDashboardVersionService )
} )
} )
@ -767,16 +796,18 @@ func TestDashboardAPIEndpoint(t *testing.T) {
cmd := dtos . RestoreDashboardVersionCommand {
Version : 1 ,
}
mockSQLStore := mockstore . NewSQLStoreMock ( )
mockSQLStor e. ExpectedDashboardVersions = [ ] * models . DashboardVersion {
fakeDashboardVersionService := dashvertest . NewDashboardVersionServiceFake ( )
fakeDashboardVersionServic e. ExpectedDashboardVersions = [ ] * dashver . DashboardVersion {
{
DashboardId : 2 ,
DashboardID : 2 ,
Version : 1 ,
Data : fakeDash . Data ,
} }
mockSQLStore := mockstore . NewSQLStoreMock ( )
restoreDashboardVersionScenario ( t , "When calling POST on" , "/api/dashboards/id/1/restore" ,
"/api/dashboards/id/:dashboardId/restore" , dashboardService , cmd , func ( sc * scenarioContext ) {
"/api/dashboards/id/:dashboardId/restore" , dashboardService , fakeDashboardVersionService , cmd , func ( sc * scenarioContext ) {
sc . dashboardVersionService = fakeDashboardVersionService
callRestoreDashboardVersion ( sc )
assert . Equal ( t , 200 , sc . resp . Code )
} , mockSQLStore )
@ -799,6 +830,14 @@ func TestDashboardAPIEndpoint(t *testing.T) {
}
} ) . Return ( nil , nil )
fakeDashboardVersionService := dashvertest . NewDashboardVersionServiceFake ( )
fakeDashboardVersionService . ExpectedDashboardVersions = [ ] * dashver . DashboardVersion {
{
DashboardID : 2 ,
Version : 1 ,
Data : fakeDash . Data ,
} }
cmd := dtos . RestoreDashboardVersionCommand {
Version : 1 ,
}
@ -810,7 +849,7 @@ func TestDashboardAPIEndpoint(t *testing.T) {
Data : fakeDash . Data ,
} }
restoreDashboardVersionScenario ( t , "When calling POST on" , "/api/dashboards/id/1/restore" ,
"/api/dashboards/id/:dashboardId/restore" , dashboardService , cmd , func ( sc * scenarioContext ) {
"/api/dashboards/id/:dashboardId/restore" , dashboardService , fakeDashboardVersionService , cmd , func ( sc * scenarioContext ) {
callRestoreDashboardVersion ( sc )
assert . Equal ( t , 200 , sc . resp . Code )
} , mockSQLStore )
@ -1003,18 +1042,20 @@ 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 ) {
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 ) {
t . Run ( fmt . Sprintf ( "%s %s" , desc , url ) , func ( t * testing . T ) {
cfg := setting . NewCfg ( )
hs := HTTPServer {
Cfg : cfg ,
ProvisioningService : provisioning . NewProvisioningServiceMock ( context . Background ( ) ) ,
Live : newTestLive ( t , sqlstore . InitTestDB ( t ) ) ,
QuotaService : & quota . QuotaService { Cfg : cfg } ,
LibraryPanelService : & mockLibraryPanelService { } ,
LibraryElementService : & mockLibraryElementService { } ,
CoremodelRegistry : setupDashboardCoremodel ( t ) ,
SQLStore : sqlmock ,
Cfg : cfg ,
ProvisioningService : provisioning . NewProvisioningServiceMock ( context . Background ( ) ) ,
Live : newTestLive ( t , sqlstore . InitTestDB ( t ) ) ,
QuotaService : & quota . QuotaService { Cfg : cfg } ,
LibraryPanelService : & mockLibraryPanelService { } ,
LibraryElementService : & mockLibraryElementService { } ,
SQLStore : sqlmock ,
dashboardVersionService : fakeDashboardVersionService ,
CoremodelRegistry : setupDashboardCoremodel ( t ) ,
}
sc := setupScenarioContext ( t , url )
@ -1037,24 +1078,28 @@ func postDiffScenario(t *testing.T, desc string, url string, routePattern string
} )
}
func restoreDashboardVersionScenario ( t * testing . T , desc string , url string , routePattern string , mock * dashboards . FakeDashboardService , cmd dtos . RestoreDashboardVersionCommand , fn scenarioFunc , sqlStore sqlstore . Store ) {
func restoreDashboardVersionScenario ( t * testing . T , desc string , url string , routePattern string ,
mock * dashboards . FakeDashboardService , fakeDashboardVersionService * dashvertest . FakeDashboardVersionService ,
cmd dtos . RestoreDashboardVersionCommand , fn scenarioFunc , sqlStore sqlstore . Store ) {
t . Run ( fmt . Sprintf ( "%s %s" , desc , url ) , func ( t * testing . T ) {
cfg := setting . NewCfg ( )
hs := HTTPServer {
Cfg : cfg ,
ProvisioningService : provisioning . NewProvisioningServiceMock ( context . Background ( ) ) ,
Live : newTestLive ( t , sqlstore . InitTestDB ( t ) ) ,
QuotaService : & quota . QuotaService { Cfg : cfg } ,
LibraryPanelService : & mockLibraryPanelService { } ,
LibraryElementService : & mockLibraryElementService { } ,
CoremodelRegistry : setupDashboardCoremodel ( t ) ,
dashboardService : mock ,
SQLStore : sqlStore ,
Features : featuremgmt . WithFeatures ( ) ,
Cfg : cfg ,
ProvisioningService : provisioning . NewProvisioningServiceMock ( context . Background ( ) ) ,
Live : newTestLive ( t , sqlstore . InitTestDB ( t ) ) ,
QuotaService : & quota . QuotaService { Cfg : cfg } ,
LibraryPanelService : & mockLibraryPanelService { } ,
LibraryElementService : & mockLibraryElementService { } ,
dashboardService : mock ,
SQLStore : sqlStore ,
Features : featuremgmt . WithFeatures ( ) ,
dashboardVersionService : fakeDashboardVersionService ,
CoremodelRegistry : setupDashboardCoremodel ( t ) ,
}
sc := setupScenarioContext ( t , url )
sc . sqlStore = sqlStore
sc . dashboardVersionService = fakeDashboardVersionService
sc . defaultHandler = routing . Wrap ( func ( c * models . ReqContext ) response . Response {
c . Req . Body = mockRequestBody ( cmd )
c . Req . Header . Add ( "Content-Type" , "application/json" )