quota_test.go 4.6 KB

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