folder_service_test.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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. cmd.Result = &models.ValidateDashboardBeforeSaveResult{}
  27. return models.ErrDashboardUpdateAccessDenied
  28. })
  29. Convey("When get folder by id should return access denied error", func() {
  30. _, err := service.GetFolderByID(1)
  31. So(err, ShouldNotBeNil)
  32. So(err, ShouldEqual, models.ErrFolderAccessDenied)
  33. })
  34. Convey("When get folder by uid should return access denied error", func() {
  35. _, err := service.GetFolderByUID("uid")
  36. So(err, ShouldNotBeNil)
  37. So(err, ShouldEqual, models.ErrFolderAccessDenied)
  38. })
  39. Convey("When creating folder should return access denied error", func() {
  40. err := service.CreateFolder(&models.CreateFolderCommand{
  41. Title: "Folder",
  42. })
  43. So(err, ShouldNotBeNil)
  44. So(err, ShouldEqual, models.ErrFolderAccessDenied)
  45. })
  46. Convey("When updating folder should return access denied error", func() {
  47. err := service.UpdateFolder("uid", &models.UpdateFolderCommand{
  48. Uid: "uid",
  49. Title: "Folder",
  50. })
  51. So(err, ShouldNotBeNil)
  52. So(err, ShouldEqual, models.ErrFolderAccessDenied)
  53. })
  54. Convey("When deleting folder by uid should return access denied error", func() {
  55. _, err := service.DeleteFolder("uid")
  56. So(err, ShouldNotBeNil)
  57. So(err, ShouldEqual, models.ErrFolderAccessDenied)
  58. })
  59. Reset(func() {
  60. guardian.New = origNewGuardian
  61. })
  62. })
  63. Convey("Given user has permission to save", func() {
  64. origNewGuardian := guardian.New
  65. guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{CanSaveValue: true})
  66. dash := models.NewDashboardFolder("Folder")
  67. dash.Id = 1
  68. bus.AddHandler("test", func(query *models.GetDashboardQuery) error {
  69. query.Result = dash
  70. return nil
  71. })
  72. bus.AddHandler("test", func(cmd *models.ValidateDashboardAlertsCommand) error {
  73. return nil
  74. })
  75. bus.AddHandler("test", func(cmd *models.ValidateDashboardBeforeSaveCommand) error {
  76. cmd.Result = &models.ValidateDashboardBeforeSaveResult{}
  77. return nil
  78. })
  79. bus.AddHandler("test", func(cmd *models.UpdateDashboardAlertsCommand) error {
  80. return nil
  81. })
  82. bus.AddHandler("test", func(cmd *models.SaveDashboardCommand) error {
  83. cmd.Result = dash
  84. return nil
  85. })
  86. bus.AddHandler("test", func(cmd *models.DeleteDashboardCommand) error {
  87. return nil
  88. })
  89. provisioningValidated := false
  90. bus.AddHandler("test", func(query *models.IsDashboardProvisionedQuery) error {
  91. provisioningValidated = true
  92. return nil
  93. })
  94. Convey("When creating folder should not return access denied error", func() {
  95. err := service.CreateFolder(&models.CreateFolderCommand{
  96. Title: "Folder",
  97. })
  98. So(err, ShouldBeNil)
  99. So(provisioningValidated, ShouldBeFalse)
  100. })
  101. Convey("When updating folder should not return access denied error", func() {
  102. err := service.UpdateFolder("uid", &models.UpdateFolderCommand{
  103. Uid: "uid",
  104. Title: "Folder",
  105. })
  106. So(err, ShouldBeNil)
  107. So(provisioningValidated, ShouldBeFalse)
  108. })
  109. Convey("When deleting folder by uid should not return access denied error", func() {
  110. _, err := service.DeleteFolder("uid")
  111. So(err, ShouldBeNil)
  112. })
  113. Reset(func() {
  114. guardian.New = origNewGuardian
  115. })
  116. })
  117. Convey("Given user has permission to view", func() {
  118. origNewGuardian := guardian.New
  119. guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{CanViewValue: true})
  120. dashFolder := models.NewDashboardFolder("Folder")
  121. dashFolder.Id = 1
  122. dashFolder.Uid = "uid-abc"
  123. bus.AddHandler("test", func(query *models.GetDashboardQuery) error {
  124. query.Result = dashFolder
  125. return nil
  126. })
  127. Convey("When get folder by id should return folder", func() {
  128. f, _ := service.GetFolderByID(1)
  129. So(f.Id, ShouldEqual, dashFolder.Id)
  130. So(f.Uid, ShouldEqual, dashFolder.Uid)
  131. So(f.Title, ShouldEqual, dashFolder.Title)
  132. })
  133. Convey("When get folder by uid should return folder", func() {
  134. f, _ := service.GetFolderByUID("uid")
  135. So(f.Id, ShouldEqual, dashFolder.Id)
  136. So(f.Uid, ShouldEqual, dashFolder.Uid)
  137. So(f.Title, ShouldEqual, dashFolder.Title)
  138. })
  139. Reset(func() {
  140. guardian.New = origNewGuardian
  141. })
  142. })
  143. Convey("Should map errors correct", func() {
  144. testCases := []struct {
  145. ActualError error
  146. ExpectedError error
  147. }{
  148. {ActualError: models.ErrDashboardTitleEmpty, ExpectedError: models.ErrFolderTitleEmpty},
  149. {ActualError: models.ErrDashboardUpdateAccessDenied, ExpectedError: models.ErrFolderAccessDenied},
  150. {ActualError: models.ErrDashboardWithSameNameInFolderExists, ExpectedError: models.ErrFolderSameNameExists},
  151. {ActualError: models.ErrDashboardWithSameUIDExists, ExpectedError: models.ErrFolderWithSameUIDExists},
  152. {ActualError: models.ErrDashboardVersionMismatch, ExpectedError: models.ErrFolderVersionMismatch},
  153. {ActualError: models.ErrDashboardNotFound, ExpectedError: models.ErrFolderNotFound},
  154. {ActualError: models.ErrDashboardFailedGenerateUniqueUid, ExpectedError: models.ErrFolderFailedGenerateUniqueUid},
  155. {ActualError: models.ErrDashboardInvalidUid, ExpectedError: models.ErrDashboardInvalidUid},
  156. }
  157. for _, tc := range testCases {
  158. actualError := toFolderError(tc.ActualError)
  159. if actualError != tc.ExpectedError {
  160. t.Errorf("For error '%s' expected error '%s', actual '%s'", tc.ActualError, tc.ExpectedError, actualError)
  161. }
  162. }
  163. })
  164. })
  165. }