def test_respond_over_limit(self):
        limiter = RateLimiter(0.01, 86400)
        time.sleep(0.01)
        limiter.update()

        frappe.conf.rate_limit = {"window": 86400, "limit": 0.01}
        self.assertRaises(frappe.TooManyRequestsError,
                          frappe.rate_limiter.apply)
        frappe.rate_limiter.update()

        response = frappe.rate_limiter.respond()

        self.assertIsInstance(response, Response)
        self.assertEqual(response.status_code, 429)

        headers = frappe.local.rate_limiter.headers()
        self.assertIn("Retry-After", headers)
        self.assertNotIn("X-RateLimit-Used", headers)
        self.assertIn("X-RateLimit-Reset", headers)
        self.assertIn("X-RateLimit-Limit", headers)
        self.assertIn("X-RateLimit-Remaining", headers)
        self.assertTrue(int(headers["X-RateLimit-Reset"]) <= 86400)
        self.assertEqual(int(headers["X-RateLimit-Limit"]), 10000)
        self.assertEqual(int(headers["X-RateLimit-Remaining"]), 0)

        frappe.cache().delete(limiter.key)
        frappe.cache().delete(frappe.local.rate_limiter.key)
        delattr(frappe.local, "rate_limiter")
Beispiel #2
0
	def test_update_method(self):
		limiter = RateLimiter(0.01, 86400)
		time.sleep(0.01)
		limiter.update()

		self.assertEqual(limiter.duration, cint(frappe.cache().get(limiter.key)))

		frappe.cache().delete(limiter.key)
    def test_do_not_reject_under_limit(self):
        limiter = RateLimiter(0.01, 86400)
        time.sleep(0.01)
        limiter.update()

        limiter = RateLimiter(0.02, 86400)
        self.assertEqual(limiter.apply(), None)

        frappe.cache().delete(limiter.key)
    def test_reject_over_limit(self):
        limiter = RateLimiter(0.01, 86400)
        time.sleep(0.01)
        limiter.update()

        limiter = RateLimiter(0.01, 86400)
        self.assertRaises(frappe.TooManyRequestsError, limiter.apply)

        frappe.cache().delete(limiter.key)