@ -17,7 +17,8 @@ import (
"github.com/grafana/grafana/pkg/util"
"github.com/grafana/grafana/pkg/util"
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/infra/log"
. "github.com/smartystreets/goconvey/convey"
"github.com/stretchr/testify/require"
)
)
const (
const (
@ -32,38 +33,43 @@ const (
var fakeService * fakeDashboardProvisioningService
var fakeService * fakeDashboardProvisioningService
func TestCreatingNewDashboardFileReader ( t * testing . T ) {
func TestCreatingNewDashboardFileReader ( t * testing . T ) {
Convey ( "creating new dashboard file reader" , t , func ( ) {
setup := func ( ) * config {
cfg := & config {
return & config {
Name : "Default" ,
Name : "Default" ,
Type : "file" ,
Type : "file" ,
OrgID : 1 ,
OrgID : 1 ,
Folder : "" ,
Folder : "" ,
Options : map [ string ] interface { } { } ,
Options : map [ string ] interface { } { } ,
}
}
}
Convey ( "using path parameter" , func ( ) {
t . Run ( "using path parameter" , func ( t * testing . T ) {
cfg := setup ( )
cfg . Options [ "path" ] = defaultDashboards
cfg . Options [ "path" ] = defaultDashboards
reader , err := NewDashboardFileReader ( cfg , log . New ( "test-logger" ) , nil )
reader , err := NewDashboardFileReader ( cfg , log . New ( "test-logger" ) , nil )
So ( err , ShouldBeNil )
require . NoError ( t , err )
So ( reader . Path , ShouldNotEqual , "" )
require . NotEqual ( t , reader . Path , "" )
} )
} )
Convey ( "using folder as options" , func ( ) {
t . Run ( "using folder as options" , func ( t * testing . T ) {
cfg := setup ( )
cfg . Options [ "folder" ] = defaultDashboards
cfg . Options [ "folder" ] = defaultDashboards
reader , err := NewDashboardFileReader ( cfg , log . New ( "test-logger" ) , nil )
reader , err := NewDashboardFileReader ( cfg , log . New ( "test-logger" ) , nil )
So ( err , ShouldBeNil )
require . NoError ( t , err )
So ( reader . Path , ShouldNotEqual , "" )
require . NotEqual ( t , reader . Path , "" )
} )
} )
Convey ( "using foldersFromFilesStructure as options" , func ( ) {
t . Run ( "using foldersFromFilesStructure as options" , func ( t * testing . T ) {
cfg := setup ( )
cfg . Options [ "path" ] = foldersFromFilesStructure
cfg . Options [ "path" ] = foldersFromFilesStructure
cfg . Options [ "foldersFromFilesStructure" ] = true
cfg . Options [ "foldersFromFilesStructure" ] = true
reader , err := NewDashboardFileReader ( cfg , log . New ( "test-logger" ) , nil )
reader , err := NewDashboardFileReader ( cfg , log . New ( "test-logger" ) , nil )
So ( err , ShouldBeNil )
require . NoError ( t , err )
So ( reader . Path , ShouldNotEqual , "" )
require . NotEqual ( t , reader . Path , "" )
} )
} )
Convey ( "using full path" , func ( ) {
t . Run ( "using full path" , func ( t * testing . T ) {
cfg := setup ( )
fullPath := "/var/lib/grafana/dashboards"
fullPath := "/var/lib/grafana/dashboards"
if runtime . GOOS == "windows" {
if runtime . GOOS == "windows" {
fullPath = ` c:\var\lib\grafana `
fullPath = ` c:\var\lib\grafana `
@ -71,53 +77,56 @@ func TestCreatingNewDashboardFileReader(t *testing.T) {
cfg . Options [ "folder" ] = fullPath
cfg . Options [ "folder" ] = fullPath
reader , err := NewDashboardFileReader ( cfg , log . New ( "test-logger" ) , nil )
reader , err := NewDashboardFileReader ( cfg , log . New ( "test-logger" ) , nil )
So ( err , ShouldBeNil )
require . NoError ( t , err )
So ( reader . Path , ShouldEqual , fullPath )
require . Equal ( t , reader . Path , fullPath )
So ( filepath . IsAbs ( reader . Path ) , ShouldBeTrue )
require . True ( t , filepath . IsAbs ( reader . Path ) )
} )
} )
Convey ( "using relative path" , func ( ) {
t . Run ( "using relative path" , func ( t * testing . T ) {
cfg := setup ( )
cfg . Options [ "folder" ] = defaultDashboards
cfg . Options [ "folder" ] = defaultDashboards
reader , err := NewDashboardFileReader ( cfg , log . New ( "test-logger" ) , nil )
reader , err := NewDashboardFileReader ( cfg , log . New ( "test-logger" ) , nil )
So ( err , ShouldBeNil )
require . NoError ( t , err )
resolvedPath := reader . resolvedPath ( )
resolvedPath := reader . resolvedPath ( )
So ( filepath . IsAbs ( resolvedPath ) , ShouldBeTrue )
require . True ( t , filepath . IsAbs ( resolvedPath ) )
} )
} )
} )
}
}
func TestDashboardFileReader ( t * testing . T ) {
func TestDashboardFileReader ( t * testing . T ) {
Convey ( "Dashboard file reader" , t , func ( ) {
logger := log . New ( "test.logger" )
bus . ClearBusHandlers ( )
cfg := & config { }
origNewDashboardProvisioningService := dashboards . NewProvisioningService
origNewDashboardProvisioningService := dashboards . NewProvisioningService
Reset ( func ( ) {
defer func ( ) {
dashboards . NewProvisioningService = origNewDashboardProvisioningService
dashboards . NewProvisioningService = origNewDashboardProvisioningService
} )
} ( )
fakeService = mockDashboardProvisioningService ( )
setup := func ( ) {
bus . ClearBusHandlers ( )
fakeService = mockDashboardProvisioningService ( )
bus . AddHandler ( "test" , mockGetDashboardQuery )
bus . AddHandler ( "test" , mockGetDashboardQuery )
logger := log . New ( "test.logger" )
cfg = & config {
Convey ( "Reading dashboards from disk" , func ( ) {
cfg := & config {
Name : "Default" ,
Name : "Default" ,
Type : "file" ,
Type : "file" ,
OrgID : 1 ,
OrgID : 1 ,
Folder : "" ,
Folder : "" ,
Options : map [ string ] interface { } { } ,
Options : map [ string ] interface { } { } ,
}
}
}
Convey ( "Can read default dashboard" , func ( ) {
t . Run ( "Reading dashboards from disk" , func ( t * testing . T ) {
t . Run ( "Can read default dashboard" , func ( t * testing . T ) {
setup ( )
cfg . Options [ "path" ] = defaultDashboards
cfg . Options [ "path" ] = defaultDashboards
cfg . Folder = "Team A"
cfg . Folder = "Team A"
reader , err := NewDashboardFileReader ( cfg , logger , nil )
reader , err := NewDashboardFileReader ( cfg , logger , nil )
So ( err , ShouldBeNil )
require . NoError ( t , err )
err = reader . walkDisk ( context . Background ( ) )
err = reader . walkDisk ( context . Background ( ) )
So ( err , ShouldBeNil )
require . NoError ( t , err )
folders := 0
folders := 0
dashboards := 0
dashboards := 0
@ -130,11 +139,12 @@ func TestDashboardFileReader(t *testing.T) {
}
}
}
}
So ( folders , ShouldEqual , 1 )
require . Equal ( t , folders , 1 )
So ( dashboards , ShouldEqual , 2 )
require . Equal ( t , dashboards , 2 )
} )
} )
Convey ( "Can read default dashboard and replace old version in database" , func ( ) {
t . Run ( "Can read default dashboard and replace old version in database" , func ( t * testing . T ) {
setup ( )
cfg . Options [ "path" ] = oneDashboard
cfg . Options [ "path" ] = oneDashboard
stat , _ := os . Stat ( oneDashboard + "/dashboard1.json" )
stat , _ := os . Stat ( oneDashboard + "/dashboard1.json" )
@ -145,28 +155,29 @@ func TestDashboardFileReader(t *testing.T) {
} )
} )
reader , err := NewDashboardFileReader ( cfg , logger , nil )
reader , err := NewDashboardFileReader ( cfg , logger , nil )
So ( err , ShouldBeNil )
require . NoError ( t , err )
err = reader . walkDisk ( context . Background ( ) )
err = reader . walkDisk ( context . Background ( ) )
So ( err , ShouldBeNil )
require . NoError ( t , err )
So ( len ( fakeService . inserted ) , ShouldEqual , 1 )
require . Equal ( t , len ( fakeService . inserted ) , 1 )
} )
} )
Convey ( "Dashboard with older timestamp and the same checksum will not replace imported dashboard" , func ( ) {
t . Run ( "Dashboard with older timestamp and the same checksum will not replace imported dashboard" , func ( t * testing . T ) {
setup ( )
cfg . Options [ "path" ] = oneDashboard
cfg . Options [ "path" ] = oneDashboard
absPath , err := filepath . Abs ( oneDashboard + "/dashboard1.json" )
absPath , err := filepath . Abs ( oneDashboard + "/dashboard1.json" )
So ( err , ShouldBeNil )
require . NoError ( t , err )
stat , err := os . Stat ( oneDashboard + "/dashboard1.json" )
stat , err := os . Stat ( oneDashboard + "/dashboard1.json" )
So ( err , ShouldBeNil )
require . NoError ( t , err )
file , err := os . Open ( filepath . Clean ( absPath ) )
file , err := os . Open ( filepath . Clean ( absPath ) )
So ( err , ShouldBeNil )
require . NoError ( t , err )
t . Cleanup ( func ( ) {
t . Cleanup ( func ( ) {
_ = file . Close ( )
_ = file . Close ( )
} )
} )
checksum , err := util . Md5Sum ( file )
checksum , err := util . Md5Sum ( file )
So ( err , ShouldBeNil )
require . NoError ( t , err )
fakeService . provisioned = map [ string ] [ ] * models . DashboardProvisioning {
fakeService . provisioned = map [ string ] [ ] * models . DashboardProvisioning {
"Default" : {
"Default" : {
@ -180,19 +191,20 @@ func TestDashboardFileReader(t *testing.T) {
}
}
reader , err := NewDashboardFileReader ( cfg , logger , nil )
reader , err := NewDashboardFileReader ( cfg , logger , nil )
So ( err , ShouldBeNil )
require . NoError ( t , err )
err = reader . walkDisk ( context . Background ( ) )
err = reader . walkDisk ( context . Background ( ) )
So ( err , ShouldBeNil )
require . NoError ( t , err )
So ( len ( fakeService . inserted ) , ShouldEqual , 0 )
require . Equal ( t , len ( fakeService . inserted ) , 0 )
} )
} )
Convey ( "Dashboard with older timestamp and different checksum will replace imported dashboard" , func ( ) {
t . Run ( "Dashboard with older timestamp and different checksum will replace imported dashboard" , func ( t * testing . T ) {
setup ( )
cfg . Options [ "path" ] = oneDashboard
cfg . Options [ "path" ] = oneDashboard
absPath , err := filepath . Abs ( oneDashboard + "/dashboard1.json" )
absPath , err := filepath . Abs ( oneDashboard + "/dashboard1.json" )
So ( err , ShouldBeNil )
require . NoError ( t , err )
stat , err := os . Stat ( oneDashboard + "/dashboard1.json" )
stat , err := os . Stat ( oneDashboard + "/dashboard1.json" )
So ( err , ShouldBeNil )
require . NoError ( t , err )
fakeService . provisioned = map [ string ] [ ] * models . DashboardProvisioning {
fakeService . provisioned = map [ string ] [ ] * models . DashboardProvisioning {
"Default" : {
"Default" : {
@ -206,27 +218,28 @@ func TestDashboardFileReader(t *testing.T) {
}
}
reader , err := NewDashboardFileReader ( cfg , logger , nil )
reader , err := NewDashboardFileReader ( cfg , logger , nil )
So ( err , ShouldBeNil )
require . NoError ( t , err )
err = reader . walkDisk ( context . Background ( ) )
err = reader . walkDisk ( context . Background ( ) )
So ( err , ShouldBeNil )
require . NoError ( t , err )
So ( len ( fakeService . inserted ) , ShouldEqual , 1 )
require . Equal ( t , len ( fakeService . inserted ) , 1 )
} )
} )
Convey ( "Dashboard with newer timestamp and the same checksum will not replace imported dashboard" , func ( ) {
t . Run ( "Dashboard with newer timestamp and the same checksum will not replace imported dashboard" , func ( t * testing . T ) {
setup ( )
cfg . Options [ "path" ] = oneDashboard
cfg . Options [ "path" ] = oneDashboard
absPath , err := filepath . Abs ( oneDashboard + "/dashboard1.json" )
absPath , err := filepath . Abs ( oneDashboard + "/dashboard1.json" )
So ( err , ShouldBeNil )
require . NoError ( t , err )
stat , err := os . Stat ( oneDashboard + "/dashboard1.json" )
stat , err := os . Stat ( oneDashboard + "/dashboard1.json" )
So ( err , ShouldBeNil )
require . NoError ( t , err )
file , err := os . Open ( filepath . Clean ( absPath ) )
file , err := os . Open ( filepath . Clean ( absPath ) )
So ( err , ShouldBeNil )
require . NoError ( t , err )
t . Cleanup ( func ( ) {
t . Cleanup ( func ( ) {
_ = file . Close ( )
_ = file . Close ( )
} )
} )
checksum , err := util . Md5Sum ( file )
checksum , err := util . Md5Sum ( file )
So ( err , ShouldBeNil )
require . NoError ( t , err )
fakeService . provisioned = map [ string ] [ ] * models . DashboardProvisioning {
fakeService . provisioned = map [ string ] [ ] * models . DashboardProvisioning {
"Default" : {
"Default" : {
@ -240,19 +253,20 @@ func TestDashboardFileReader(t *testing.T) {
}
}
reader , err := NewDashboardFileReader ( cfg , logger , nil )
reader , err := NewDashboardFileReader ( cfg , logger , nil )
So ( err , ShouldBeNil )
require . NoError ( t , err )
err = reader . walkDisk ( context . Background ( ) )
err = reader . walkDisk ( context . Background ( ) )
So ( err , ShouldBeNil )
require . NoError ( t , err )
So ( len ( fakeService . inserted ) , ShouldEqual , 0 )
require . Equal ( t , len ( fakeService . inserted ) , 0 )
} )
} )
Convey ( "Dashboard with newer timestamp and different checksum should replace imported dashboard" , func ( ) {
t . Run ( "Dashboard with newer timestamp and different checksum should replace imported dashboard" , func ( t * testing . T ) {
setup ( )
cfg . Options [ "path" ] = oneDashboard
cfg . Options [ "path" ] = oneDashboard
absPath , err := filepath . Abs ( oneDashboard + "/dashboard1.json" )
absPath , err := filepath . Abs ( oneDashboard + "/dashboard1.json" )
So ( err , ShouldBeNil )
require . NoError ( t , err )
stat , err := os . Stat ( oneDashboard + "/dashboard1.json" )
stat , err := os . Stat ( oneDashboard + "/dashboard1.json" )
So ( err , ShouldBeNil )
require . NoError ( t , err )
fakeService . provisioned = map [ string ] [ ] * models . DashboardProvisioning {
fakeService . provisioned = map [ string ] [ ] * models . DashboardProvisioning {
"Default" : {
"Default" : {
@ -266,36 +280,38 @@ func TestDashboardFileReader(t *testing.T) {
}
}
reader , err := NewDashboardFileReader ( cfg , logger , nil )
reader , err := NewDashboardFileReader ( cfg , logger , nil )
So ( err , ShouldBeNil )
require . NoError ( t , err )
err = reader . walkDisk ( context . Background ( ) )
err = reader . walkDisk ( context . Background ( ) )
So ( err , ShouldBeNil )
require . NoError ( t , err )
So ( len ( fakeService . inserted ) , ShouldEqual , 1 )
require . Equal ( t , len ( fakeService . inserted ) , 1 )
} )
} )
Convey ( "Overrides id from dashboard.json files" , func ( ) {
t . Run ( "Overrides id from dashboard.json files" , func ( t * testing . T ) {
setup ( )
cfg . Options [ "path" ] = containingID
cfg . Options [ "path" ] = containingID
reader , err := NewDashboardFileReader ( cfg , logger , nil )
reader , err := NewDashboardFileReader ( cfg , logger , nil )
So ( err , ShouldBeNil )
require . NoError ( t , err )
err = reader . walkDisk ( context . Background ( ) )
err = reader . walkDisk ( context . Background ( ) )
So ( err , ShouldBeNil )
require . NoError ( t , err )
So ( len ( fakeService . inserted ) , ShouldEqual , 1 )
require . Equal ( t , len ( fakeService . inserted ) , 1 )
} )
} )
Convey ( "Get folder from files structure" , func ( ) {
t . Run ( "Get folder from files structure" , func ( t * testing . T ) {
setup ( )
cfg . Options [ "path" ] = foldersFromFilesStructure
cfg . Options [ "path" ] = foldersFromFilesStructure
cfg . Options [ "foldersFromFilesStructure" ] = true
cfg . Options [ "foldersFromFilesStructure" ] = true
reader , err := NewDashboardFileReader ( cfg , logger , nil )
reader , err := NewDashboardFileReader ( cfg , logger , nil )
So ( err , ShouldBeNil )
require . NoError ( t , err )
err = reader . walkDisk ( context . Background ( ) )
err = reader . walkDisk ( context . Background ( ) )
So ( err , ShouldBeNil )
require . NoError ( t , err )
So ( len ( fakeService . inserted ) , ShouldEqual , 5 )
require . Equal ( t , len ( fakeService . inserted ) , 5 )
foldersCount := 0
foldersCount := 0
for _ , d := range fakeService . inserted {
for _ , d := range fakeService . inserted {
@ -303,29 +319,30 @@ func TestDashboardFileReader(t *testing.T) {
foldersCount ++
foldersCount ++
}
}
}
}
So ( foldersCount , ShouldEqual , 2 )
require . Equal ( t , foldersCount , 2 )
foldersAndDashboards := make ( map [ string ] struct { } , 5 )
foldersAndDashboards := make ( map [ string ] struct { } , 5 )
for _ , d := range fakeService . inserted {
for _ , d := range fakeService . inserted {
title := d . Dashboard . Title
title := d . Dashboard . Title
if _ , ok := foldersAndDashboards [ title ] ; ok {
if _ , ok := foldersAndDashboards [ title ] ; ok {
So ( fmt . Errorf ( "dashboard title %q already exists" , title ) , ShouldBeNil )
require . Nil ( t , fmt . Errorf ( "dashboard title %q already exists" , title ) )
}
}
switch title {
switch title {
case "folderOne" , "folderTwo" :
case "folderOne" , "folderTwo" :
So ( d . Dashboard . IsFolder , ShouldBeTrue )
require . True ( t , d . Dashboard . IsFolder )
case "Grafana1" , "Grafana2" , "RootDashboard" :
case "Grafana1" , "Grafana2" , "RootDashboard" :
So ( d . Dashboard . IsFolder , ShouldBeFalse )
require . False ( t , d . Dashboard . IsFolder )
default :
default :
So ( fmt . Errorf ( "unknown dashboard title %q" , title ) , ShouldBeNil )
require . Nil ( t , fmt . Errorf ( "unknown dashboard title %q" , title ) )
}
}
foldersAndDashboards [ title ] = struct { } { }
foldersAndDashboards [ title ] = struct { } { }
}
}
} )
} )
Convey ( "Invalid configuration should return error" , func ( ) {
t . Run ( "Invalid configuration should return error" , func ( t * testing . T ) {
setup ( )
cfg := & config {
cfg := & config {
Name : "Default" ,
Name : "Default" ,
Type : "file" ,
Type : "file" ,
@ -334,31 +351,33 @@ func TestDashboardFileReader(t *testing.T) {
}
}
_ , err := NewDashboardFileReader ( cfg , logger , nil )
_ , err := NewDashboardFileReader ( cfg , logger , nil )
So ( err , ShouldNotBeNil )
require . NotNil ( t , err )
} )
} )
Convey ( "Broken dashboards should not cause error" , func ( ) {
t . Run ( "Broken dashboards should not cause error" , func ( t * testing . T ) {
setup ( )
cfg . Options [ "path" ] = brokenDashboards
cfg . Options [ "path" ] = brokenDashboards
_ , err := NewDashboardFileReader ( cfg , logger , nil )
_ , err := NewDashboardFileReader ( cfg , logger , nil )
So ( err , ShouldBeNil )
require . NoError ( t , err )
} )
} )
Convey ( "Two dashboard providers should be able to provisioned the same dashboard without uid" , func ( ) {
t . Run ( "Two dashboard providers should be able to provisioned the same dashboard without uid" , func ( t * testing . T ) {
setup ( )
cfg1 := & config { Name : "1" , Type : "file" , OrgID : 1 , Folder : "f1" , Options : map [ string ] interface { } { "path" : containingID } }
cfg1 := & config { Name : "1" , Type : "file" , OrgID : 1 , Folder : "f1" , Options : map [ string ] interface { } { "path" : containingID } }
cfg2 := & config { Name : "2" , Type : "file" , OrgID : 1 , Folder : "f2" , Options : map [ string ] interface { } { "path" : containingID } }
cfg2 := & config { Name : "2" , Type : "file" , OrgID : 1 , Folder : "f2" , Options : map [ string ] interface { } { "path" : containingID } }
reader1 , err := NewDashboardFileReader ( cfg1 , logger , nil )
reader1 , err := NewDashboardFileReader ( cfg1 , logger , nil )
So ( err , ShouldBeNil )
require . NoError ( t , err )
err = reader1 . walkDisk ( context . Background ( ) )
err = reader1 . walkDisk ( context . Background ( ) )
So ( err , ShouldBeNil )
require . NoError ( t , err )
reader2 , err := NewDashboardFileReader ( cfg2 , logger , nil )
reader2 , err := NewDashboardFileReader ( cfg2 , logger , nil )
So ( err , ShouldBeNil )
require . NoError ( t , err )
err = reader2 . walkDisk ( context . Background ( ) )
err = reader2 . walkDisk ( context . Background ( ) )
So ( err , ShouldBeNil )
require . NoError ( t , err )
var folderCount int
var folderCount int
var dashCount int
var dashCount int
@ -370,12 +389,13 @@ func TestDashboardFileReader(t *testing.T) {
}
}
}
}
So ( folderCount , ShouldEqual , 2 )
require . Equal ( t , folderCount , 2 )
So ( dashCount , ShouldEqual , 2 )
require . Equal ( t , dashCount , 2 )
} )
} )
} )
} )
Convey ( "Should not create new folder if folder name is missing" , func ( ) {
t . Run ( "Should not create new folder if folder name is missing" , func ( t * testing . T ) {
setup ( )
cfg := & config {
cfg := & config {
Name : "Default" ,
Name : "Default" ,
Type : "file" ,
Type : "file" ,
@ -387,10 +407,11 @@ func TestDashboardFileReader(t *testing.T) {
}
}
_ , err := getOrCreateFolderID ( context . Background ( ) , cfg , fakeService , cfg . Folder )
_ , err := getOrCreateFolderID ( context . Background ( ) , cfg , fakeService , cfg . Folder )
So ( err , ShouldEqual , ErrFolderNameMissing )
require . Equal ( t , err , ErrFolderNameMissing )
} )
} )
Convey ( "can get or Create dashboard folder" , func ( ) {
t . Run ( "can get or Create dashboard folder" , func ( t * testing . T ) {
setup ( )
cfg := & config {
cfg := & config {
Name : "Default" ,
Name : "Default" ,
Type : "file" ,
Type : "file" ,
@ -402,33 +423,42 @@ func TestDashboardFileReader(t *testing.T) {
}
}
folderID , err := getOrCreateFolderID ( context . Background ( ) , cfg , fakeService , cfg . Folder )
folderID , err := getOrCreateFolderID ( context . Background ( ) , cfg , fakeService , cfg . Folder )
So ( err , ShouldBeNil )
require . NoError ( t , err )
inserted := false
inserted := false
for _ , d := range fakeService . inserted {
for _ , d := range fakeService . inserted {
if d . Dashboard . IsFolder && d . Dashboard . Id == folderID {
if d . Dashboard . IsFolder && d . Dashboard . Id == folderID {
inserted = true
inserted = true
}
}
}
}
So ( len ( fakeService . inserted ) , ShouldEqual , 1 )
require . Equal ( t , len ( fakeService . inserted ) , 1 )
So ( inserted , ShouldBeTrue )
require . True ( t , inserted )
} )
} )
Convey ( "Walking the folder with dashboards" , func ( ) {
t . Run ( "Walking the folder with dashboards" , func ( t * testing . T ) {
setup ( )
noFiles := map [ string ] os . FileInfo { }
noFiles := map [ string ] os . FileInfo { }
Convey ( "should skip dirs that starts with ." , func ( ) {
t . Run ( "should skip dirs that starts with ." , func ( t * testing . T ) {
shouldSkip := createWalkFn ( noFiles ) ( "path" , & FakeFileInfo { isDirectory : true , name : ".folder" } , nil )
shouldSkip := createWalkFn ( noFiles ) ( "path" , & FakeFileInfo { isDirectory : true , name : ".folder" } , nil )
So ( shouldSkip , ShouldEqual , filepath . SkipDir )
require . Equal ( t , shouldSkip , filepath . SkipDir )
} )
} )
Convey ( "should keep walking if file is not .json" , func ( ) {
t . Run ( "should keep walking if file is not .json" , func ( t * testing . T ) {
shouldSkip := createWalkFn ( noFiles ) ( "path" , & FakeFileInfo { isDirectory : true , name : "folder" } , nil )
shouldSkip := createWalkFn ( noFiles ) ( "path" , & FakeFileInfo { isDirectory : true , name : "folder" } , nil )
So ( shouldSkip , ShouldBeNil )
require . Nil ( t , shouldSkip )
} )
} )
} )
} )
Convey ( "Given missing dashboard file" , func ( ) {
t . Run ( "Given missing dashboard file" , func ( t * testing . T ) {
cfg := & config {
absPath1 , err := filepath . Abs ( unprovision + "/dashboard1.json" )
require . NoError ( t , err )
// This one does not exist on disk, simulating a deleted file
absPath2 , err := filepath . Abs ( unprovision + "/dashboard2.json" )
require . NoError ( t , err )
setupFakeService := func ( ) {
setup ( )
cfg = & config {
Name : "Default" ,
Name : "Default" ,
Type : "file" ,
Type : "file" ,
OrgID : 1 ,
OrgID : 1 ,
@ -442,44 +472,40 @@ func TestDashboardFileReader(t *testing.T) {
{ Dashboard : & models . Dashboard { Id : 2 } } ,
{ Dashboard : & models . Dashboard { Id : 2 } } ,
}
}
absPath1 , err := filepath . Abs ( unprovision + "/dashboard1.json" )
So ( err , ShouldBeNil )
// This one does not exist on disk, simulating a deleted file
absPath2 , err := filepath . Abs ( unprovision + "/dashboard2.json" )
So ( err , ShouldBeNil )
fakeService . provisioned = map [ string ] [ ] * models . DashboardProvisioning {
fakeService . provisioned = map [ string ] [ ] * models . DashboardProvisioning {
"Default" : {
"Default" : {
{ DashboardId : 1 , Name : "Default" , ExternalId : absPath1 } ,
{ DashboardId : 1 , Name : "Default" , ExternalId : absPath1 } ,
{ DashboardId : 2 , Name : "Default" , ExternalId : absPath2 } ,
{ DashboardId : 2 , Name : "Default" , ExternalId : absPath2 } ,
} ,
} ,
}
}
}
Convey ( "Missing dashboard should be unprovisioned if DisableDeletion = true" , func ( ) {
t . Run ( "Missing dashboard should be unprovisioned if DisableDeletion = true" , func ( t * testing . T ) {
setupFakeService ( )
cfg . DisableDeletion = true
cfg . DisableDeletion = true
reader , err := NewDashboardFileReader ( cfg , logger , nil )
reader , err := NewDashboardFileReader ( cfg , logger , nil )
So ( err , ShouldBeNil )
require . NoError ( t , err )
err = reader . walkDisk ( context . Background ( ) )
err = reader . walkDisk ( context . Background ( ) )
So ( err , ShouldBeNil )
require . NoError ( t , err )
So ( len ( fakeService . provisioned [ "Default" ] ) , ShouldEqual , 1 )
require . Equal ( t , len ( fakeService . provisioned [ "Default" ] ) , 1 )
So ( fakeService . provisioned [ "Default" ] [ 0 ] . ExternalId , ShouldEqual , absPath1 )
require . Equal ( t , fakeService . provisioned [ "Default" ] [ 0 ] . ExternalId , absPath1 )
} )
} )
Convey ( "Missing dashboard should be deleted if DisableDeletion = false" , func ( ) {
t . Run ( "Missing dashboard should be deleted if DisableDeletion = false" , func ( t * testing . T ) {
setupFakeService ( )
reader , err := NewDashboardFileReader ( cfg , logger , nil )
reader , err := NewDashboardFileReader ( cfg , logger , nil )
So ( err , ShouldBeNil )
require . NoError ( t , err )
err = reader . walkDisk ( context . Background ( ) )
err = reader . walkDisk ( context . Background ( ) )
So ( err , ShouldBeNil )
require . NoError ( t , err )
So ( len ( fakeService . provisioned [ "Default" ] ) , ShouldEqual , 1 )
require . Equal ( t , len ( fakeService . provisioned [ "Default" ] ) , 1 )
So ( fakeService . provisioned [ "Default" ] [ 0 ] . ExternalId , ShouldEqual , absPath1 )
require . Equal ( t , fakeService . provisioned [ "Default" ] [ 0 ] . ExternalId , absPath1 )
So ( len ( fakeService . inserted ) , ShouldEqual , 1 )
require . Equal ( t , len ( fakeService . inserted ) , 1 )
So ( fakeService . inserted [ 0 ] . Dashboard . Id , ShouldEqual , 1 )
require . Equal ( t , fakeService . inserted [ 0 ] . Dashboard . Id , int64 ( 1 ) )
} )
} )
} )
} )
} )
}
}