quota_test.go 4.6 KB

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