Skip to main content
Glama
test_rate_limiter_headers.py3.81 kB
"""Unit tests for rate limit header calculations (User Story 2). Tests the logic for calculating rate limit information and formatting headers. Following TDD: These tests should FAIL until implementation is complete. """ from datetime import UTC, datetime def test_rate_limit_info_calculation(rate_limit_state: dict) -> None: """Test that rate limit info is calculated correctly. Args: rate_limit_state: Rate limit state fixture """ # Calculate remaining requests limit = rate_limit_state["limit"] count = rate_limit_state["count"] remaining = limit - count assert remaining == 10, f"Expected 10 remaining, got {remaining}" # Calculate reset time (10 seconds from window start) window_start = rate_limit_state["window_start"] reset_time = int(window_start + 10) assert isinstance(reset_time, int), "Reset time should be Unix timestamp (int)" assert reset_time > window_start, "Reset time should be after window start" def test_rate_limit_headers_format(rate_limit_headers_expected: dict) -> None: """Test that rate limit headers follow industry standard format. Args: rate_limit_headers_expected: Expected header format fixture """ # Verify header names follow X-RateLimit-* convention assert "X-RateLimit-Limit" in rate_limit_headers_expected assert "X-RateLimit-Remaining" in rate_limit_headers_expected assert "X-RateLimit-Reset" in rate_limit_headers_expected # Verify values are strings (header values must be strings) for header_value in rate_limit_headers_expected.values(): assert isinstance(header_value, str), ( f"Header value must be string, got {type(header_value)}" ) def test_rate_limit_info_structure() -> None: """Test that rate limit info has correct structure. This tests the data structure that will be stored in request.state """ # Expected structure for rate limit info rate_limit_info = { "limit": 15, "remaining": 10, "reset_time": int(datetime.now(UTC).timestamp() + 10), } assert "limit" in rate_limit_info, "Rate limit info must include 'limit'" assert "remaining" in rate_limit_info, "Rate limit info must include 'remaining'" assert "reset_time" in rate_limit_info, "Rate limit info must include 'reset_time'" assert rate_limit_info["limit"] > 0, "Limit must be positive" assert rate_limit_info["remaining"] >= 0, "Remaining must be non-negative" assert rate_limit_info["reset_time"] > 0, "Reset time must be positive Unix timestamp" def test_rate_limit_remaining_decrement() -> None: """Test that remaining count decrements correctly across requests.""" # Simulate multiple requests limit = 15 requests_made = [1, 2, 3, 4, 5] for count in requests_made: remaining = limit - count assert remaining == limit - count, f"Remaining should be {limit - count}, got {remaining}" assert remaining >= 0, "Remaining should never be negative" def test_rate_limit_headers_on_429() -> None: """Test that 429 responses include rate limit headers. When rate limit is exceeded, the response should include: - X-RateLimit-Limit - X-RateLimit-Remaining: 0 - X-RateLimit-Reset - Optional: Retry-After """ # Simulate rate limit exceeded limit = 15 count = 15 # Exhausted remaining = 0 assert remaining == 0, "Remaining should be 0 when rate limit exceeded" # Headers should still be present on 429 headers = { "X-RateLimit-Limit": str(limit), "X-RateLimit-Remaining": str(remaining), "X-RateLimit-Reset": str(int(datetime.now(UTC).timestamp() + 10)), } assert headers["X-RateLimit-Remaining"] == "0", "Remaining should be '0' on 429"

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/darrentmorgan/hostaway-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server