@ -8,6 +8,7 @@ import (
"net/http"
"os"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
@ -15,6 +16,7 @@ import (
"github.com/grafana/grafana/pkg/services/publicdashboards"
"github.com/grafana/grafana/pkg/services/publicdashboards/api"
"github.com/grafana/grafana/pkg/services/user/usertest"
"github.com/grafana/grafana/pkg/api/dtos"
"github.com/grafana/grafana/pkg/api/response"
@ -23,6 +25,8 @@ import (
"github.com/grafana/grafana/pkg/components/simplejson"
"github.com/grafana/grafana/pkg/infra/db"
"github.com/grafana/grafana/pkg/infra/db/dbtest"
"github.com/grafana/grafana/pkg/infra/localcache"
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/infra/tracing"
"github.com/grafana/grafana/pkg/infra/usagestats"
"github.com/grafana/grafana/pkg/plugins"
@ -140,7 +144,7 @@ func TestDashboardAPIEndpoint(t *testing.T) {
fakeDash . FolderID = 1
fakeDash . HasACL = false
fakeDashboardVersionService := dashvertest . NewDashboardVersionServiceFake ( )
fakeDashboardVersionService . ExpectedDashboardVersion = & dashver . DashboardVersionDTO { }
fakeDashboardVersionService . ExpectedDashboardVersion = & dashver . DashboardVersionDTO { CreatedBy : 1 }
teamService := & teamtest . FakeService { }
dashboardService := dashboards . NewFakeDashboardService ( t )
dashboardService . On ( "GetDashboard" , mock . Anything , mock . AnythingOfType ( "*dashboards.GetDashboardQuery" ) ) . Return ( fakeDash , nil )
@ -156,6 +160,9 @@ func TestDashboardAPIEndpoint(t *testing.T) {
dashboardVersionService : fakeDashboardVersionService ,
Kinds : corekind . NewBase ( nil ) ,
QuotaService : quotatest . New ( false , nil ) ,
userService : & usertest . FakeUserService {
ExpectedUser : & user . User { ID : 1 , Login : "test-user" } ,
} ,
}
setUp := func ( ) {
@ -225,6 +232,10 @@ func TestDashboardAPIEndpoint(t *testing.T) {
hs . callGetDashboardVersion ( sc )
assert . Equal ( t , 200 , sc . resp . Code )
var version * dashver . DashboardVersionMeta
err := json . NewDecoder ( sc . resp . Body ) . Decode ( & version )
require . NoError ( t , err )
assert . NotEqual ( t , anonString , version . CreatedBy )
} , mockSQLStore )
loggedInUserScenarioWithRole ( t , "When calling GET on" , "GET" , "/api/dashboards/id/2/versions" ,
@ -935,6 +946,129 @@ func TestDashboardAPIEndpoint(t *testing.T) {
} )
}
func TestDashboardVersionsAPIEndpoint ( t * testing . T ) {
fakeDash := dashboards . NewDashboard ( "Child dash" )
fakeDash . ID = 1
fakeDash . FolderID = 1
fakeDash . HasACL = false
fakeDashboardVersionService := dashvertest . NewDashboardVersionServiceFake ( )
dashboardService := dashboards . NewFakeDashboardService ( t )
dashboardService . On ( "GetDashboard" , mock . Anything , mock . AnythingOfType ( "*dashboards.GetDashboardQuery" ) ) . Return ( fakeDash , nil )
teamService := & teamtest . FakeService { }
mockSQLStore := dbtest . NewFakeDB ( )
cfg := setting . NewCfg ( )
getHS := func ( userSvc * usertest . FakeUserService ) * HTTPServer {
return & HTTPServer {
Cfg : cfg ,
pluginStore : & plugins . FakePluginStore { } ,
SQLStore : mockSQLStore ,
AccessControl : accesscontrolmock . New ( ) ,
Features : featuremgmt . WithFeatures ( ) ,
DashboardService : dashboardService ,
dashboardVersionService : fakeDashboardVersionService ,
Kinds : corekind . NewBase ( nil ) ,
QuotaService : quotatest . New ( false , nil ) ,
userService : userSvc ,
CacheService : localcache . New ( 5 * time . Minute , 10 * time . Minute ) ,
log : log . New ( ) ,
}
}
setUp := func ( ) {
viewerRole := org . RoleViewer
editorRole := org . RoleEditor
qResult := [ ] * dashboards . DashboardACLInfoDTO {
{ Role : & viewerRole , Permission : dashboards . PERMISSION_VIEW } ,
{ Role : & editorRole , Permission : dashboards . PERMISSION_EDIT } ,
}
dashboardService . On ( "GetDashboardACLInfoList" , mock . Anything , mock . AnythingOfType ( "*dashboards.GetDashboardACLInfoListQuery" ) ) . Return ( qResult , nil )
guardian . InitLegacyGuardian ( cfg , mockSQLStore , dashboardService , teamService )
}
loggedInUserScenarioWithRole ( t , "When user exists and calling GET on" , "GET" , "/api/dashboards/id/2/versions" ,
"/api/dashboards/id/:dashboardId/versions" , org . RoleEditor , func ( sc * scenarioContext ) {
setUp ( )
fakeDashboardVersionService . ExpectedListDashboarVersions = [ ] * dashver . DashboardVersionDTO {
{
Version : 1 ,
CreatedBy : 1 ,
} ,
{
Version : 2 ,
CreatedBy : 1 ,
} ,
}
getHS ( & usertest . FakeUserService {
ExpectedUser : & user . User { ID : 1 , Login : "test-user" } ,
} ) . callGetDashboardVersions ( sc )
assert . Equal ( t , 200 , sc . resp . Code )
var versions [ ] dashver . DashboardVersionMeta
err := json . NewDecoder ( sc . resp . Body ) . Decode ( & versions )
require . NoError ( t , err )
for _ , v := range versions {
assert . Equal ( t , "test-user" , v . CreatedBy )
}
} , mockSQLStore )
loggedInUserScenarioWithRole ( t , "When user does not exist and calling GET on" , "GET" , "/api/dashboards/id/2/versions" ,
"/api/dashboards/id/:dashboardId/versions" , org . RoleEditor , func ( sc * scenarioContext ) {
setUp ( )
fakeDashboardVersionService . ExpectedListDashboarVersions = [ ] * dashver . DashboardVersionDTO {
{
Version : 1 ,
CreatedBy : 1 ,
} ,
{
Version : 2 ,
CreatedBy : 1 ,
} ,
}
getHS ( & usertest . FakeUserService {
ExpectedError : user . ErrUserNotFound ,
} ) . callGetDashboardVersions ( sc )
assert . Equal ( t , 200 , sc . resp . Code )
var versions [ ] dashver . DashboardVersionMeta
err := json . NewDecoder ( sc . resp . Body ) . Decode ( & versions )
require . NoError ( t , err )
for _ , v := range versions {
assert . Equal ( t , anonString , v . CreatedBy )
}
} , mockSQLStore )
loggedInUserScenarioWithRole ( t , "When failing to get user and calling GET on" , "GET" , "/api/dashboards/id/2/versions" ,
"/api/dashboards/id/:dashboardId/versions" , org . RoleEditor , func ( sc * scenarioContext ) {
setUp ( )
fakeDashboardVersionService . ExpectedListDashboarVersions = [ ] * dashver . DashboardVersionDTO {
{
Version : 1 ,
CreatedBy : 1 ,
} ,
{
Version : 2 ,
CreatedBy : 1 ,
} ,
}
getHS ( & usertest . FakeUserService {
ExpectedError : fmt . Errorf ( "some error" ) ,
} ) . callGetDashboardVersions ( sc )
assert . Equal ( t , 200 , sc . resp . Code )
var versions [ ] dashver . DashboardVersionMeta
err := json . NewDecoder ( sc . resp . Body ) . Decode ( & versions )
require . NoError ( t , err )
for _ , v := range versions {
assert . Equal ( t , anonString , v . CreatedBy )
}
} , mockSQLStore )
}
func getDashboardShouldReturn200WithConfig ( t * testing . T , sc * scenarioContext , provisioningService provisioning . ProvisioningService , dashboardStore dashboards . Store , dashboardService dashboards . DashboardService , folderStore folder . FolderStore ) dtos . DashboardFullWithMeta {
t . Helper ( )