quota_test.go 4.5 KB

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