dashboard_service_test.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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. service := dashboardServiceImpl{}
  13. origNewDashboardGuardian := guardian.New
  14. mockDashboardGuardian(&fakeDashboardGuardian{canSave: true})
  15. Convey("Save dashboard validation", func() {
  16. dto := &SaveDashboardDTO{}
  17. Convey("When saving a dashboard with empty title it should return error", func() {
  18. titles := []string{"", " ", " \t "}
  19. for _, title := range titles {
  20. dto.Dashboard = models.NewDashboard(title)
  21. _, err := service.SaveDashboard(dto)
  22. So(err, ShouldEqual, models.ErrDashboardTitleEmpty)
  23. }
  24. })
  25. Convey("Should return validation error if it's a folder and have a folder id", func() {
  26. dto.Dashboard = models.NewDashboardFolder("Folder")
  27. dto.Dashboard.FolderId = 1
  28. _, err := service.SaveDashboard(dto)
  29. So(err, ShouldEqual, models.ErrDashboardFolderCannotHaveParent)
  30. })
  31. Convey("Should return validation error if folder is named General", func() {
  32. dto.Dashboard = models.NewDashboardFolder("General")
  33. _, err := service.SaveDashboard(dto)
  34. So(err, ShouldEqual, models.ErrDashboardFolderNameExists)
  35. })
  36. Convey("When saving a dashboard should validate uid", func() {
  37. bus.AddHandler("test", func(cmd *models.ValidateDashboardAlertsCommand) error {
  38. return nil
  39. })
  40. bus.AddHandler("test", func(cmd *models.ValidateDashboardBeforeSaveCommand) error {
  41. return nil
  42. })
  43. testCases := []struct {
  44. Uid string
  45. Error error
  46. }{
  47. {Uid: "", Error: nil},
  48. {Uid: " ", Error: nil},
  49. {Uid: " \t ", Error: nil},
  50. {Uid: "asdf90_-", Error: nil},
  51. {Uid: "asdf/90", Error: models.ErrDashboardInvalidUid},
  52. {Uid: " asdfghjklqwertyuiopzxcvbnmasdfghjklqwer ", Error: nil},
  53. {Uid: "asdfghjklqwertyuiopzxcvbnmasdfghjklqwertyuiopzxcvbnmasdfghjklqwertyuiopzxcvbnm", Error: models.ErrDashboardUidToLong},
  54. }
  55. for _, tc := range testCases {
  56. dto.Dashboard = models.NewDashboard("title")
  57. dto.Dashboard.SetUid(tc.Uid)
  58. dto.User = &models.SignedInUser{}
  59. _, err := service.buildSaveDashboardCommand(dto)
  60. So(err, ShouldEqual, tc.Error)
  61. }
  62. })
  63. Convey("Should return validation error if alert data is invalid", func() {
  64. bus.AddHandler("test", func(cmd *models.ValidateDashboardAlertsCommand) error {
  65. return errors.New("error")
  66. })
  67. dto.Dashboard = models.NewDashboard("Dash")
  68. _, err := service.SaveDashboard(dto)
  69. So(err, ShouldEqual, models.ErrDashboardContainsInvalidAlertData)
  70. })
  71. })
  72. Reset(func() {
  73. guardian.New = origNewDashboardGuardian
  74. })
  75. })
  76. }
  77. func mockDashboardGuardian(mock *fakeDashboardGuardian) {
  78. guardian.New = func(dashId int64, orgId int64, user *models.SignedInUser) guardian.DashboardGuardian {
  79. mock.orgId = orgId
  80. mock.dashId = dashId
  81. mock.user = user
  82. return mock
  83. }
  84. }
  85. type fakeDashboardGuardian struct {
  86. dashId int64
  87. orgId int64
  88. user *models.SignedInUser
  89. canSave bool
  90. canEdit bool
  91. canView bool
  92. canAdmin bool
  93. hasPermission bool
  94. checkPermissionBeforeUpdate bool
  95. }
  96. func (g *fakeDashboardGuardian) CanSave() (bool, error) {
  97. return g.canSave, nil
  98. }
  99. func (g *fakeDashboardGuardian) CanEdit() (bool, error) {
  100. return g.canEdit, nil
  101. }
  102. func (g *fakeDashboardGuardian) CanView() (bool, error) {
  103. return g.canView, nil
  104. }
  105. func (g *fakeDashboardGuardian) CanAdmin() (bool, error) {
  106. return g.canAdmin, nil
  107. }
  108. func (g *fakeDashboardGuardian) HasPermission(permission models.PermissionType) (bool, error) {
  109. return g.hasPermission, nil
  110. }
  111. func (g *fakeDashboardGuardian) CheckPermissionBeforeUpdate(permission models.PermissionType, updatePermissions []*models.DashboardAcl) (bool, error) {
  112. return g.checkPermissionBeforeUpdate, nil
  113. }
  114. func (g *fakeDashboardGuardian) GetAcl() ([]*models.DashboardAclInfoDTO, error) {
  115. return nil, nil
  116. }