quota_test.go 4.7 KB

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