Files
hot_comment_radar/tests/unit/test_comment_pagination.py
T

54 lines
1.9 KiB
Python

import httpx
import pytest
from app.platforms.base import PlatformAPIError, TikHubClient
class SequenceTransport:
def __init__(self, responses):
self.responses = list(responses)
self.requests = []
def __call__(self, request: httpx.Request) -> httpx.Response:
self.requests.append(request)
response = self.responses.pop(0)
response.request = request
return response
def test_tikhub_client_retries_429_with_exponential_backoff(monkeypatch):
sleeps = []
monkeypatch.setattr("app.platforms.base.time.sleep", sleeps.append)
transport = SequenceTransport(
[
httpx.Response(429, json={"message": "Too Many Requests"}),
httpx.Response(429, json={"message": "Too Many Requests"}),
httpx.Response(200, json={"ok": True}),
]
)
http_client = httpx.Client(transport=httpx.MockTransport(transport))
client = TikHubClient(base_url="https://api.test", api_key="secret-token", http_client=http_client)
result = client.get("/demo")
assert result == {"ok": True}
assert sleeps == [1, 2]
assert len(transport.requests) == 3
assert transport.requests[0].headers["Authorization"] == "Bearer secret-token"
def test_tikhub_client_raises_structured_error_after_retries(monkeypatch):
sleeps = []
monkeypatch.setattr("app.platforms.base.time.sleep", sleeps.append)
transport = SequenceTransport([httpx.Response(429, json={"message": "Too Many Requests"}) for _ in range(4)])
http_client = httpx.Client(transport=httpx.MockTransport(transport))
client = TikHubClient(base_url="https://api.test", api_key="secret-token", http_client=http_client)
with pytest.raises(PlatformAPIError) as exc_info:
client.get("/demo")
assert exc_info.value.error_type == "rate_limited"
assert exc_info.value.status_code == 429
assert "secret-token" not in str(exc_info.value)
assert sleeps == [1, 2, 4]