quota_test.go 4.4 KB

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