dashboard_acl_test.go 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  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 userGroupId set to 0", func() {
  15. err := SetDashboardAcl(&m.SetDashboardAclCommand{
  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 dashboard acl should include acl for parent folder", func() {
  24. query := m.GetDashboardAclInfoListQuery{DashboardId: childDash.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[1].DashboardId, ShouldEqual, defaultPermissionsId)
  32. So(*query.Result[1].Role, ShouldEqual, m.ROLE_EDITOR)
  33. })
  34. })
  35. Convey("Given dashboard folder permission", func() {
  36. err := SetDashboardAcl(&m.SetDashboardAclCommand{
  37. OrgId: 1,
  38. UserId: currentUser.Id,
  39. DashboardId: savedFolder.Id,
  40. Permission: m.PERMISSION_EDIT,
  41. })
  42. So(err, ShouldBeNil)
  43. Convey("When reading dashboard acl should include acl for parent folder", func() {
  44. query := m.GetDashboardAclInfoListQuery{DashboardId: childDash.Id, OrgId: 1}
  45. err := GetDashboardAclInfoList(&query)
  46. So(err, ShouldBeNil)
  47. So(len(query.Result), ShouldEqual, 1)
  48. So(query.Result[0].DashboardId, ShouldEqual, savedFolder.Id)
  49. })
  50. Convey("Given child dashboard permission", func() {
  51. err := SetDashboardAcl(&m.SetDashboardAclCommand{
  52. OrgId: 1,
  53. UserId: currentUser.Id,
  54. DashboardId: childDash.Id,
  55. Permission: m.PERMISSION_EDIT,
  56. })
  57. So(err, ShouldBeNil)
  58. Convey("When reading dashboard acl should include acl for parent folder and child", func() {
  59. query := m.GetDashboardAclInfoListQuery{OrgId: 1, DashboardId: childDash.Id}
  60. err := GetDashboardAclInfoList(&query)
  61. So(err, ShouldBeNil)
  62. So(len(query.Result), ShouldEqual, 2)
  63. So(query.Result[0].DashboardId, ShouldEqual, savedFolder.Id)
  64. So(query.Result[1].DashboardId, ShouldEqual, childDash.Id)
  65. })
  66. })
  67. })
  68. Convey("Given child dashboard permission in folder with no permissions", func() {
  69. err := SetDashboardAcl(&m.SetDashboardAclCommand{
  70. OrgId: 1,
  71. UserId: currentUser.Id,
  72. DashboardId: childDash.Id,
  73. Permission: m.PERMISSION_EDIT,
  74. })
  75. So(err, ShouldBeNil)
  76. Convey("When reading dashboard acl should include default acl for parent folder and the child acl", func() {
  77. query := m.GetDashboardAclInfoListQuery{OrgId: 1, DashboardId: childDash.Id}
  78. err := GetDashboardAclInfoList(&query)
  79. So(err, ShouldBeNil)
  80. defaultPermissionsId := -1
  81. So(len(query.Result), ShouldEqual, 3)
  82. So(query.Result[0].DashboardId, ShouldEqual, defaultPermissionsId)
  83. So(*query.Result[0].Role, ShouldEqual, m.ROLE_VIEWER)
  84. So(query.Result[1].DashboardId, ShouldEqual, defaultPermissionsId)
  85. So(*query.Result[1].Role, ShouldEqual, m.ROLE_EDITOR)
  86. So(query.Result[2].DashboardId, ShouldEqual, childDash.Id)
  87. })
  88. })
  89. Convey("Should be able to add dashboard permission", func() {
  90. setDashAclCmd := m.SetDashboardAclCommand{
  91. OrgId: 1,
  92. UserId: currentUser.Id,
  93. DashboardId: savedFolder.Id,
  94. Permission: m.PERMISSION_EDIT,
  95. }
  96. err := SetDashboardAcl(&setDashAclCmd)
  97. So(err, ShouldBeNil)
  98. So(setDashAclCmd.Result.Id, ShouldEqual, 3)
  99. q1 := &m.GetDashboardAclInfoListQuery{DashboardId: savedFolder.Id, OrgId: 1}
  100. err = GetDashboardAclInfoList(q1)
  101. So(err, ShouldBeNil)
  102. So(q1.Result[0].DashboardId, ShouldEqual, savedFolder.Id)
  103. So(q1.Result[0].Permission, ShouldEqual, m.PERMISSION_EDIT)
  104. So(q1.Result[0].PermissionName, ShouldEqual, "Edit")
  105. So(q1.Result[0].UserId, ShouldEqual, currentUser.Id)
  106. So(q1.Result[0].UserLogin, ShouldEqual, currentUser.Login)
  107. So(q1.Result[0].UserEmail, ShouldEqual, currentUser.Email)
  108. So(q1.Result[0].Id, ShouldEqual, setDashAclCmd.Result.Id)
  109. Convey("Should update hasAcl field to true for dashboard folder and its children", func() {
  110. q2 := &m.GetDashboardsQuery{DashboardIds: []int64{savedFolder.Id, childDash.Id}}
  111. err := GetDashboards(q2)
  112. So(err, ShouldBeNil)
  113. So(q2.Result[0].HasAcl, ShouldBeTrue)
  114. So(q2.Result[1].HasAcl, ShouldBeTrue)
  115. })
  116. Convey("Should be able to update an existing permission", func() {
  117. err := SetDashboardAcl(&m.SetDashboardAclCommand{
  118. OrgId: 1,
  119. UserId: 1,
  120. DashboardId: savedFolder.Id,
  121. Permission: m.PERMISSION_ADMIN,
  122. })
  123. So(err, ShouldBeNil)
  124. q3 := &m.GetDashboardAclInfoListQuery{DashboardId: savedFolder.Id, OrgId: 1}
  125. err = GetDashboardAclInfoList(q3)
  126. So(err, ShouldBeNil)
  127. So(len(q3.Result), ShouldEqual, 1)
  128. So(q3.Result[0].DashboardId, ShouldEqual, savedFolder.Id)
  129. So(q3.Result[0].Permission, ShouldEqual, m.PERMISSION_ADMIN)
  130. So(q3.Result[0].UserId, ShouldEqual, 1)
  131. })
  132. Convey("Should be able to delete an existing permission", func() {
  133. err := RemoveDashboardAcl(&m.RemoveDashboardAclCommand{
  134. OrgId: 1,
  135. AclId: setDashAclCmd.Result.Id,
  136. })
  137. So(err, ShouldBeNil)
  138. q3 := &m.GetDashboardAclInfoListQuery{DashboardId: savedFolder.Id, OrgId: 1}
  139. err = GetDashboardAclInfoList(q3)
  140. So(err, ShouldBeNil)
  141. So(len(q3.Result), ShouldEqual, 0)
  142. })
  143. })
  144. Convey("Given a user group", func() {
  145. group1 := m.CreateUserGroupCommand{Name: "group1 name", OrgId: 1}
  146. err := CreateUserGroup(&group1)
  147. So(err, ShouldBeNil)
  148. Convey("Should be able to add a user permission for a user group", func() {
  149. setDashAclCmd := m.SetDashboardAclCommand{
  150. OrgId: 1,
  151. UserGroupId: group1.Result.Id,
  152. DashboardId: savedFolder.Id,
  153. Permission: m.PERMISSION_EDIT,
  154. }
  155. err := SetDashboardAcl(&setDashAclCmd)
  156. So(err, ShouldBeNil)
  157. q1 := &m.GetDashboardAclInfoListQuery{DashboardId: savedFolder.Id, OrgId: 1}
  158. err = GetDashboardAclInfoList(q1)
  159. So(err, ShouldBeNil)
  160. So(q1.Result[0].DashboardId, ShouldEqual, savedFolder.Id)
  161. So(q1.Result[0].Permission, ShouldEqual, m.PERMISSION_EDIT)
  162. So(q1.Result[0].UserGroupId, ShouldEqual, group1.Result.Id)
  163. Convey("Should be able to delete an existing permission for a user group", func() {
  164. err := RemoveDashboardAcl(&m.RemoveDashboardAclCommand{
  165. OrgId: 1,
  166. AclId: setDashAclCmd.Result.Id,
  167. })
  168. So(err, ShouldBeNil)
  169. q3 := &m.GetDashboardAclInfoListQuery{DashboardId: savedFolder.Id, OrgId: 1}
  170. err = GetDashboardAclInfoList(q3)
  171. So(err, ShouldBeNil)
  172. So(len(q3.Result), ShouldEqual, 0)
  173. })
  174. })
  175. Convey("Should be able to update an existing permission for a user group", func() {
  176. err := SetDashboardAcl(&m.SetDashboardAclCommand{
  177. OrgId: 1,
  178. UserGroupId: group1.Result.Id,
  179. DashboardId: savedFolder.Id,
  180. Permission: m.PERMISSION_ADMIN,
  181. })
  182. So(err, ShouldBeNil)
  183. q3 := &m.GetDashboardAclInfoListQuery{DashboardId: savedFolder.Id, OrgId: 1}
  184. err = GetDashboardAclInfoList(q3)
  185. So(err, ShouldBeNil)
  186. So(len(q3.Result), ShouldEqual, 1)
  187. So(q3.Result[0].DashboardId, ShouldEqual, savedFolder.Id)
  188. So(q3.Result[0].Permission, ShouldEqual, m.PERMISSION_ADMIN)
  189. So(q3.Result[0].UserGroupId, ShouldEqual, group1.Result.Id)
  190. })
  191. })
  192. })
  193. })
  194. }