quota_test.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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. sc.userAuthTokenService.initContextWithTokenProvider = func(ctx *m.ReqContext, orgId int64) bool {
  71. ctx.SignedInUser = &m.SignedInUser{OrgId: 2, UserId: 12}
  72. ctx.IsSignedIn = true
  73. return true
  74. }
  75. bus.AddHandler("globalQuota", func(query *m.GetGlobalQuotaByTargetQuery) error {
  76. query.Result = &m.GlobalQuotaDTO{
  77. Target: query.Target,
  78. Limit: query.Default,
  79. Used: 4,
  80. }
  81. return nil
  82. })
  83. bus.AddHandler("userQuota", func(query *m.GetUserQuotaByTargetQuery) error {
  84. query.Result = &m.UserQuotaDTO{
  85. Target: query.Target,
  86. Limit: query.Default,
  87. Used: 4,
  88. }
  89. return nil
  90. })
  91. bus.AddHandler("orgQuota", func(query *m.GetOrgQuotaByTargetQuery) error {
  92. query.Result = &m.OrgQuotaDTO{
  93. Target: query.Target,
  94. Limit: query.Default,
  95. Used: 4,
  96. }
  97. return nil
  98. })
  99. Convey("global datasource quota reached", func() {
  100. setting.Quota.Global.DataSource = 4
  101. sc.m.Get("/ds", Quota("data_source"), sc.defaultHandler)
  102. sc.fakeReq("GET", "/ds").exec()
  103. So(sc.resp.Code, ShouldEqual, 403)
  104. })
  105. Convey("user Org quota not reached", func() {
  106. setting.Quota.User.Org = 5
  107. sc.m.Get("/org", Quota("org"), sc.defaultHandler)
  108. sc.fakeReq("GET", "/org").exec()
  109. So(sc.resp.Code, ShouldEqual, 200)
  110. })
  111. Convey("user Org quota reached", func() {
  112. setting.Quota.User.Org = 4
  113. sc.m.Get("/org", Quota("org"), sc.defaultHandler)
  114. sc.fakeReq("GET", "/org").exec()
  115. So(sc.resp.Code, ShouldEqual, 403)
  116. })
  117. Convey("org dashboard quota not reached", func() {
  118. setting.Quota.Org.Dashboard = 10
  119. sc.m.Get("/dashboard", Quota("dashboard"), sc.defaultHandler)
  120. sc.fakeReq("GET", "/dashboard").exec()
  121. So(sc.resp.Code, ShouldEqual, 200)
  122. })
  123. Convey("org dashboard quota reached", func() {
  124. setting.Quota.Org.Dashboard = 4
  125. sc.m.Get("/dashboard", Quota("dashboard"), sc.defaultHandler)
  126. sc.fakeReq("GET", "/dashboard").exec()
  127. So(sc.resp.Code, ShouldEqual, 403)
  128. })
  129. Convey("org dashboard quota reached but quotas disabled", func() {
  130. setting.Quota.Org.Dashboard = 4
  131. setting.Quota.Enabled = false
  132. sc.m.Get("/dashboard", Quota("dashboard"), sc.defaultHandler)
  133. sc.fakeReq("GET", "/dashboard").exec()
  134. So(sc.resp.Code, ShouldEqual, 200)
  135. })
  136. })
  137. })
  138. }