@ -38,7 +38,7 @@ func TestIntegrationProvideFolderService(t *testing.T) {
t . Run ( "should register scope resolvers" , func ( t * testing . T ) {
cfg := setting . NewCfg ( )
ac := acmock . New ( )
ProvideService ( ac , bus . ProvideBus ( tracing . InitializeTracerForTest ( ) ) , cfg , nil , nil , & featuremgmt . FeatureManager { } , nil , nil )
ProvideService ( ac , bus . ProvideBus ( tracing . InitializeTracerForTest ( ) ) , cfg , nil , nil , nil , & featuremgmt . FeatureManager { } , nil , nil )
require . Len ( t , ac . Calls . RegisterAttributeScopeResolver , 2 )
} )
@ -51,7 +51,9 @@ func TestIntegrationFolderService(t *testing.T) {
t . Run ( "Folder service tests" , func ( t * testing . T ) {
dashStore := & dashboards . FakeDashboardStore { }
db := sqlstore . InitTestDB ( t )
store := ProvideStore ( db , db . Cfg , featuremgmt . WithFeatures ( [ ] interface { } { "nestedFolders" } ) )
nestedFolderStore := ProvideStore ( db , db . Cfg , featuremgmt . WithFeatures ( [ ] interface { } { "nestedFolders" } ) )
folderStore := dashboards . NewFakeFolderStore ( t )
cfg := setting . NewCfg ( )
cfg . RBACEnabled = false
@ -59,14 +61,15 @@ func TestIntegrationFolderService(t *testing.T) {
folderPermissions := acmock . NewMockedPermissionsService ( )
service := & Service {
cfg : cfg ,
log : log . New ( "test-folder-service" ) ,
dashboardStore : dashStore ,
store : store ,
searchService : nil ,
features : features ,
permissions : folderPermissions ,
bus : bus . ProvideBus ( tracing . InitializeTracerForTest ( ) ) ,
cfg : cfg ,
log : log . New ( "test-folder-service" ) ,
dashboardStore : dashStore ,
dashboardFolderStore : folderStore ,
store : nestedFolderStore ,
searchService : nil ,
features : features ,
permissions : folderPermissions ,
bus : bus . ProvideBus ( tracing . InitializeTracerForTest ( ) ) ,
}
t . Run ( "Given user has no permissions" , func ( t * testing . T ) {
@ -80,8 +83,8 @@ func TestIntegrationFolderService(t *testing.T) {
f . ID = folderId
f . UID = folderUID
dash Store. On ( "GetFolderByID" , mock . Anything , orgID , folderId ) . Return ( f , nil )
dash Store. On ( "GetFolderByUID" , mock . Anything , orgID , folderUID ) . Return ( f , nil )
folder Store. On ( "GetFolderByID" , mock . Anything , orgID , folderId ) . Return ( f , nil )
folder Store. On ( "GetFolderByUID" , mock . Anything , orgID , folderUID ) . Return ( f , nil )
t . Run ( "When get folder by id should return access denied error" , func ( t * testing . T ) {
_ , err := service . Get ( context . Background ( ) , & folder . GetFolderQuery {
@ -143,8 +146,8 @@ func TestIntegrationFolderService(t *testing.T) {
newFolder := models . NewFolder ( "Folder" )
newFolder . Uid = folderUID
dash Store. On ( "GetFolderByID" , mock . Anything , orgID , folderId ) . Return ( newFolder , nil )
dash Store. On ( "GetFolderByUID" , mock . Anything , orgID , folderUID ) . Return ( newFolder , nil )
folder Store. On ( "GetFolderByID" , mock . Anything , orgID , folderId ) . Return ( newFolder , nil )
folder Store. On ( "GetFolderByUID" , mock . Anything , orgID , folderUID ) . Return ( newFolder , nil )
err := service . Delete ( context . Background ( ) , & folder . DeleteFolderCommand {
UID : folderUID ,
@ -172,7 +175,7 @@ func TestIntegrationFolderService(t *testing.T) {
dashStore . On ( "ValidateDashboardBeforeSave" , mock . Anything , mock . AnythingOfType ( "*dashboards.Dashboard" ) , mock . AnythingOfType ( "bool" ) ) . Return ( true , nil )
dashStore . On ( "SaveDashboard" , mock . Anything , mock . AnythingOfType ( "dashboards.SaveDashboardCommand" ) ) . Return ( dash , nil ) . Once ( )
dash Store. On ( "GetFolderByID" , mock . Anything , orgID , dash . ID ) . Return ( f , nil )
folder Store. On ( "GetFolderByID" , mock . Anything , orgID , dash . ID ) . Return ( f , nil )
actualFolder , err := service . Create ( context . Background ( ) , & folder . CreateFolderCommand {
OrgID : orgID ,
@ -205,7 +208,7 @@ func TestIntegrationFolderService(t *testing.T) {
dashStore . On ( "ValidateDashboardBeforeSave" , mock . Anything , mock . AnythingOfType ( "*dashboards.Dashboard" ) , mock . AnythingOfType ( "bool" ) ) . Return ( true , nil )
dashStore . On ( "SaveDashboard" , mock . Anything , mock . AnythingOfType ( "dashboards.SaveDashboardCommand" ) ) . Return ( dashboardFolder , nil )
dash Store. On ( "GetFolderByID" , mock . Anything , orgID , dashboardFolder . ID ) . Return ( f , nil )
folder Store. On ( "GetFolderByID" , mock . Anything , orgID , dashboardFolder . ID ) . Return ( f , nil )
title := "TEST-Folder"
req := & folder . UpdateFolderCommand {
@ -224,7 +227,7 @@ func TestIntegrationFolderService(t *testing.T) {
f := folder . NewFolder ( util . GenerateShortUID ( ) , "" )
f . ID = rand . Int63 ( )
f . UID = util . GenerateShortUID ( )
dash Store. On ( "GetFolderByUID" , mock . Anything , orgID , f . UID ) . Return ( f , nil )
folder Store. On ( "GetFolderByUID" , mock . Anything , orgID , f . UID ) . Return ( f , nil )
var actualCmd * dashboards . DeleteDashboardCommand
dashStore . On ( "DeleteDashboard" , mock . Anything , mock . Anything ) . Run ( func ( args mock . Arguments ) {
@ -258,7 +261,7 @@ func TestIntegrationFolderService(t *testing.T) {
expected := folder . NewFolder ( util . GenerateShortUID ( ) , "" )
expected . ID = rand . Int63 ( )
dash Store. On ( "GetFolderByID" , mock . Anything , orgID , expected . ID ) . Return ( expected , nil )
folder Store. On ( "GetFolderByID" , mock . Anything , orgID , expected . ID ) . Return ( expected , nil )
actual , err := service . getFolderByID ( context . Background ( ) , usr , expected . ID , orgID )
require . Equal ( t , expected , actual )
@ -269,7 +272,7 @@ func TestIntegrationFolderService(t *testing.T) {
expected := folder . NewFolder ( util . GenerateShortUID ( ) , "" )
expected . UID = util . GenerateShortUID ( )
dash Store. On ( "GetFolderByUID" , mock . Anything , orgID , expected . UID ) . Return ( expected , nil )
folder Store. On ( "GetFolderByUID" , mock . Anything , orgID , expected . UID ) . Return ( expected , nil )
actual , err := service . getFolderByUID ( context . Background ( ) , usr , orgID , expected . UID )
require . Equal ( t , expected , actual )
@ -279,7 +282,7 @@ func TestIntegrationFolderService(t *testing.T) {
t . Run ( "When get folder by title should return folder" , func ( t * testing . T ) {
expected := folder . NewFolder ( "TEST-" + util . GenerateShortUID ( ) , "" )
dash Store. On ( "GetFolderByTitle" , mock . Anything , orgID , expected . Title ) . Return ( expected , nil )
folder Store. On ( "GetFolderByTitle" , mock . Anything , orgID , expected . Title ) . Return ( expected , nil )
actual , err := service . getFolderByTitle ( context . Background ( ) , usr , orgID , expected . Title )
require . Equal ( t , expected , actual )
@ -322,23 +325,27 @@ func TestNestedFolderServiceFeatureToggle(t *testing.T) {
guardian . New = g
} )
f olderStore := NewFakeStore ( )
nestedF olderStore := NewFakeStore ( )
dashStore := dashboards . FakeDashboardStore { }
dashStore . On ( "ValidateDashboardBeforeSave" , mock . Anything , mock . AnythingOfType ( "*dashboards.Dashboard" ) , mock . AnythingOfType ( "bool" ) ) . Return ( true , nil )
dashStore . On ( "SaveDashboard" , mock . Anything , mock . AnythingOfType ( "dashboards.SaveDashboardCommand" ) ) . Return ( & dashboards . Dashboard { } , nil )
dashStore . On ( "GetFolderByID" , mock . Anything , mock . AnythingOfType ( "int64" ) , mock . AnythingOfType ( "int64" ) ) . Return ( & folder . Folder { } , nil )
dashboardFolderStore := dashboards . NewFakeFolderStore ( t )
dashboardFolderStore . On ( "GetFolderByID" , mock . Anything , mock . AnythingOfType ( "int64" ) , mock . AnythingOfType ( "int64" ) ) . Return ( & folder . Folder { } , nil )
cfg := setting . NewCfg ( )
cfg . RBACEnabled = false
folderService := & Service {
cfg : cfg ,
store : folderStore ,
dashboardStore : & dashStore ,
features : featuremgmt . WithFeatures ( featuremgmt . FlagNestedFolders ) ,
log : log . New ( "test-folder-service" ) ,
cfg : cfg ,
store : nestedFolderStore ,
dashboardStore : & dashStore ,
dashboardFolderStore : dashboardFolderStore ,
features : featuremgmt . WithFeatures ( featuremgmt . FlagNestedFolders ) ,
log : log . New ( "test-folder-service" ) ,
}
t . Run ( "create folder" , func ( t * testing . T ) {
f olderStore. ExpectedFolder = & folder . Folder { ParentUID : util . GenerateShortUID ( ) }
nestedF olderStore. ExpectedFolder = & folder . Folder { ParentUID : util . GenerateShortUID ( ) }
res , err := folderService . Create ( context . Background ( ) , & folder . CreateFolderCommand { SignedInUser : usr , Title : "my folder" } )
require . NoError ( t , err )
require . NotNil ( t , res . UID )
@ -359,11 +366,13 @@ func TestNestedFolderService(t *testing.T) {
dashStore := & dashboards . FakeDashboardStore { }
dashStore . On ( "ValidateDashboardBeforeSave" , mock . Anything , mock . AnythingOfType ( "*dashboards.Dashboard" ) , mock . AnythingOfType ( "bool" ) ) . Return ( true , nil )
dashStore . On ( "SaveDashboard" , mock . Anything , mock . AnythingOfType ( "dashboards.SaveDashboardCommand" ) ) . Return ( & dashboards . Dashboard { } , nil )
dashStore . On ( "GetFolderByID" , mock . Anything , mock . AnythingOfType ( "int64" ) , mock . AnythingOfType ( "int64" ) ) . Return ( & folder . Folder { } , nil )
folderStore := NewFakeStore ( )
dashboardFolderStore := dashboards . NewFakeFolderStore ( t )
dashboardFolderStore . On ( "GetFolderByID" , mock . Anything , mock . AnythingOfType ( "int64" ) , mock . AnythingOfType ( "int64" ) ) . Return ( & folder . Folder { } , nil )
folderSvc := setup ( t , dashStore , folderStore , featuremgmt . WithFeatures ( ) , nil )
nestedFolderStore := NewFakeStore ( )
folderSvc := setup ( t , dashStore , dashboardFolderStore , nestedFolderStore , featuremgmt . WithFeatures ( ) , nil )
_ , err := folderSvc . Create ( context . Background ( ) , & folder . CreateFolderCommand {
OrgID : orgID ,
Title : "myFolder" ,
@ -372,7 +381,7 @@ func TestNestedFolderService(t *testing.T) {
} )
require . NoError ( t , err )
// CreateFolder should not call the folder store create if the feature toggle is not enabled.
require . False ( t , f olderStore. CreateCalled )
require . False ( t , nestedF olderStore. CreateCalled )
} )
t . Run ( "When delete folder, no delete in folder table done" , func ( t * testing . T ) {
@ -381,16 +390,18 @@ func TestNestedFolderService(t *testing.T) {
dashStore . On ( "DeleteDashboard" , mock . Anything , mock . Anything ) . Run ( func ( args mock . Arguments ) {
actualCmd = args . Get ( 1 ) . ( * dashboards . DeleteDashboardCommand )
} ) . Return ( nil ) . Once ( )
dashStore . On ( "GetFolderByUID" , mock . Anything , mock . AnythingOfType ( "int64" ) , mock . AnythingOfType ( "string" ) ) . Return ( & folder . Folder { } , nil )
folderStore := NewFakeStore ( )
dashboardFolderStore := dashboards . NewFakeFolderStore ( t )
dashboardFolderStore . On ( "GetFolderByUID" , mock . Anything , mock . AnythingOfType ( "int64" ) , mock . AnythingOfType ( "string" ) ) . Return ( & folder . Folder { } , nil )
nestedFolderStore := NewFakeStore ( )
folderSvc := setup ( t , dashStore , folderStore , featuremgmt . WithFeatures ( ) , nil )
folderSvc := setup ( t , dashStore , dashboardFolderStore , nestedF olderStore, featuremgmt . WithFeatures ( ) , nil )
err := folderSvc . Delete ( context . Background ( ) , & folder . DeleteFolderCommand { UID : "myFolder" , OrgID : orgID , SignedInUser : usr } )
require . NoError ( t , err )
require . NotNil ( t , actualCmd )
require . False ( t , f olderStore. DeleteCalled )
require . False ( t , nestedF olderStore. DeleteCalled )
} )
} )
@ -406,11 +417,13 @@ func TestNestedFolderService(t *testing.T) {
dashStore := & dashboards . FakeDashboardStore { }
dashStore . On ( "ValidateDashboardBeforeSave" , mock . Anything , mock . AnythingOfType ( "*dashboards.Dashboard" ) , mock . AnythingOfType ( "bool" ) ) . Return ( true , nil )
dashStore . On ( "SaveDashboard" , mock . Anything , mock . AnythingOfType ( "dashboards.SaveDashboardCommand" ) ) . Return ( & dashboards . Dashboard { } , nil )
dashStore . On ( "GetFolderByID" , mock . Anything , mock . AnythingOfType ( "int64" ) , mock . AnythingOfType ( "int64" ) ) . Return ( & folder . Folder { } , nil )
folderStore := NewFakeStore ( )
dashboardFolderStore := dashboards . NewFakeFolderStore ( t )
dashboardFolderStore . On ( "GetFolderByID" , mock . Anything , mock . AnythingOfType ( "int64" ) , mock . AnythingOfType ( "int64" ) ) . Return ( & folder . Folder { } , nil )
nestedFolderStore := NewFakeStore ( )
folderSvc := setup ( t , dashStore , folderStore , featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
folderSvc := setup ( t , dashStore , dashboardFolderStore , nestedF olderStore, featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
ExpectedEvaluate : true ,
} )
_ , err := folderSvc . Create ( context . Background ( ) , & folder . CreateFolderCommand {
@ -421,7 +434,7 @@ func TestNestedFolderService(t *testing.T) {
} )
require . NoError ( t , err )
// CreateFolder should also call the folder store's create method.
require . True ( t , f olderStore. CreateCalled )
require . True ( t , nestedF olderStore. CreateCalled )
} )
t . Run ( "create without UID, no error" , func ( t * testing . T ) {
@ -435,11 +448,13 @@ func TestNestedFolderService(t *testing.T) {
dashStore := & dashboards . FakeDashboardStore { }
dashStore . On ( "ValidateDashboardBeforeSave" , mock . Anything , mock . AnythingOfType ( "*dashboards.Dashboard" ) , mock . AnythingOfType ( "bool" ) ) . Return ( true , nil )
dashStore . On ( "SaveDashboard" , mock . Anything , mock . AnythingOfType ( "dashboards.SaveDashboardCommand" ) ) . Return ( & dashboards . Dashboard { UID : "newUID" } , nil )
dashStore . On ( "GetFolderByID" , mock . Anything , mock . AnythingOfType ( "int64" ) , mock . AnythingOfType ( "int64" ) ) . Return ( & folder . Folder { } , nil )
folderStore := NewFakeStore ( )
dashboardFolderStore := dashboards . NewFakeFolderStore ( t )
dashboardFolderStore . On ( "GetFolderByID" , mock . Anything , mock . AnythingOfType ( "int64" ) , mock . AnythingOfType ( "int64" ) ) . Return ( & folder . Folder { } , nil )
folderSvc := setup ( t , dashStore , folderStore , featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
nestedFolderStore := NewFakeStore ( )
folderSvc := setup ( t , dashStore , dashboardFolderStore , nestedFolderStore , featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
ExpectedEvaluate : true ,
} )
f , err := folderSvc . Create ( context . Background ( ) , & folder . CreateFolderCommand {
@ -449,7 +464,7 @@ func TestNestedFolderService(t *testing.T) {
} )
require . NoError ( t , err )
// CreateFolder should also call the folder store's create method.
require . True ( t , f olderStore. CreateCalled )
require . True ( t , nestedF olderStore. CreateCalled )
require . Equal ( t , "newUID" , f . UID )
} )
@ -469,14 +484,16 @@ func TestNestedFolderService(t *testing.T) {
dashStore := & dashboards . FakeDashboardStore { }
dashStore . On ( "ValidateDashboardBeforeSave" , mock . Anything , mock . AnythingOfType ( "*dashboards.Dashboard" ) , mock . AnythingOfType ( "bool" ) ) . Return ( true , nil )
dashStore . On ( "SaveDashboard" , mock . Anything , mock . AnythingOfType ( "dashboards.SaveDashboardCommand" ) ) . Return ( dashboardFolder , nil )
dashStore . On ( "GetFolderByID" , mock . Anything , orgID , dashboardFolder . ID ) . Return ( f , nil )
var actualCmd * dashboards . DeleteDashboardCommand
dashStore . On ( "DeleteDashboard" , mock . Anything , mock . Anything ) . Run ( func ( args mock . Arguments ) {
actualCmd = args . Get ( 1 ) . ( * dashboards . DeleteDashboardCommand )
} ) . Return ( nil ) . Once ( )
folderStore := NewFakeStore ( )
folderStore . ExpectedParentFolders = [ ] * folder . Folder {
dashboardFolderStore := dashboards . NewFakeFolderStore ( t )
dashboardFolderStore . On ( "GetFolderByID" , mock . Anything , orgID , dashboardFolder . ID ) . Return ( f , nil )
nestedFolderStore := NewFakeStore ( )
nestedFolderStore . ExpectedParentFolders = [ ] * folder . Folder {
{ UID : "newFolder" , ParentUID : "newFolder" } ,
{ UID : "newFolder2" , ParentUID : "newFolder2" } ,
{ UID : "newFolder3" , ParentUID : "newFolder3" } ,
@ -491,13 +508,13 @@ func TestNestedFolderService(t *testing.T) {
SignedInUser : usr ,
}
folderSvc := setup ( t , dashStore , f olderStore, featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
folderSvc := setup ( t , dashStore , dashboardFolderStore , nestedF olderStore, featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
ExpectedEvaluate : true ,
} )
_ , err := folderSvc . Create ( context . Background ( ) , & cmd )
require . Error ( t , err , folder . ErrCircularReference )
// CreateFolder should not call the folder store's create method.
require . False ( t , f olderStore. CreateCalled )
require . False ( t , nestedF olderStore. CreateCalled )
require . NotNil ( t , actualCmd )
} )
@ -513,19 +530,20 @@ func TestNestedFolderService(t *testing.T) {
dashStore := & dashboards . FakeDashboardStore { }
dashStore . On ( "ValidateDashboardBeforeSave" , mock . Anything , mock . AnythingOfType ( "*dashboards.Dashboard" ) , mock . AnythingOfType ( "bool" ) ) . Return ( true , nil )
dashStore . On ( "SaveDashboard" , mock . Anything , mock . AnythingOfType ( "dashboards.SaveDashboardCommand" ) ) . Return ( & dashboards . Dashboard { } , nil )
dashStore . On ( "GetFolderByID" , mock . Anything , mock . AnythingOfType ( "int64" ) , mock . AnythingOfType ( "int64" ) ) . Return ( & folder . Folder { } , nil )
dashStore . On ( "GetFolderByUID" , mock . Anything , mock . AnythingOfType ( "int64" ) , mock . AnythingOfType ( "string" ) ) . Return ( & folder . Folder { } , nil )
var actualCmd * dashboards . DeleteDashboardCommand
dashStore . On ( "DeleteDashboard" , mock . Anything , mock . Anything ) . Run ( func ( args mock . Arguments ) {
actualCmd = args . Get ( 1 ) . ( * dashboards . DeleteDashboardCommand )
} ) . Return ( nil ) . Once ( )
dashboardFolderStore := dashboards . NewFakeFolderStore ( t )
dashboardFolderStore . On ( "GetFolderByID" , mock . Anything , mock . AnythingOfType ( "int64" ) , mock . AnythingOfType ( "int64" ) ) . Return ( & folder . Folder { } , nil )
// return an error from the folder store
folderStore := NewFakeStore ( )
folderStore . ExpectedError = errors . New ( "FAILED" )
nestedF olderStore := NewFakeStore ( )
nestedF olderStore. ExpectedError = errors . New ( "FAILED" )
// the service return success as long as the legacy create succeeds
folderSvc := setup ( t , dashStore , f olderStore, featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
folderSvc := setup ( t , dashStore , dashboardFolderStore , nestedF olderStore, featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
ExpectedEvaluate : true ,
} )
_ , err := folderSvc . Create ( context . Background ( ) , & folder . CreateFolderCommand {
@ -537,7 +555,7 @@ func TestNestedFolderService(t *testing.T) {
require . Error ( t , err , "FAILED" )
// CreateFolder should also call the folder store's create method.
require . True ( t , f olderStore. CreateCalled )
require . True ( t , nestedF olderStore. CreateCalled )
require . NotNil ( t , actualCmd )
} )
@ -550,11 +568,12 @@ func TestNestedFolderService(t *testing.T) {
} )
dashStore := & dashboards . FakeDashboardStore { }
dashboardFolderStore := dashboards . NewFakeFolderStore ( t )
f olderStore := NewFakeStore ( )
f olderStore. ExpectedFolder = & folder . Folder { UID : "myFolder" , ParentUID : "newFolder" }
nestedF olderStore := NewFakeStore ( )
nestedF olderStore. ExpectedFolder = & folder . Folder { UID : "myFolder" , ParentUID : "newFolder" }
folderSvc := setup ( t , dashStore , f olderStore, featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
folderSvc := setup ( t , dashStore , dashboardFolderStore , nestedF olderStore, featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
ExpectedEvaluate : true ,
} )
_ , err := folderSvc . Move ( context . Background ( ) , & folder . MoveFolderCommand { UID : "myFolder" , NewParentUID : "newFolder" , OrgID : orgID , SignedInUser : usr } )
@ -570,11 +589,12 @@ func TestNestedFolderService(t *testing.T) {
} )
dashStore := & dashboards . FakeDashboardStore { }
dashboardFolderStore := dashboards . NewFakeFolderStore ( t )
f olderStore := NewFakeStore ( )
f olderStore. ExpectedFolder = & folder . Folder { UID : "myFolder" , ParentUID : "newFolder" }
nestedF olderStore := NewFakeStore ( )
nestedF olderStore. ExpectedFolder = & folder . Folder { UID : "myFolder" , ParentUID : "newFolder" }
folderSvc := setup ( t , dashStore , f olderStore, featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
folderSvc := setup ( t , dashStore , dashboardFolderStore , nestedF olderStore, featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
ExpectedEvaluate : true ,
} )
_ , err := folderSvc . Move ( context . Background ( ) , & folder . MoveFolderCommand { UID : "myFolder" , NewParentUID : "newFolder" , OrgID : orgID , SignedInUser : usr } )
@ -590,16 +610,17 @@ func TestNestedFolderService(t *testing.T) {
} )
dashStore := & dashboards . FakeDashboardStore { }
dashboardFolderStore := dashboards . NewFakeFolderStore ( t )
f olderStore := NewFakeStore ( )
f olderStore. ExpectedFolder = & folder . Folder { UID : "myFolder" , ParentUID : "newFolder" }
f olderStore. ExpectedParentFolders = [ ] * folder . Folder {
nestedF olderStore := NewFakeStore ( )
nestedF olderStore. ExpectedFolder = & folder . Folder { UID : "myFolder" , ParentUID : "newFolder" }
nestedF olderStore. ExpectedParentFolders = [ ] * folder . Folder {
{ UID : "newFolder" , ParentUID : "newFolder" } ,
{ UID : "newFolder2" , ParentUID : "newFolder2" } ,
{ UID : "newFolder3" , ParentUID : "newFolder3" } ,
}
folderSvc := setup ( t , dashStore , f olderStore, featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
folderSvc := setup ( t , dashStore , dashboardFolderStore , nestedF olderStore, featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
ExpectedEvaluate : true ,
} )
f , err := folderSvc . Move ( context . Background ( ) , & folder . MoveFolderCommand { UID : "myFolder" , NewParentUID : "newFolder" , OrgID : orgID , SignedInUser : usr } )
@ -615,12 +636,13 @@ func TestNestedFolderService(t *testing.T) {
} )
dashStore := & dashboards . FakeDashboardStore { }
dashboardFolderStore := dashboards . NewFakeFolderStore ( t )
f olderStore := NewFakeStore ( )
f olderStore. ExpectedFolder = & folder . Folder { UID : "myFolder" , ParentUID : "newFolder" }
f olderStore. ExpectedError = folder . ErrCircularReference
nestedF olderStore := NewFakeStore ( )
nestedF olderStore. ExpectedFolder = & folder . Folder { UID : "myFolder" , ParentUID : "newFolder" }
nestedF olderStore. ExpectedError = folder . ErrCircularReference
folderSvc := setup ( t , dashStore , f olderStore, featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
folderSvc := setup ( t , dashStore , dashboardFolderStore , nestedF olderStore, featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
ExpectedEvaluate : true ,
} )
f , err := folderSvc . Move ( context . Background ( ) , & folder . MoveFolderCommand { UID : "myFolder" , NewParentUID : "newFolder" , OrgID : orgID , SignedInUser : usr } )
@ -636,16 +658,17 @@ func TestNestedFolderService(t *testing.T) {
} )
dashStore := & dashboards . FakeDashboardStore { }
dashboardFolderStore := dashboards . NewFakeFolderStore ( t )
f olderStore := NewFakeStore ( )
f olderStore. ExpectedFolder = & folder . Folder { UID : "myFolder" , ParentUID : "newFolder" }
f olderStore. ExpectedParentFolders = [ ] * folder . Folder {
nestedF olderStore := NewFakeStore ( )
nestedF olderStore. ExpectedFolder = & folder . Folder { UID : "myFolder" , ParentUID : "newFolder" }
nestedF olderStore. ExpectedParentFolders = [ ] * folder . Folder {
{ UID : "newFolder" , ParentUID : "newFolder" } ,
{ UID : "newFolder2" , ParentUID : "newFolder2" } ,
}
f olderStore. ExpectedFolderHeight = 5
nestedF olderStore. ExpectedFolderHeight = 5
folderSvc := setup ( t , dashStore , f olderStore, featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
folderSvc := setup ( t , dashStore , dashboardFolderStore , nestedF olderStore, featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
ExpectedEvaluate : true ,
} )
f , err := folderSvc . Move ( context . Background ( ) , & folder . MoveFolderCommand { UID : "myFolder" , NewParentUID : "newFolder2" , OrgID : orgID , SignedInUser : usr } )
@ -661,12 +684,13 @@ func TestNestedFolderService(t *testing.T) {
} )
dashStore := & dashboards . FakeDashboardStore { }
dashboardFolderStore := dashboards . NewFakeFolderStore ( t )
f olderStore := NewFakeStore ( )
f olderStore. ExpectedFolder = & folder . Folder { UID : "myFolder" , ParentUID : "newFolder" }
f olderStore. ExpectedParentFolders = [ ] * folder . Folder { { UID : "myFolder" , ParentUID : "12345" } , { UID : "12345" , ParentUID : "" } }
nestedF olderStore := NewFakeStore ( )
nestedF olderStore. ExpectedFolder = & folder . Folder { UID : "myFolder" , ParentUID : "newFolder" }
nestedF olderStore. ExpectedParentFolders = [ ] * folder . Folder { { UID : "myFolder" , ParentUID : "12345" } , { UID : "12345" , ParentUID : "" } }
folderSvc := setup ( t , dashStore , f olderStore, featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
folderSvc := setup ( t , dashStore , dashboardFolderStore , nestedF olderStore, featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
ExpectedEvaluate : true ,
} )
f , err := folderSvc . Move ( context . Background ( ) , & folder . MoveFolderCommand { UID : "myFolder" , NewParentUID : "newFolder2" , OrgID : orgID , SignedInUser : usr } )
@ -686,19 +710,21 @@ func TestNestedFolderService(t *testing.T) {
dashStore . On ( "DeleteDashboard" , mock . Anything , mock . Anything ) . Run ( func ( args mock . Arguments ) {
actualCmd = args . Get ( 1 ) . ( * dashboards . DeleteDashboardCommand )
} ) . Return ( nil ) . Once ( )
dashStore . On ( "GetFolderByUID" , mock . Anything , mock . AnythingOfType ( "int64" ) , mock . AnythingOfType ( "string" ) ) . Return ( & folder . Folder { } , nil )
f olderStore := NewFakeStore ( )
folderStore . ExpectedFolder = & folder . Folder { UID : "myFolder" , ParentUID : "newFolder" }
dashboardF olderStore := dashboards . NewFakeFolder Store ( t )
dashboardFolderStore . On ( "GetFolderByUID" , mock . Anything , mock . AnythingOfType ( "int64" ) , mock . AnythingOfType ( "string" ) ) . Return ( & folder . Folder { } , nil )
folderSvc := setup ( t , dashStore , folderStore , featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
nestedFolderStore := NewFakeStore ( )
nestedFolderStore . ExpectedFolder = & folder . Folder { UID : "myFolder" , ParentUID : "newFolder" }
folderSvc := setup ( t , dashStore , dashboardFolderStore , nestedFolderStore , featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
ExpectedEvaluate : true ,
} )
err := folderSvc . Delete ( context . Background ( ) , & folder . DeleteFolderCommand { UID : "myFolder" , OrgID : orgID , SignedInUser : usr } )
require . NoError ( t , err )
require . NotNil ( t , actualCmd )
require . True ( t , f olderStore. DeleteCalled )
require . True ( t , nestedF olderStore. DeleteCalled )
} )
t . Run ( "create returns error if maximum depth reached" , func ( t * testing . T ) {
@ -713,23 +739,24 @@ func TestNestedFolderService(t *testing.T) {
dashStore := & dashboards . FakeDashboardStore { }
dashStore . On ( "ValidateDashboardBeforeSave" , mock . Anything , mock . AnythingOfType ( "*dashboards.Dashboard" ) , mock . AnythingOfType ( "bool" ) ) . Return ( true , nil ) . Times ( 2 )
dashStore . On ( "SaveDashboard" , mock . Anything , mock . AnythingOfType ( "dashboards.SaveDashboardCommand" ) ) . Return ( & dashboards . Dashboard { } , nil )
dashStore . On ( "GetFolderByID" , mock . Anything , mock . AnythingOfType ( "int64" ) , mock . AnythingOfType ( "int64" ) ) . Return ( & folder . Folder { } , nil )
dashStore . On ( "GetFolderByUID" , mock . Anything , mock . AnythingOfType ( "int64" ) , mock . AnythingOfType ( "string" ) ) . Return ( & folder . Folder { } , nil )
var actualCmd * dashboards . DeleteDashboardCommand
dashStore . On ( "DeleteDashboard" , mock . Anything , mock . Anything ) . Run ( func ( args mock . Arguments ) {
actualCmd = args . Get ( 1 ) . ( * dashboards . DeleteDashboardCommand )
} ) . Return ( nil ) . Once ( )
dashboardFolderStore := dashboards . NewFakeFolderStore ( t )
dashboardFolderStore . On ( "GetFolderByID" , mock . Anything , mock . AnythingOfType ( "int64" ) , mock . AnythingOfType ( "int64" ) ) . Return ( & folder . Folder { } , nil )
parents := make ( [ ] * folder . Folder , 0 , folder . MaxNestedFolderDepth )
for i := 0 ; i < folder . MaxNestedFolderDepth ; i ++ {
parents = append ( parents , & folder . Folder { UID : fmt . Sprintf ( "folder%d" , i ) } )
}
f olderStore := NewFakeStore ( )
//f olderStore.ExpectedFolder = &folder.Folder{UID: "myFolder", ParentUID: "newFolder"}
f olderStore. ExpectedParentFolders = parents
nestedF olderStore := NewFakeStore ( )
//nestedF olderStore.ExpectedFolder = &folder.Folder{UID: "myFolder", ParentUID: "newFolder"}
nestedF olderStore. ExpectedParentFolders = parents
folderSvc := setup ( t , dashStore , f olderStore, featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
folderSvc := setup ( t , dashStore , dashboardFolderStore , nestedF olderStore, featuremgmt . WithFeatures ( "nestedFolders" ) , actest . FakeAccessControl {
ExpectedEvaluate : true ,
} )
_ , err := folderSvc . Create ( context . Background ( ) , & folder . CreateFolderCommand {
@ -745,18 +772,19 @@ func TestNestedFolderService(t *testing.T) {
} )
}
func setup ( t * testing . T , dashStore dashboards . Store , f olderStore store , features featuremgmt . FeatureToggles , ac accesscontrol . AccessControl ) folder . Service {
func setup ( t * testing . T , dashStore dashboards . Store , dashboardFolderStore dashboards . FolderStore , nestedF olderStore store , features featuremgmt . FeatureToggles , ac accesscontrol . AccessControl ) folder . Service {
t . Helper ( )
// nothing enabled yet
cfg := setting . NewCfg ( )
cfg . RBACEnabled = false
return & Service {
cfg : cfg ,
log : log . New ( "test-folder-service" ) ,
dashboardStore : dashStore ,
store : folderStore ,
features : features ,
accessControl : ac ,
cfg : cfg ,
log : log . New ( "test-folder-service" ) ,
dashboardStore : dashStore ,
dashboardFolderStore : dashboardFolderStore ,
store : nestedFolderStore ,
features : features ,
accessControl : ac ,
}
}