dashboard_service_test.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. package dashboards
  2. import (
  3. "errors"
  4. "testing"
  5. "github.com/grafana/grafana/pkg/services/guardian"
  6. "github.com/grafana/grafana/pkg/bus"
  7. "github.com/grafana/grafana/pkg/models"
  8. . "github.com/smartystreets/goconvey/convey"
  9. )
  10. func TestDashboardService(t *testing.T) {
  11. Convey("Dashboard service tests", t, func() {
  12. bus.ClearBusHandlers()
  13. service := &dashboardServiceImpl{}
  14. origNewDashboardGuardian := guardian.New
  15. guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{CanSaveValue: true})
  16. Convey("Save dashboard validation", func() {
  17. dto := &SaveDashboardDTO{}
  18. Convey("When saving a dashboard with empty title it should return error", func() {
  19. titles := []string{"", " ", " \t "}
  20. for _, title := range titles {
  21. dto.Dashboard = models.NewDashboard(title)
  22. _, err := service.SaveDashboard(dto)
  23. So(err, ShouldEqual, models.ErrDashboardTitleEmpty)
  24. }
  25. })
  26. Convey("Should return validation error if it's a folder and have a folder id", func() {
  27. dto.Dashboard = models.NewDashboardFolder("Folder")
  28. dto.Dashboard.FolderId = 1
  29. _, err := service.SaveDashboard(dto)
  30. So(err, ShouldEqual, models.ErrDashboardFolderCannotHaveParent)
  31. })
  32. Convey("Should return validation error if folder is named General", func() {
  33. dto.Dashboard = models.NewDashboardFolder("General")
  34. _, err := service.SaveDashboard(dto)
  35. So(err, ShouldEqual, models.ErrDashboardFolderNameExists)
  36. })
  37. Convey("When saving a dashboard should validate uid", func() {
  38. bus.AddHandler("test", func(cmd *models.ValidateDashboardAlertsCommand) error {
  39. return nil
  40. })
  41. bus.AddHandler("test", func(cmd *models.ValidateDashboardBeforeSaveCommand) error {
  42. return nil
  43. })
  44. bus.AddHandler("test", func(cmd *models.IsDashboardProvisionedQuery) error {
  45. cmd.Result = false
  46. return nil
  47. })
  48. testCases := []struct {
  49. Uid string
  50. Error error
  51. }{
  52. {Uid: "", Error: nil},
  53. {Uid: " ", Error: nil},
  54. {Uid: " \t ", Error: nil},
  55. {Uid: "asdf90_-", Error: nil},
  56. {Uid: "asdf/90", Error: models.ErrDashboardInvalidUid},
  57. {Uid: " asdfghjklqwertyuiopzxcvbnmasdfghjklqwer ", Error: nil},
  58. {Uid: "asdfghjklqwertyuiopzxcvbnmasdfghjklqwertyuiopzxcvbnmasdfghjklqwertyuiopzxcvbnm", Error: models.ErrDashboardUidToLong},
  59. }
  60. for _, tc := range testCases {
  61. dto.Dashboard = models.NewDashboard("title")
  62. dto.Dashboard.SetUid(tc.Uid)
  63. dto.User = &models.SignedInUser{}
  64. _, err := service.buildSaveDashboardCommand(dto, true, false)
  65. So(err, ShouldEqual, tc.Error)
  66. }
  67. })
  68. Convey("Should return validation error if dashboard is provisioned", func() {
  69. provisioningValidated := false
  70. bus.AddHandler("test", func(cmd *models.IsDashboardProvisionedQuery) error {
  71. provisioningValidated = true
  72. cmd.Result = true
  73. return nil
  74. })
  75. bus.AddHandler("test", func(cmd *models.ValidateDashboardAlertsCommand) error {
  76. return nil
  77. })
  78. bus.AddHandler("test", func(cmd *models.ValidateDashboardBeforeSaveCommand) error {
  79. return nil
  80. })
  81. dto.Dashboard = models.NewDashboard("Dash")
  82. dto.Dashboard.SetId(3)
  83. dto.User = &models.SignedInUser{UserId: 1}
  84. _, err := service.SaveDashboard(dto)
  85. So(provisioningValidated, ShouldBeTrue)
  86. So(err, ShouldEqual, models.ErrDashboardCannotSaveProvisionedDashboard)
  87. })
  88. Convey("Should return validation error if alert data is invalid", func() {
  89. bus.AddHandler("test", func(cmd *models.IsDashboardProvisionedQuery) error {
  90. cmd.Result = false
  91. return nil
  92. })
  93. bus.AddHandler("test", func(cmd *models.ValidateDashboardAlertsCommand) error {
  94. return errors.New("error")
  95. })
  96. dto.Dashboard = models.NewDashboard("Dash")
  97. _, err := service.SaveDashboard(dto)
  98. So(err, ShouldEqual, models.ErrDashboardContainsInvalidAlertData)
  99. })
  100. })
  101. Convey("Save provisioned dashboard validation", func() {
  102. dto := &SaveDashboardDTO{}
  103. Convey("Should not return validation error if dashboard is provisioned", func() {
  104. provisioningValidated := false
  105. bus.AddHandler("test", func(cmd *models.IsDashboardProvisionedQuery) error {
  106. provisioningValidated = true
  107. cmd.Result = true
  108. return nil
  109. })
  110. bus.AddHandler("test", func(cmd *models.ValidateDashboardAlertsCommand) error {
  111. return nil
  112. })
  113. bus.AddHandler("test", func(cmd *models.ValidateDashboardBeforeSaveCommand) error {
  114. return nil
  115. })
  116. bus.AddHandler("test", func(cmd *models.SaveProvisionedDashboardCommand) error {
  117. return nil
  118. })
  119. bus.AddHandler("test", func(cmd *models.UpdateDashboardAlertsCommand) error {
  120. return nil
  121. })
  122. dto.Dashboard = models.NewDashboard("Dash")
  123. dto.Dashboard.SetId(3)
  124. dto.User = &models.SignedInUser{UserId: 1}
  125. _, err := service.SaveProvisionedDashboard(dto, nil)
  126. So(err, ShouldBeNil)
  127. So(provisioningValidated, ShouldBeFalse)
  128. })
  129. })
  130. Convey("Import dashboard validation", func() {
  131. dto := &SaveDashboardDTO{}
  132. Convey("Should return validation error if dashboard is provisioned", func() {
  133. provisioningValidated := false
  134. bus.AddHandler("test", func(cmd *models.IsDashboardProvisionedQuery) error {
  135. provisioningValidated = true
  136. cmd.Result = true
  137. return nil
  138. })
  139. bus.AddHandler("test", func(cmd *models.ValidateDashboardAlertsCommand) error {
  140. return nil
  141. })
  142. bus.AddHandler("test", func(cmd *models.ValidateDashboardBeforeSaveCommand) error {
  143. return nil
  144. })
  145. bus.AddHandler("test", func(cmd *models.SaveProvisionedDashboardCommand) error {
  146. return nil
  147. })
  148. bus.AddHandler("test", func(cmd *models.UpdateDashboardAlertsCommand) error {
  149. return nil
  150. })
  151. dto.Dashboard = models.NewDashboard("Dash")
  152. dto.Dashboard.SetId(3)
  153. dto.User = &models.SignedInUser{UserId: 1}
  154. _, err := service.ImportDashboard(dto)
  155. So(provisioningValidated, ShouldBeTrue)
  156. So(err, ShouldEqual, models.ErrDashboardCannotSaveProvisionedDashboard)
  157. })
  158. })
  159. Reset(func() {
  160. guardian.New = origNewDashboardGuardian
  161. })
  162. })
  163. }