folder_permission_test.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package api
  2. import (
  3. "testing"
  4. "github.com/grafana/grafana/pkg/api/dtos"
  5. "github.com/grafana/grafana/pkg/bus"
  6. "github.com/grafana/grafana/pkg/middleware"
  7. m "github.com/grafana/grafana/pkg/models"
  8. "github.com/grafana/grafana/pkg/services/dashboards"
  9. "github.com/grafana/grafana/pkg/services/guardian"
  10. . "github.com/smartystreets/goconvey/convey"
  11. )
  12. func TestFolderPermissionApiEndpoint(t *testing.T) {
  13. Convey("Folder permissions test", t, func() {
  14. Convey("Given user has no admin permissions", func() {
  15. origNewGuardian := guardian.New
  16. guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{CanAdminValue: false})
  17. mock := &fakeFolderService{
  18. GetFolderByUidResult: &m.Folder{
  19. Id: 1,
  20. Uid: "uid",
  21. Title: "Folder",
  22. },
  23. }
  24. origNewFolderService := dashboards.NewFolderService
  25. mockFolderService(mock)
  26. loggedInUserScenarioWithRole("When calling GET on", "GET", "/api/folders/uid/permissions", "/api/folders/:uid/permissions", m.ROLE_EDITOR, func(sc *scenarioContext) {
  27. callGetFolderPermissions(sc)
  28. So(sc.resp.Code, ShouldEqual, 403)
  29. })
  30. cmd := dtos.UpdateDashboardAclCommand{
  31. Items: []dtos.DashboardAclUpdateItem{
  32. {UserId: 1000, Permission: m.PERMISSION_ADMIN},
  33. },
  34. }
  35. updateFolderPermissionScenario("When calling POST on", "/api/folders/uid/permissions", "/api/folders/:uid/permissions", cmd, func(sc *scenarioContext) {
  36. callUpdateFolderPermissions(sc)
  37. So(sc.resp.Code, ShouldEqual, 403)
  38. })
  39. Reset(func() {
  40. guardian.New = origNewGuardian
  41. dashboards.NewFolderService = origNewFolderService
  42. })
  43. })
  44. Convey("Given user has admin permissions and permissions to update", func() {
  45. origNewGuardian := guardian.New
  46. guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{CanAdminValue: true, CheckPermissionBeforeUpdateValue: true})
  47. mock := &fakeFolderService{
  48. GetFolderByUidResult: &m.Folder{
  49. Id: 1,
  50. Uid: "uid",
  51. Title: "Folder",
  52. },
  53. }
  54. origNewFolderService := dashboards.NewFolderService
  55. mockFolderService(mock)
  56. loggedInUserScenarioWithRole("When calling GET on", "GET", "/api/folders/uid/permissions", "/api/folders/:uid/permissions", m.ROLE_ADMIN, func(sc *scenarioContext) {
  57. callGetFolderPermissions(sc)
  58. So(sc.resp.Code, ShouldEqual, 200)
  59. })
  60. cmd := dtos.UpdateDashboardAclCommand{
  61. Items: []dtos.DashboardAclUpdateItem{
  62. {UserId: 1000, Permission: m.PERMISSION_ADMIN},
  63. },
  64. }
  65. updateFolderPermissionScenario("When calling POST on", "/api/folders/uid/permissions", "/api/folders/:uid/permissions", cmd, func(sc *scenarioContext) {
  66. callUpdateFolderPermissions(sc)
  67. So(sc.resp.Code, ShouldEqual, 200)
  68. })
  69. Reset(func() {
  70. guardian.New = origNewGuardian
  71. dashboards.NewFolderService = origNewFolderService
  72. })
  73. })
  74. })
  75. }
  76. func callGetFolderPermissions(sc *scenarioContext) {
  77. sc.handlerFunc = GetFolderPermissionList
  78. sc.fakeReqWithParams("GET", sc.url, map[string]string{}).exec()
  79. }
  80. func callUpdateFolderPermissions(sc *scenarioContext) {
  81. bus.AddHandler("test", func(cmd *m.UpdateDashboardAclCommand) error {
  82. return nil
  83. })
  84. sc.fakeReqWithParams("POST", sc.url, map[string]string{}).exec()
  85. }
  86. func updateFolderPermissionScenario(desc string, url string, routePattern string, cmd dtos.UpdateDashboardAclCommand, fn scenarioFunc) {
  87. Convey(desc+" "+url, func() {
  88. defer bus.ClearBusHandlers()
  89. sc := setupScenarioContext(url)
  90. sc.defaultHandler = wrap(func(c *middleware.Context) Response {
  91. sc.context = c
  92. sc.context.OrgId = TestOrgID
  93. sc.context.UserId = TestUserID
  94. return UpdateFolderPermissions(c, cmd)
  95. })
  96. sc.m.Post(routePattern, sc.defaultHandler)
  97. fn(sc)
  98. })
  99. }