testing rate-limiting requests via ASGI middleware in starlette

This commit is contained in:
V
2026-05-09 16:35:03 +01:00
parent 29656c8d15
commit d536dde6c9
10 changed files with 462 additions and 1 deletions
+29
View File
@@ -0,0 +1,29 @@
import asyncio
from time import time
import pytest
from leaky_bucket import LeakyBucketLimiter
@pytest.mark.asyncio
async def test_duration() -> None:
async def test_function():
pass
limiter = LeakyBucketLimiter(10, 100)
await limiter.start()
start = time()
tasks = [asyncio.create_task(limiter.execute(test_function)) for i in range(20)]
results = await asyncio.gather(*tasks, return_exceptions=True)
end = time()
duration = end - start
assert duration < 2.1
for item in results:
assert isinstance(item, Exception) is False
@@ -0,0 +1,49 @@
from time import sleep
from starlette.testclient import TestClient
from middleware_starlette import app
def test_app_runs():
client = TestClient(app)
response = client.get("/")
assert response.status_code == 200
assert "Hello there" in response.text
def test_below_rate_limit():
client = TestClient(app)
# Limit is 10/s
for i in range(20):
response = client.get("/")
assert response.status_code == 200
assert "Hello there" in response.text
sleep(0.1)
def test_above_rate_limit():
client = TestClient(app)
successful = 0
rate_limited = 0
# Limit is 10/s
for i in range(30):
response = client.get("/")
if response.status_code != 200:
rate_limited += 1
assert response.status_code == 429
assert "Rate limit exceeded" in response.text
assert response.headers.get("retry-after") is not None
else:
successful += 1
assert successful != 0
assert rate_limited != 0