diff --git a/pkg/services/provisioning/dashboard/file_reader_test.go b/pkg/services/provisioning/dashboard/file_reader_test.go index 095d0feeb3f..e335ee08aa2 100644 --- a/pkg/services/provisioning/dashboard/file_reader_test.go +++ b/pkg/services/provisioning/dashboard/file_reader_test.go @@ -4,7 +4,9 @@ import ( "github.com/grafana/grafana/pkg/bus" "github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/services/alerting" + "os" "testing" + "time" "github.com/grafana/grafana/pkg/log" . "github.com/smartystreets/goconvey/convey" @@ -13,11 +15,15 @@ import ( var ( defaultDashboards string = "./test-dashboards/folder-one" brokenDashboards string = "./test-dashboards/broken-dashboards" + oneDashboard string = "./test-dashboards/one-dashboard" + + fakeRepo *fakeDashboardRepo ) func TestDashboardFileReader(t *testing.T) { Convey("Reading dashboards from disk", t, func() { bus.ClearBusHandlers() + fakeRepo = &fakeDashboardRepo{} bus.AddHandler("test", mockGetDashboardQuery) bus.AddHandler("test", mockValidateDashboardAlertsCommand) @@ -25,21 +31,60 @@ func TestDashboardFileReader(t *testing.T) { bus.AddHandler("test", mockUpdateDashboardAlertsCommand) logger := log.New("test.logger") + cfg := &DashboardsAsConfig{ + Name: "Default", + Type: "file", + OrgId: 1, + Folder: "", + Options: map[string]interface{}{}, + } + Convey("Can read default dashboard", func() { - cfg := &DashboardsAsConfig{ - Name: "Default", - Type: "file", - OrgId: 1, - Folder: "", - Options: map[string]interface{}{ - "folder": defaultDashboards, - }, - } + cfg.Options["folder"] = defaultDashboards + reader, err := NewDashboardFilereader(cfg, logger) So(err, ShouldBeNil) err = reader.walkFolder() So(err, ShouldBeNil) + + So(len(fakeRepo.inserted), ShouldEqual, 2) + }) + + Convey("Should not update dashboards when db is newer", func() { + cfg.Options["folder"] = oneDashboard + + fakeRepo.getDashboard = append(fakeRepo.getDashboard, &models.Dashboard{ + Updated: time.Now().Add(time.Hour), + Slug: "grafana", + }) + + reader, err := NewDashboardFilereader(cfg, logger) + So(err, ShouldBeNil) + + err = reader.walkFolder() + So(err, ShouldBeNil) + + So(len(fakeRepo.inserted), ShouldEqual, 0) + }) + + Convey("Can read default dashboard and replace old version in database", func() { + cfg.Options["folder"] = oneDashboard + + stat, _ := os.Stat(oneDashboard + "/dashboard1.json") + + fakeRepo.getDashboard = append(fakeRepo.getDashboard, &models.Dashboard{ + Updated: stat.ModTime().AddDate(0, 0, -1), + Slug: "grafana", + }) + + reader, err := NewDashboardFilereader(cfg, logger) + So(err, ShouldBeNil) + + err = reader.walkFolder() + So(err, ShouldBeNil) + + So(len(fakeRepo.inserted), ShouldEqual, 1) }) Convey("Invalid configuration should return error", func() { @@ -71,7 +116,19 @@ func TestDashboardFileReader(t *testing.T) { }) } +type fakeDashboardRepo struct { + inserted []*models.SaveDashboardCommand + getDashboard []*models.Dashboard +} + func mockGetDashboardQuery(cmd *models.GetDashboardQuery) error { + for _, d := range fakeRepo.getDashboard { + if d.Slug == cmd.Slug { + cmd.Result = d + return nil + } + } + return models.ErrDashboardNotFound } @@ -80,6 +137,7 @@ func mockValidateDashboardAlertsCommand(cmd *alerting.ValidateDashboardAlertsCom } func mockSaveDashboardCommand(cmd *models.SaveDashboardCommand) error { + fakeRepo.inserted = append(fakeRepo.inserted, cmd) return nil } diff --git a/pkg/services/provisioning/dashboard/test-dashboards/one-dashboard/dashboard1.json b/pkg/services/provisioning/dashboard/test-dashboards/one-dashboard/dashboard1.json new file mode 100644 index 00000000000..5b6765a4ed6 --- /dev/null +++ b/pkg/services/provisioning/dashboard/test-dashboards/one-dashboard/dashboard1.json @@ -0,0 +1,173 @@ +{ + "title": "Grafana", + "tags": [], + "style": "dark", + "timezone": "browser", + "editable": true, + "rows": [ + { + "title": "New row", + "height": "150px", + "collapse": false, + "editable": true, + "panels": [ + { + "id": 1, + "span": 12, + "editable": true, + "type": "text", + "mode": "html", + "content": "