quota_test.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. package sqlstore
  2. import (
  3. "testing"
  4. "time"
  5. m "github.com/grafana/grafana/pkg/models"
  6. "github.com/grafana/grafana/pkg/setting"
  7. . "github.com/smartystreets/goconvey/convey"
  8. )
  9. func TestQuotaCommandsAndQueries(t *testing.T) {
  10. Convey("Testing Qutoa commands & queries", t, func() {
  11. InitTestDB(t)
  12. userId := int64(1)
  13. orgId := int64(0)
  14. setting.Quota = setting.QuotaSettings{
  15. Enabled: true,
  16. Org: &setting.OrgQuota{
  17. User: 5,
  18. Dashboard: 5,
  19. DataSource: 5,
  20. ApiKey: 5,
  21. },
  22. User: &setting.UserQuota{
  23. Org: 5,
  24. },
  25. Global: &setting.GlobalQuota{
  26. Org: 5,
  27. User: 5,
  28. Dashboard: 5,
  29. DataSource: 5,
  30. ApiKey: 5,
  31. Session: 5,
  32. },
  33. }
  34. // create a new org and add user_id 1 as admin.
  35. // we will then have an org with 1 user. and a user
  36. // with 1 org.
  37. userCmd := m.CreateOrgCommand{
  38. Name: "TestOrg",
  39. UserId: 1,
  40. }
  41. err := CreateOrg(&userCmd)
  42. So(err, ShouldBeNil)
  43. orgId = userCmd.Result.Id
  44. Convey("Given saved org quota for users", func() {
  45. orgCmd := m.UpdateOrgQuotaCmd{
  46. OrgId: orgId,
  47. Target: "org_user",
  48. Limit: 10,
  49. }
  50. err := UpdateOrgQuota(&orgCmd)
  51. So(err, ShouldBeNil)
  52. Convey("Should be able to get saved quota by org id and target", func() {
  53. query := m.GetOrgQuotaByTargetQuery{OrgId: orgId, Target: "org_user", Default: 1}
  54. err = GetOrgQuotaByTarget(&query)
  55. So(err, ShouldBeNil)
  56. So(query.Result.Limit, ShouldEqual, 10)
  57. })
  58. Convey("Should be able to get default quota by org id and target", func() {
  59. query := m.GetOrgQuotaByTargetQuery{OrgId: 123, Target: "org_user", Default: 11}
  60. err = GetOrgQuotaByTarget(&query)
  61. So(err, ShouldBeNil)
  62. So(query.Result.Limit, ShouldEqual, 11)
  63. })
  64. Convey("Should be able to get used org quota when rows exist", func() {
  65. query := m.GetOrgQuotaByTargetQuery{OrgId: orgId, Target: "org_user", Default: 11}
  66. err = GetOrgQuotaByTarget(&query)
  67. So(err, ShouldBeNil)
  68. So(query.Result.Used, ShouldEqual, 1)
  69. })
  70. Convey("Should be able to get used org quota when no rows exist", func() {
  71. query := m.GetOrgQuotaByTargetQuery{OrgId: 2, Target: "org_user", Default: 11}
  72. err = GetOrgQuotaByTarget(&query)
  73. So(err, ShouldBeNil)
  74. So(query.Result.Used, ShouldEqual, 0)
  75. })
  76. Convey("Should be able to quota list for org", func() {
  77. query := m.GetOrgQuotasQuery{OrgId: orgId}
  78. err = GetOrgQuotas(&query)
  79. So(err, ShouldBeNil)
  80. So(len(query.Result), ShouldEqual, 4)
  81. for _, res := range query.Result {
  82. limit := 5 //default quota limit
  83. used := 0
  84. if res.Target == "org_user" {
  85. limit = 10 //customized quota limit.
  86. used = 1
  87. }
  88. So(res.Limit, ShouldEqual, limit)
  89. So(res.Used, ShouldEqual, used)
  90. }
  91. })
  92. })
  93. Convey("Given saved user quota for org", func() {
  94. userQuotaCmd := m.UpdateUserQuotaCmd{
  95. UserId: userId,
  96. Target: "org_user",
  97. Limit: 10,
  98. }
  99. err := UpdateUserQuota(&userQuotaCmd)
  100. So(err, ShouldBeNil)
  101. Convey("Should be able to get saved quota by user id and target", func() {
  102. query := m.GetUserQuotaByTargetQuery{UserId: userId, Target: "org_user", Default: 1}
  103. err = GetUserQuotaByTarget(&query)
  104. So(err, ShouldBeNil)
  105. So(query.Result.Limit, ShouldEqual, 10)
  106. })
  107. Convey("Should be able to get default quota by user id and target", func() {
  108. query := m.GetUserQuotaByTargetQuery{UserId: 9, Target: "org_user", Default: 11}
  109. err = GetUserQuotaByTarget(&query)
  110. So(err, ShouldBeNil)
  111. So(query.Result.Limit, ShouldEqual, 11)
  112. })
  113. Convey("Should be able to get used user quota when rows exist", func() {
  114. query := m.GetUserQuotaByTargetQuery{UserId: userId, Target: "org_user", Default: 11}
  115. err = GetUserQuotaByTarget(&query)
  116. So(err, ShouldBeNil)
  117. So(query.Result.Used, ShouldEqual, 1)
  118. })
  119. Convey("Should be able to get used user quota when no rows exist", func() {
  120. query := m.GetUserQuotaByTargetQuery{UserId: 2, Target: "org_user", Default: 11}
  121. err = GetUserQuotaByTarget(&query)
  122. So(err, ShouldBeNil)
  123. So(query.Result.Used, ShouldEqual, 0)
  124. })
  125. Convey("Should be able to quota list for user", func() {
  126. query := m.GetUserQuotasQuery{UserId: userId}
  127. err = GetUserQuotas(&query)
  128. So(err, ShouldBeNil)
  129. So(len(query.Result), ShouldEqual, 1)
  130. So(query.Result[0].Limit, ShouldEqual, 10)
  131. So(query.Result[0].Used, ShouldEqual, 1)
  132. })
  133. })
  134. Convey("Should be able to global user quota", func() {
  135. query := m.GetGlobalQuotaByTargetQuery{Target: "user", Default: 5}
  136. err = GetGlobalQuotaByTarget(&query)
  137. So(err, ShouldBeNil)
  138. So(query.Result.Limit, ShouldEqual, 5)
  139. So(query.Result.Used, ShouldEqual, 0)
  140. })
  141. Convey("Should be able to global org quota", func() {
  142. query := m.GetGlobalQuotaByTargetQuery{Target: "org", Default: 5}
  143. err = GetGlobalQuotaByTarget(&query)
  144. So(err, ShouldBeNil)
  145. So(query.Result.Limit, ShouldEqual, 5)
  146. So(query.Result.Used, ShouldEqual, 1)
  147. })
  148. // related: https://github.com/grafana/grafana/issues/14342
  149. Convey("Should org quota updating is successful even if it called multiple time", func() {
  150. orgCmd := m.UpdateOrgQuotaCmd{
  151. OrgId: orgId,
  152. Target: "org_user",
  153. Limit: 5,
  154. }
  155. err := UpdateOrgQuota(&orgCmd)
  156. So(err, ShouldBeNil)
  157. query := m.GetOrgQuotaByTargetQuery{OrgId: orgId, Target: "org_user", Default: 1}
  158. err = GetOrgQuotaByTarget(&query)
  159. So(err, ShouldBeNil)
  160. So(query.Result.Limit, ShouldEqual, 5)
  161. // XXX: resolution of `Updated` column is 1sec, so this makes delay
  162. time.Sleep(1 * time.Second)
  163. orgCmd = m.UpdateOrgQuotaCmd{
  164. OrgId: orgId,
  165. Target: "org_user",
  166. Limit: 10,
  167. }
  168. err = UpdateOrgQuota(&orgCmd)
  169. So(err, ShouldBeNil)
  170. query = m.GetOrgQuotaByTargetQuery{OrgId: orgId, Target: "org_user", Default: 1}
  171. err = GetOrgQuotaByTarget(&query)
  172. So(err, ShouldBeNil)
  173. So(query.Result.Limit, ShouldEqual, 10)
  174. })
  175. // related: https://github.com/grafana/grafana/issues/14342
  176. Convey("Should user quota updating is successful even if it called multiple time", func() {
  177. userQuotaCmd := m.UpdateUserQuotaCmd{
  178. UserId: userId,
  179. Target: "org_user",
  180. Limit: 5,
  181. }
  182. err := UpdateUserQuota(&userQuotaCmd)
  183. So(err, ShouldBeNil)
  184. query := m.GetUserQuotaByTargetQuery{UserId: userId, Target: "org_user", Default: 1}
  185. err = GetUserQuotaByTarget(&query)
  186. So(err, ShouldBeNil)
  187. So(query.Result.Limit, ShouldEqual, 5)
  188. // XXX: resolution of `Updated` column is 1sec, so this makes delay
  189. time.Sleep(1 * time.Second)
  190. userQuotaCmd = m.UpdateUserQuotaCmd{
  191. UserId: userId,
  192. Target: "org_user",
  193. Limit: 10,
  194. }
  195. err = UpdateUserQuota(&userQuotaCmd)
  196. So(err, ShouldBeNil)
  197. query = m.GetUserQuotaByTargetQuery{UserId: userId, Target: "org_user", Default: 1}
  198. err = GetUserQuotaByTarget(&query)
  199. So(err, ShouldBeNil)
  200. So(query.Result.Limit, ShouldEqual, 10)
  201. })
  202. })
  203. }