file_reader_test.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package dashboard
  2. import (
  3. "github.com/grafana/grafana/pkg/bus"
  4. "github.com/grafana/grafana/pkg/models"
  5. "github.com/grafana/grafana/pkg/services/alerting"
  6. "os"
  7. "testing"
  8. "time"
  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. bus.AddHandler("test", mockValidateDashboardAlertsCommand)
  24. bus.AddHandler("test", mockSaveDashboardCommand)
  25. bus.AddHandler("test", mockUpdateDashboardAlertsCommand)
  26. logger := log.New("test.logger")
  27. cfg := &DashboardsAsConfig{
  28. Name: "Default",
  29. Type: "file",
  30. OrgId: 1,
  31. Folder: "",
  32. Options: map[string]interface{}{},
  33. }
  34. Convey("Can read default dashboard", func() {
  35. cfg.Options["folder"] = defaultDashboards
  36. reader, err := NewDashboardFilereader(cfg, logger)
  37. So(err, ShouldBeNil)
  38. err = reader.walkFolder()
  39. So(err, ShouldBeNil)
  40. So(len(fakeRepo.inserted), ShouldEqual, 2)
  41. })
  42. Convey("Should not update dashboards when db is newer", func() {
  43. cfg.Options["folder"] = oneDashboard
  44. fakeRepo.getDashboard = append(fakeRepo.getDashboard, &models.Dashboard{
  45. Updated: time.Now().Add(time.Hour),
  46. Slug: "grafana",
  47. })
  48. reader, err := NewDashboardFilereader(cfg, logger)
  49. So(err, ShouldBeNil)
  50. err = reader.walkFolder()
  51. So(err, ShouldBeNil)
  52. So(len(fakeRepo.inserted), ShouldEqual, 0)
  53. })
  54. Convey("Can read default dashboard and replace old version in database", func() {
  55. cfg.Options["folder"] = oneDashboard
  56. stat, _ := os.Stat(oneDashboard + "/dashboard1.json")
  57. fakeRepo.getDashboard = append(fakeRepo.getDashboard, &models.Dashboard{
  58. Updated: stat.ModTime().AddDate(0, 0, -1),
  59. Slug: "grafana",
  60. })
  61. reader, err := NewDashboardFilereader(cfg, logger)
  62. So(err, ShouldBeNil)
  63. err = reader.walkFolder()
  64. So(err, ShouldBeNil)
  65. So(len(fakeRepo.inserted), ShouldEqual, 1)
  66. })
  67. Convey("Invalid configuration should return error", func() {
  68. cfg := &DashboardsAsConfig{
  69. Name: "Default",
  70. Type: "file",
  71. OrgId: 1,
  72. Folder: "",
  73. }
  74. _, err := NewDashboardFilereader(cfg, logger)
  75. So(err, ShouldNotBeNil)
  76. })
  77. Convey("Broken dashboards should not cause error", func() {
  78. cfg := &DashboardsAsConfig{
  79. Name: "Default",
  80. Type: "file",
  81. OrgId: 1,
  82. Folder: "",
  83. Options: map[string]interface{}{
  84. "folder": brokenDashboards,
  85. },
  86. }
  87. _, err := NewDashboardFilereader(cfg, logger)
  88. So(err, ShouldBeNil)
  89. })
  90. })
  91. }
  92. type fakeDashboardRepo struct {
  93. inserted []*models.SaveDashboardCommand
  94. getDashboard []*models.Dashboard
  95. }
  96. func mockGetDashboardQuery(cmd *models.GetDashboardQuery) error {
  97. for _, d := range fakeRepo.getDashboard {
  98. if d.Slug == cmd.Slug {
  99. cmd.Result = d
  100. return nil
  101. }
  102. }
  103. return models.ErrDashboardNotFound
  104. }
  105. func mockValidateDashboardAlertsCommand(cmd *alerting.ValidateDashboardAlertsCommand) error {
  106. return nil
  107. }
  108. func mockSaveDashboardCommand(cmd *models.SaveDashboardCommand) error {
  109. fakeRepo.inserted = append(fakeRepo.inserted, cmd)
  110. return nil
  111. }
  112. func mockUpdateDashboardAlertsCommand(cmd *alerting.UpdateDashboardAlertsCommand) error {
  113. return nil
  114. }