folder_service_test.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. package dashboards
  2. import (
  3. "testing"
  4. "github.com/grafana/grafana/pkg/bus"
  5. "github.com/grafana/grafana/pkg/models"
  6. "github.com/grafana/grafana/pkg/services/guardian"
  7. . "github.com/smartystreets/goconvey/convey"
  8. )
  9. func TestFolderService(t *testing.T) {
  10. Convey("Folder service tests", t, func() {
  11. service := dashboardServiceImpl{
  12. orgId: 1,
  13. user: &models.SignedInUser{UserId: 1},
  14. }
  15. Convey("Given user has no permissions", func() {
  16. origNewGuardian := guardian.New
  17. guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{})
  18. bus.AddHandler("test", func(query *models.GetDashboardQuery) error {
  19. query.Result = models.NewDashboardFolder("Folder")
  20. return nil
  21. })
  22. bus.AddHandler("test", func(cmd *models.ValidateDashboardAlertsCommand) error {
  23. return nil
  24. })
  25. bus.AddHandler("test", func(cmd *models.ValidateDashboardBeforeSaveCommand) error {
  26. return models.ErrDashboardUpdateAccessDenied
  27. })
  28. Convey("When get folder by id should return access denied error", func() {
  29. _, err := service.GetFolderByID(1)
  30. So(err, ShouldNotBeNil)
  31. So(err, ShouldEqual, models.ErrFolderAccessDenied)
  32. })
  33. Convey("When get folder by uid should return access denied error", func() {
  34. _, err := service.GetFolderByUID("uid")
  35. So(err, ShouldNotBeNil)
  36. So(err, ShouldEqual, models.ErrFolderAccessDenied)
  37. })
  38. Convey("When creating folder should return access denied error", func() {
  39. err := service.CreateFolder(&models.CreateFolderCommand{
  40. Title: "Folder",
  41. })
  42. So(err, ShouldNotBeNil)
  43. So(err, ShouldEqual, models.ErrFolderAccessDenied)
  44. })
  45. Convey("When updating folder should return access denied error", func() {
  46. err := service.UpdateFolder("uid", &models.UpdateFolderCommand{
  47. Uid: "uid",
  48. Title: "Folder",
  49. })
  50. So(err, ShouldNotBeNil)
  51. So(err, ShouldEqual, models.ErrFolderAccessDenied)
  52. })
  53. Convey("When deleting folder by uid should return access denied error", func() {
  54. _, err := service.DeleteFolder("uid")
  55. So(err, ShouldNotBeNil)
  56. So(err, ShouldEqual, models.ErrFolderAccessDenied)
  57. })
  58. Reset(func() {
  59. guardian.New = origNewGuardian
  60. })
  61. })
  62. Convey("Given user has permission to save", func() {
  63. origNewGuardian := guardian.New
  64. guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{CanSaveValue: true})
  65. dash := models.NewDashboardFolder("Folder")
  66. dash.Id = 1
  67. bus.AddHandler("test", func(query *models.GetDashboardQuery) error {
  68. query.Result = dash
  69. return nil
  70. })
  71. bus.AddHandler("test", func(cmd *models.ValidateDashboardAlertsCommand) error {
  72. return nil
  73. })
  74. bus.AddHandler("test", func(cmd *models.ValidateDashboardBeforeSaveCommand) error {
  75. return nil
  76. })
  77. bus.AddHandler("test", func(cmd *models.UpdateDashboardAlertsCommand) error {
  78. return nil
  79. })
  80. bus.AddHandler("test", func(cmd *models.SaveDashboardCommand) error {
  81. cmd.Result = dash
  82. return nil
  83. })
  84. bus.AddHandler("test", func(cmd *models.DeleteDashboardCommand) error {
  85. return nil
  86. })
  87. Convey("When creating folder should not return access denied error", func() {
  88. err := service.CreateFolder(&models.CreateFolderCommand{
  89. Title: "Folder",
  90. })
  91. So(err, ShouldBeNil)
  92. })
  93. Convey("When updating folder should not return access denied error", func() {
  94. err := service.UpdateFolder("uid", &models.UpdateFolderCommand{
  95. Uid: "uid",
  96. Title: "Folder",
  97. })
  98. So(err, ShouldBeNil)
  99. })
  100. Convey("When deleting folder by uid should not return access denied error", func() {
  101. _, err := service.DeleteFolder("uid")
  102. So(err, ShouldBeNil)
  103. })
  104. Reset(func() {
  105. guardian.New = origNewGuardian
  106. })
  107. })
  108. Convey("Given user has permission to view", func() {
  109. origNewGuardian := guardian.New
  110. guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{CanViewValue: true})
  111. dashFolder := models.NewDashboardFolder("Folder")
  112. dashFolder.Id = 1
  113. dashFolder.Uid = "uid-abc"
  114. bus.AddHandler("test", func(query *models.GetDashboardQuery) error {
  115. query.Result = dashFolder
  116. return nil
  117. })
  118. Convey("When get folder by id should return folder", func() {
  119. f, _ := service.GetFolderByID(1)
  120. So(f.Id, ShouldEqual, dashFolder.Id)
  121. So(f.Uid, ShouldEqual, dashFolder.Uid)
  122. So(f.Title, ShouldEqual, dashFolder.Title)
  123. })
  124. Convey("When get folder by uid should return folder", func() {
  125. f, _ := service.GetFolderByUID("uid")
  126. So(f.Id, ShouldEqual, dashFolder.Id)
  127. So(f.Uid, ShouldEqual, dashFolder.Uid)
  128. So(f.Title, ShouldEqual, dashFolder.Title)
  129. })
  130. Reset(func() {
  131. guardian.New = origNewGuardian
  132. })
  133. })
  134. Convey("Should map errors correct", func() {
  135. testCases := []struct {
  136. ActualError error
  137. ExpectedError error
  138. }{
  139. {ActualError: models.ErrDashboardTitleEmpty, ExpectedError: models.ErrFolderTitleEmpty},
  140. {ActualError: models.ErrDashboardUpdateAccessDenied, ExpectedError: models.ErrFolderAccessDenied},
  141. {ActualError: models.ErrDashboardWithSameNameInFolderExists, ExpectedError: models.ErrFolderSameNameExists},
  142. {ActualError: models.ErrDashboardWithSameUIDExists, ExpectedError: models.ErrFolderWithSameUIDExists},
  143. {ActualError: models.ErrDashboardVersionMismatch, ExpectedError: models.ErrFolderVersionMismatch},
  144. {ActualError: models.ErrDashboardNotFound, ExpectedError: models.ErrFolderNotFound},
  145. {ActualError: models.ErrDashboardFailedGenerateUniqueUid, ExpectedError: models.ErrFolderFailedGenerateUniqueUid},
  146. {ActualError: models.ErrDashboardInvalidUid, ExpectedError: models.ErrDashboardInvalidUid},
  147. }
  148. for _, tc := range testCases {
  149. actualError := toFolderError(tc.ActualError)
  150. if actualError != tc.ExpectedError {
  151. t.Errorf("For error '%s' expected error '%s', actual '%s'", tc.ActualError, tc.ExpectedError, actualError)
  152. }
  153. }
  154. })
  155. })
  156. }