quota_test.go 4.2 KB

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