file_reader_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package dashboards
  2. import (
  3. "os"
  4. "testing"
  5. "time"
  6. "github.com/grafana/grafana/pkg/bus"
  7. "github.com/grafana/grafana/pkg/models"
  8. "github.com/grafana/grafana/pkg/services/dashboards"
  9. "github.com/grafana/grafana/pkg/log"
  10. . "github.com/smartystreets/goconvey/convey"
  11. )
  12. var (
  13. defaultDashboards string = "./test-dashboards/folder-one"
  14. brokenDashboards string = "./test-dashboards/broken-dashboards"
  15. oneDashboard string = "./test-dashboards/one-dashboard"
  16. fakeRepo *fakeDashboardRepo
  17. )
  18. func TestDashboardFileReader(t *testing.T) {
  19. Convey("Reading dashboards from disk", t, func() {
  20. bus.ClearBusHandlers()
  21. fakeRepo = &fakeDashboardRepo{}
  22. bus.AddHandler("test", mockGetDashboardQuery)
  23. dashboards.SetRepository(fakeRepo)
  24. logger := log.New("test.logger")
  25. cfg := &DashboardsAsConfig{
  26. Name: "Default",
  27. Type: "file",
  28. OrgId: 1,
  29. Folder: "",
  30. Options: map[string]interface{}{},
  31. }
  32. Convey("Can read default dashboard", func() {
  33. cfg.Options["folder"] = defaultDashboards
  34. reader, err := NewDashboardFileReader(cfg, logger)
  35. So(err, ShouldBeNil)
  36. err = reader.walkFolder()
  37. So(err, ShouldBeNil)
  38. So(len(fakeRepo.inserted), ShouldEqual, 2)
  39. })
  40. Convey("Should not update dashboards when db is newer", func() {
  41. cfg.Options["folder"] = oneDashboard
  42. fakeRepo.getDashboard = append(fakeRepo.getDashboard, &models.Dashboard{
  43. Updated: time.Now().Add(time.Hour),
  44. Slug: "grafana",
  45. })
  46. reader, err := NewDashboardFileReader(cfg, logger)
  47. So(err, ShouldBeNil)
  48. err = reader.walkFolder()
  49. So(err, ShouldBeNil)
  50. So(len(fakeRepo.inserted), ShouldEqual, 0)
  51. })
  52. Convey("Can read default dashboard and replace old version in database", func() {
  53. cfg.Options["folder"] = oneDashboard
  54. stat, _ := os.Stat(oneDashboard + "/dashboard1.json")
  55. fakeRepo.getDashboard = append(fakeRepo.getDashboard, &models.Dashboard{
  56. Updated: stat.ModTime().AddDate(0, 0, -1),
  57. Slug: "grafana",
  58. })
  59. reader, err := NewDashboardFileReader(cfg, logger)
  60. So(err, ShouldBeNil)
  61. err = reader.walkFolder()
  62. So(err, ShouldBeNil)
  63. So(len(fakeRepo.inserted), ShouldEqual, 1)
  64. })
  65. Convey("Invalid configuration should return error", func() {
  66. cfg := &DashboardsAsConfig{
  67. Name: "Default",
  68. Type: "file",
  69. OrgId: 1,
  70. Folder: "",
  71. }
  72. _, err := NewDashboardFileReader(cfg, logger)
  73. So(err, ShouldNotBeNil)
  74. })
  75. Convey("Broken dashboards should not cause error", func() {
  76. cfg := &DashboardsAsConfig{
  77. Name: "Default",
  78. Type: "file",
  79. OrgId: 1,
  80. Folder: "",
  81. Options: map[string]interface{}{
  82. "folder": brokenDashboards,
  83. },
  84. }
  85. _, err := NewDashboardFileReader(cfg, logger)
  86. So(err, ShouldBeNil)
  87. })
  88. })
  89. }
  90. type fakeDashboardRepo struct {
  91. inserted []*dashboards.SaveDashboardItem
  92. getDashboard []*models.Dashboard
  93. }
  94. func (repo *fakeDashboardRepo) SaveDashboard(json *dashboards.SaveDashboardItem) (*models.Dashboard, error) {
  95. repo.inserted = append(repo.inserted, json)
  96. return json.Dashboard, nil
  97. }
  98. func mockGetDashboardQuery(cmd *models.GetDashboardQuery) error {
  99. for _, d := range fakeRepo.getDashboard {
  100. if d.Slug == cmd.Slug {
  101. cmd.Result = d
  102. return nil
  103. }
  104. }
  105. return models.ErrDashboardNotFound
  106. }