quota_test.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package middleware
  2. import (
  3. "testing"
  4. "github.com/grafana/grafana/pkg/bus"
  5. m "github.com/grafana/grafana/pkg/models"
  6. "github.com/grafana/grafana/pkg/services/session"
  7. "github.com/grafana/grafana/pkg/setting"
  8. . "github.com/smartystreets/goconvey/convey"
  9. )
  10. func TestMiddlewareQuota(t *testing.T) {
  11. Convey("Given the grafana quota middleware", t, func() {
  12. session.GetSessionCount = func() int {
  13. return 4
  14. }
  15. setting.AnonymousEnabled = false
  16. setting.Quota = setting.QuotaSettings{
  17. Enabled: true,
  18. Org: &setting.OrgQuota{
  19. User: 5,
  20. Dashboard: 5,
  21. DataSource: 5,
  22. ApiKey: 5,
  23. },
  24. User: &setting.UserQuota{
  25. Org: 5,
  26. },
  27. Global: &setting.GlobalQuota{
  28. Org: 5,
  29. User: 5,
  30. Dashboard: 5,
  31. DataSource: 5,
  32. ApiKey: 5,
  33. Session: 5,
  34. },
  35. }
  36. middlewareScenario("with user not logged in", func(sc *scenarioContext) {
  37. bus.AddHandler("globalQuota", func(query *m.GetGlobalQuotaByTargetQuery) error {
  38. query.Result = &m.GlobalQuotaDTO{
  39. Target: query.Target,
  40. Limit: query.Default,
  41. Used: 4,
  42. }
  43. return nil
  44. })
  45. Convey("global quota not reached", func() {
  46. sc.m.Get("/user", Quota("user"), sc.defaultHandler)
  47. sc.fakeReq("GET", "/user").exec()
  48. So(sc.resp.Code, ShouldEqual, 200)
  49. })
  50. Convey("global quota reached", func() {
  51. setting.Quota.Global.User = 4
  52. sc.m.Get("/user", Quota("user"), sc.defaultHandler)
  53. sc.fakeReq("GET", "/user").exec()
  54. So(sc.resp.Code, ShouldEqual, 403)
  55. })
  56. Convey("global session quota not reached", func() {
  57. setting.Quota.Global.Session = 10
  58. sc.m.Get("/user", Quota("session"), sc.defaultHandler)
  59. sc.fakeReq("GET", "/user").exec()
  60. So(sc.resp.Code, ShouldEqual, 200)
  61. })
  62. Convey("global session quota reached", func() {
  63. setting.Quota.Global.Session = 1
  64. sc.m.Get("/user", Quota("session"), sc.defaultHandler)
  65. sc.fakeReq("GET", "/user").exec()
  66. So(sc.resp.Code, ShouldEqual, 403)
  67. })
  68. })
  69. middlewareScenario("with user logged in", func(sc *scenarioContext) {
  70. // log us in, so we have a user_id and org_id in the context
  71. sc.fakeReq("GET", "/").handler(func(c *m.ReqContext) {
  72. c.Session.Set(session.SESS_KEY_USERID, int64(12))
  73. }).exec()
  74. bus.AddHandler("test", func(query *m.GetSignedInUserQuery) error {
  75. query.Result = &m.SignedInUser{OrgId: 2, UserId: 12}
  76. return nil
  77. })
  78. bus.AddHandler("globalQuota", func(query *m.GetGlobalQuotaByTargetQuery) error {
  79. query.Result = &m.GlobalQuotaDTO{
  80. Target: query.Target,
  81. Limit: query.Default,
  82. Used: 4,
  83. }
  84. return nil
  85. })
  86. bus.AddHandler("userQuota", func(query *m.GetUserQuotaByTargetQuery) error {
  87. query.Result = &m.UserQuotaDTO{
  88. Target: query.Target,
  89. Limit: query.Default,
  90. Used: 4,
  91. }
  92. return nil
  93. })
  94. bus.AddHandler("orgQuota", func(query *m.GetOrgQuotaByTargetQuery) error {
  95. query.Result = &m.OrgQuotaDTO{
  96. Target: query.Target,
  97. Limit: query.Default,
  98. Used: 4,
  99. }
  100. return nil
  101. })
  102. Convey("global datasource quota reached", func() {
  103. setting.Quota.Global.DataSource = 4
  104. sc.m.Get("/ds", Quota("data_source"), sc.defaultHandler)
  105. sc.fakeReq("GET", "/ds").exec()
  106. So(sc.resp.Code, ShouldEqual, 403)
  107. })
  108. Convey("user Org quota not reached", func() {
  109. setting.Quota.User.Org = 5
  110. sc.m.Get("/org", Quota("org"), sc.defaultHandler)
  111. sc.fakeReq("GET", "/org").exec()
  112. So(sc.resp.Code, ShouldEqual, 200)
  113. })
  114. Convey("user Org quota reached", func() {
  115. setting.Quota.User.Org = 4
  116. sc.m.Get("/org", Quota("org"), sc.defaultHandler)
  117. sc.fakeReq("GET", "/org").exec()
  118. So(sc.resp.Code, ShouldEqual, 403)
  119. })
  120. Convey("org dashboard quota not reached", func() {
  121. setting.Quota.Org.Dashboard = 10
  122. sc.m.Get("/dashboard", Quota("dashboard"), sc.defaultHandler)
  123. sc.fakeReq("GET", "/dashboard").exec()
  124. So(sc.resp.Code, ShouldEqual, 200)
  125. })
  126. Convey("org dashboard quota reached", func() {
  127. setting.Quota.Org.Dashboard = 4
  128. sc.m.Get("/dashboard", Quota("dashboard"), sc.defaultHandler)
  129. sc.fakeReq("GET", "/dashboard").exec()
  130. So(sc.resp.Code, ShouldEqual, 403)
  131. })
  132. Convey("org dashboard quota reached but quotas disabled", func() {
  133. setting.Quota.Org.Dashboard = 4
  134. setting.Quota.Enabled = false
  135. sc.m.Get("/dashboard", Quota("dashboard"), sc.defaultHandler)
  136. sc.fakeReq("GET", "/dashboard").exec()
  137. So(sc.resp.Code, ShouldEqual, 200)
  138. })
  139. })
  140. })
  141. }