test_redis.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. from time import time
  2. from freezegun import freeze_time
  3. from sentry.ratelimits.redis import RedisRateLimiter
  4. from sentry.testutils import TestCase
  5. from sentry.testutils.silo import region_silo_test
  6. @region_silo_test(stable=True)
  7. class RedisRateLimiterTest(TestCase):
  8. def setUp(self):
  9. self.backend = RedisRateLimiter()
  10. def test_project_key(self):
  11. with freeze_time("2000-01-01"):
  12. assert not self.backend.is_limited("foo", 1, self.project)
  13. assert self.backend.is_limited("foo", 1, self.project)
  14. def test_simple_key(self):
  15. with freeze_time("2000-01-01"):
  16. assert not self.backend.is_limited("foo", 1)
  17. assert self.backend.is_limited("foo", 1)
  18. def test_correct_current_value(self):
  19. """Ensure that current_value get the correct value after the counter in incremented"""
  20. with freeze_time("2000-01-01"):
  21. for _ in range(10):
  22. self.backend.is_limited("foo", 100)
  23. assert self.backend.current_value("foo") == 10
  24. self.backend.is_limited("foo", 100)
  25. assert self.backend.current_value("foo") == 11
  26. def test_current_value_new_key(self):
  27. """current_value should return 0 for a new key"""
  28. assert self.backend.current_value("new") == 0
  29. def test_current_value_expire(self):
  30. """Ensure that the count resets when the window expires"""
  31. with freeze_time("2000-01-01") as frozen_time:
  32. for _ in range(10):
  33. self.backend.is_limited("foo", 1, window=10)
  34. assert self.backend.current_value("foo", window=10) == 10
  35. frozen_time.tick(10)
  36. assert self.backend.current_value("foo", window=10) == 0
  37. def test_is_limited_with_value(self):
  38. with freeze_time("2000-01-01") as frozen_time:
  39. expected_reset_time = int(time() + 5)
  40. limited, value, reset_time = self.backend.is_limited_with_value("foo", 1, window=5)
  41. assert not limited
  42. assert value == 1
  43. assert reset_time == expected_reset_time
  44. limited, value, reset_time = self.backend.is_limited_with_value("foo", 1, window=5)
  45. assert limited
  46. assert value == 2
  47. assert reset_time == expected_reset_time
  48. frozen_time.tick(5)
  49. limited, value, reset_time = self.backend.is_limited_with_value("foo", 1, window=5)
  50. assert not limited
  51. assert value == 1
  52. assert reset_time == expected_reset_time + 5