dashboard_acl_test.go 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. package sqlstore
  2. import (
  3. "testing"
  4. . "github.com/smartystreets/goconvey/convey"
  5. m "github.com/grafana/grafana/pkg/models"
  6. )
  7. func TestDashboardAclDataAccess(t *testing.T) {
  8. Convey("Testing DB", t, func() {
  9. InitTestDB(t)
  10. Convey("Given a dashboard folder and a user", func() {
  11. currentUser := createUser("viewer", "Viewer", false)
  12. savedFolder := insertTestDashboard("1 test dash folder", 1, 0, true, "prod", "webapp")
  13. childDash := insertTestDashboard("2 test dash", 1, savedFolder.Id, false, "prod", "webapp")
  14. Convey("When adding dashboard permission with userId and teamId set to 0", func() {
  15. err := testHelperUpdateDashboardAcl(savedFolder.Id, m.DashboardAcl{
  16. OrgId: 1,
  17. DashboardId: savedFolder.Id,
  18. Permission: m.PERMISSION_EDIT,
  19. })
  20. So(err, ShouldEqual, m.ErrDashboardAclInfoMissing)
  21. })
  22. Convey("Given dashboard folder with default permissions", func() {
  23. Convey("When reading folder acl should include default acl", func() {
  24. query := m.GetDashboardAclInfoListQuery{DashboardId: savedFolder.Id, OrgId: 1}
  25. err := GetDashboardAclInfoList(&query)
  26. So(err, ShouldBeNil)
  27. So(len(query.Result), ShouldEqual, 2)
  28. defaultPermissionsId := -1
  29. So(query.Result[0].DashboardId, ShouldEqual, defaultPermissionsId)
  30. So(*query.Result[0].Role, ShouldEqual, m.ROLE_VIEWER)
  31. So(query.Result[0].Inherited, ShouldBeFalse)
  32. So(query.Result[1].DashboardId, ShouldEqual, defaultPermissionsId)
  33. So(*query.Result[1].Role, ShouldEqual, m.ROLE_EDITOR)
  34. So(query.Result[1].Inherited, ShouldBeFalse)
  35. })
  36. Convey("When reading dashboard acl should include acl for parent folder", func() {
  37. query := m.GetDashboardAclInfoListQuery{DashboardId: childDash.Id, OrgId: 1}
  38. err := GetDashboardAclInfoList(&query)
  39. So(err, ShouldBeNil)
  40. So(len(query.Result), ShouldEqual, 2)
  41. defaultPermissionsId := -1
  42. So(query.Result[0].DashboardId, ShouldEqual, defaultPermissionsId)
  43. So(*query.Result[0].Role, ShouldEqual, m.ROLE_VIEWER)
  44. So(query.Result[0].Inherited, ShouldBeTrue)
  45. So(query.Result[1].DashboardId, ShouldEqual, defaultPermissionsId)
  46. So(*query.Result[1].Role, ShouldEqual, m.ROLE_EDITOR)
  47. So(query.Result[1].Inherited, ShouldBeTrue)
  48. })
  49. })
  50. Convey("Given dashboard folder with removed default permissions", func() {
  51. err := UpdateDashboardAcl(&m.UpdateDashboardAclCommand{
  52. DashboardId: savedFolder.Id,
  53. Items: []*m.DashboardAcl{},
  54. })
  55. So(err, ShouldBeNil)
  56. Convey("When reading dashboard acl should return no acl items", func() {
  57. query := m.GetDashboardAclInfoListQuery{DashboardId: childDash.Id, OrgId: 1}
  58. err := GetDashboardAclInfoList(&query)
  59. So(err, ShouldBeNil)
  60. So(len(query.Result), ShouldEqual, 0)
  61. })
  62. })
  63. Convey("Given dashboard folder permission", func() {
  64. err := testHelperUpdateDashboardAcl(savedFolder.Id, m.DashboardAcl{
  65. OrgId: 1,
  66. UserId: currentUser.Id,
  67. DashboardId: savedFolder.Id,
  68. Permission: m.PERMISSION_EDIT,
  69. })
  70. So(err, ShouldBeNil)
  71. Convey("When reading dashboard acl should include acl for parent folder", func() {
  72. query := m.GetDashboardAclInfoListQuery{DashboardId: childDash.Id, OrgId: 1}
  73. err := GetDashboardAclInfoList(&query)
  74. So(err, ShouldBeNil)
  75. So(len(query.Result), ShouldEqual, 1)
  76. So(query.Result[0].DashboardId, ShouldEqual, savedFolder.Id)
  77. })
  78. Convey("Given child dashboard permission", func() {
  79. err := testHelperUpdateDashboardAcl(childDash.Id, m.DashboardAcl{
  80. OrgId: 1,
  81. UserId: currentUser.Id,
  82. DashboardId: childDash.Id,
  83. Permission: m.PERMISSION_EDIT,
  84. })
  85. So(err, ShouldBeNil)
  86. Convey("When reading dashboard acl should include acl for parent folder and child", func() {
  87. query := m.GetDashboardAclInfoListQuery{OrgId: 1, DashboardId: childDash.Id}
  88. err := GetDashboardAclInfoList(&query)
  89. So(err, ShouldBeNil)
  90. So(len(query.Result), ShouldEqual, 2)
  91. So(query.Result[0].DashboardId, ShouldEqual, savedFolder.Id)
  92. So(query.Result[0].Inherited, ShouldBeTrue)
  93. So(query.Result[1].DashboardId, ShouldEqual, childDash.Id)
  94. So(query.Result[1].Inherited, ShouldBeFalse)
  95. })
  96. })
  97. })
  98. Convey("Given child dashboard permission in folder with no permissions", func() {
  99. err := testHelperUpdateDashboardAcl(childDash.Id, m.DashboardAcl{
  100. OrgId: 1,
  101. UserId: currentUser.Id,
  102. DashboardId: childDash.Id,
  103. Permission: m.PERMISSION_EDIT,
  104. })
  105. So(err, ShouldBeNil)
  106. Convey("When reading dashboard acl should include default acl for parent folder and the child acl", func() {
  107. query := m.GetDashboardAclInfoListQuery{OrgId: 1, DashboardId: childDash.Id}
  108. err := GetDashboardAclInfoList(&query)
  109. So(err, ShouldBeNil)
  110. defaultPermissionsId := -1
  111. So(len(query.Result), ShouldEqual, 3)
  112. So(query.Result[0].DashboardId, ShouldEqual, defaultPermissionsId)
  113. So(*query.Result[0].Role, ShouldEqual, m.ROLE_VIEWER)
  114. So(query.Result[0].Inherited, ShouldBeTrue)
  115. So(query.Result[1].DashboardId, ShouldEqual, defaultPermissionsId)
  116. So(*query.Result[1].Role, ShouldEqual, m.ROLE_EDITOR)
  117. So(query.Result[1].Inherited, ShouldBeTrue)
  118. So(query.Result[2].DashboardId, ShouldEqual, childDash.Id)
  119. So(query.Result[2].Inherited, ShouldBeFalse)
  120. })
  121. })
  122. Convey("Should be able to add dashboard permission", func() {
  123. err := testHelperUpdateDashboardAcl(savedFolder.Id, m.DashboardAcl{
  124. OrgId: 1,
  125. UserId: currentUser.Id,
  126. DashboardId: savedFolder.Id,
  127. Permission: m.PERMISSION_EDIT,
  128. })
  129. So(err, ShouldBeNil)
  130. q1 := &m.GetDashboardAclInfoListQuery{DashboardId: savedFolder.Id, OrgId: 1}
  131. err = GetDashboardAclInfoList(q1)
  132. So(err, ShouldBeNil)
  133. So(q1.Result[0].DashboardId, ShouldEqual, savedFolder.Id)
  134. So(q1.Result[0].Permission, ShouldEqual, m.PERMISSION_EDIT)
  135. So(q1.Result[0].PermissionName, ShouldEqual, "Edit")
  136. So(q1.Result[0].UserId, ShouldEqual, currentUser.Id)
  137. So(q1.Result[0].UserLogin, ShouldEqual, currentUser.Login)
  138. So(q1.Result[0].UserEmail, ShouldEqual, currentUser.Email)
  139. Convey("Should be able to delete an existing permission", func() {
  140. err := testHelperUpdateDashboardAcl(savedFolder.Id)
  141. So(err, ShouldBeNil)
  142. q3 := &m.GetDashboardAclInfoListQuery{DashboardId: savedFolder.Id, OrgId: 1}
  143. err = GetDashboardAclInfoList(q3)
  144. So(err, ShouldBeNil)
  145. So(len(q3.Result), ShouldEqual, 0)
  146. })
  147. })
  148. Convey("Given a team", func() {
  149. group1 := m.CreateTeamCommand{Name: "group1 name", OrgId: 1}
  150. err := CreateTeam(&group1)
  151. So(err, ShouldBeNil)
  152. Convey("Should be able to add a user permission for a team", func() {
  153. err := testHelperUpdateDashboardAcl(savedFolder.Id, m.DashboardAcl{
  154. OrgId: 1,
  155. TeamId: group1.Result.Id,
  156. DashboardId: savedFolder.Id,
  157. Permission: m.PERMISSION_EDIT,
  158. })
  159. So(err, ShouldBeNil)
  160. q1 := &m.GetDashboardAclInfoListQuery{DashboardId: savedFolder.Id, OrgId: 1}
  161. err = GetDashboardAclInfoList(q1)
  162. So(err, ShouldBeNil)
  163. So(q1.Result[0].DashboardId, ShouldEqual, savedFolder.Id)
  164. So(q1.Result[0].Permission, ShouldEqual, m.PERMISSION_EDIT)
  165. So(q1.Result[0].TeamId, ShouldEqual, group1.Result.Id)
  166. })
  167. Convey("Should be able to update an existing permission for a team", func() {
  168. err := testHelperUpdateDashboardAcl(savedFolder.Id, m.DashboardAcl{
  169. OrgId: 1,
  170. TeamId: group1.Result.Id,
  171. DashboardId: savedFolder.Id,
  172. Permission: m.PERMISSION_ADMIN,
  173. })
  174. So(err, ShouldBeNil)
  175. q3 := &m.GetDashboardAclInfoListQuery{DashboardId: savedFolder.Id, OrgId: 1}
  176. err = GetDashboardAclInfoList(q3)
  177. So(err, ShouldBeNil)
  178. So(len(q3.Result), ShouldEqual, 1)
  179. So(q3.Result[0].DashboardId, ShouldEqual, savedFolder.Id)
  180. So(q3.Result[0].Permission, ShouldEqual, m.PERMISSION_ADMIN)
  181. So(q3.Result[0].TeamId, ShouldEqual, group1.Result.Id)
  182. })
  183. })
  184. })
  185. Convey("Given a root folder", func() {
  186. var rootFolderId int64 = 0
  187. Convey("When reading dashboard acl should return default permissions", func() {
  188. query := m.GetDashboardAclInfoListQuery{DashboardId: rootFolderId, OrgId: 1}
  189. err := GetDashboardAclInfoList(&query)
  190. So(err, ShouldBeNil)
  191. So(len(query.Result), ShouldEqual, 2)
  192. defaultPermissionsId := -1
  193. So(query.Result[0].DashboardId, ShouldEqual, defaultPermissionsId)
  194. So(*query.Result[0].Role, ShouldEqual, m.ROLE_VIEWER)
  195. So(query.Result[0].Inherited, ShouldBeFalse)
  196. So(query.Result[1].DashboardId, ShouldEqual, defaultPermissionsId)
  197. So(*query.Result[1].Role, ShouldEqual, m.ROLE_EDITOR)
  198. So(query.Result[1].Inherited, ShouldBeFalse)
  199. })
  200. })
  201. })
  202. }