quota_test.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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/setting"
  7. . "github.com/smartystreets/goconvey/convey"
  8. )
  9. func TestMiddlewareQuota(t *testing.T) {
  10. Convey("Given the grafana quota middleware", t, func() {
  11. getSessionCount = func() int {
  12. return 4
  13. }
  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. middlewareScenario("with user not logged in", func(sc *scenarioContext) {
  36. bus.AddHandler("globalQuota", func(query *m.GetGlobalQuotaByTargetQuery) error {
  37. query.Result = &m.GlobalQuotaDTO{
  38. Target: query.Target,
  39. Limit: query.Default,
  40. Used: 4,
  41. }
  42. return nil
  43. })
  44. Convey("global quota not reached", func() {
  45. sc.m.Get("/user", Quota("user"), sc.defaultHandler)
  46. sc.fakeReq("GET", "/user").exec()
  47. So(sc.resp.Code, ShouldEqual, 200)
  48. })
  49. Convey("global quota reached", func() {
  50. setting.Quota.Global.User = 4
  51. sc.m.Get("/user", Quota("user"), sc.defaultHandler)
  52. sc.fakeReq("GET", "/user").exec()
  53. So(sc.resp.Code, ShouldEqual, 403)
  54. })
  55. Convey("global session quota not reached", func() {
  56. setting.Quota.Global.Session = 10
  57. sc.m.Get("/user", Quota("session"), sc.defaultHandler)
  58. sc.fakeReq("GET", "/user").exec()
  59. So(sc.resp.Code, ShouldEqual, 200)
  60. })
  61. Convey("global session quota reached", func() {
  62. setting.Quota.Global.Session = 1
  63. sc.m.Get("/user", Quota("session"), sc.defaultHandler)
  64. sc.fakeReq("GET", "/user").exec()
  65. So(sc.resp.Code, ShouldEqual, 403)
  66. })
  67. })
  68. middlewareScenario("with user logged in", func(sc *scenarioContext) {
  69. // log us in, so we have a user_id and org_id in the context
  70. sc.fakeReq("GET", "/").handler(func(c *Context) {
  71. c.Session.Set(SESS_KEY_USERID, int64(12))
  72. }).exec()
  73. bus.AddHandler("test", func(query *m.GetSignedInUserQuery) error {
  74. query.Result = &m.SignedInUser{OrgId: 2, UserId: 12}
  75. return nil
  76. })
  77. bus.AddHandler("globalQuota", func(query *m.GetGlobalQuotaByTargetQuery) error {
  78. query.Result = &m.GlobalQuotaDTO{
  79. Target: query.Target,
  80. Limit: query.Default,
  81. Used: 4,
  82. }
  83. return nil
  84. })
  85. bus.AddHandler("userQuota", func(query *m.GetUserQuotaByTargetQuery) error {
  86. query.Result = &m.UserQuotaDTO{
  87. Target: query.Target,
  88. Limit: query.Default,
  89. Used: 4,
  90. }
  91. return nil
  92. })
  93. bus.AddHandler("orgQuota", func(query *m.GetOrgQuotaByTargetQuery) error {
  94. query.Result = &m.OrgQuotaDTO{
  95. Target: query.Target,
  96. Limit: query.Default,
  97. Used: 4,
  98. }
  99. return nil
  100. })
  101. Convey("global datasource quota reached", func() {
  102. setting.Quota.Global.DataSource = 4
  103. sc.m.Get("/ds", Quota("data_source"), sc.defaultHandler)
  104. sc.fakeReq("GET", "/ds").exec()
  105. So(sc.resp.Code, ShouldEqual, 403)
  106. })
  107. Convey("user Org quota not reached", func() {
  108. setting.Quota.User.Org = 5
  109. sc.m.Get("/org", Quota("org"), sc.defaultHandler)
  110. sc.fakeReq("GET", "/org").exec()
  111. So(sc.resp.Code, ShouldEqual, 200)
  112. })
  113. Convey("user Org quota reached", func() {
  114. setting.Quota.User.Org = 4
  115. sc.m.Get("/org", Quota("org"), sc.defaultHandler)
  116. sc.fakeReq("GET", "/org").exec()
  117. So(sc.resp.Code, ShouldEqual, 403)
  118. })
  119. Convey("org dashboard quota not reached", func() {
  120. setting.Quota.Org.Dashboard = 10
  121. sc.m.Get("/dashboard", Quota("dashboard"), sc.defaultHandler)
  122. sc.fakeReq("GET", "/dashboard").exec()
  123. So(sc.resp.Code, ShouldEqual, 200)
  124. })
  125. Convey("org dashboard quota reached", func() {
  126. setting.Quota.Org.Dashboard = 4
  127. sc.m.Get("/dashboard", Quota("dashboard"), sc.defaultHandler)
  128. sc.fakeReq("GET", "/dashboard").exec()
  129. So(sc.resp.Code, ShouldEqual, 403)
  130. })
  131. Convey("org dashboard quota reached but quotas disabled", func() {
  132. setting.Quota.Org.Dashboard = 4
  133. setting.Quota.Enabled = false
  134. sc.m.Get("/dashboard", Quota("dashboard"), sc.defaultHandler)
  135. sc.fakeReq("GET", "/dashboard").exec()
  136. So(sc.resp.Code, ShouldEqual, 200)
  137. })
  138. })
  139. })
  140. }