优化sync_system代码质量

This commit is contained in:
strepsiades
2026-04-01 11:52:57 +08:00
parent eb02fd32a5
commit 8f4727a772
46 changed files with 1431 additions and 890 deletions
+66
View File
@@ -1,9 +1,11 @@
from __future__ import annotations
import asyncio
import logging
import time
import pytest
import httpx
from sync_state_machine.datasource.api.client import ApiClient
@@ -21,11 +23,28 @@ class _FakeResponse:
class _FakeAsyncClient:
def __init__(self) -> None:
self.call_times: list[float] = []
self.closed = False
async def request(self, **kwargs):
self.call_times.append(time.monotonic())
return _FakeResponse()
async def aclose(self) -> None:
self.closed = True
class _FailingAsyncClient:
def __init__(self) -> None:
self.closed = False
async def request(self, **kwargs):
request = httpx.Request(kwargs["method"], kwargs["url"])
response = httpx.Response(500, request=request, text="boom")
raise httpx.HTTPStatusError("server error", request=request, response=response)
async def aclose(self) -> None:
self.closed = True
@pytest.mark.asyncio
async def test_api_client_global_rate_limit_applies_to_concurrent_requests() -> None:
@@ -48,3 +67,50 @@ async def test_api_client_global_rate_limit_applies_to_concurrent_requests() ->
assert len(fake_client.call_times) == 3
third_delay = fake_client.call_times[2] - fake_client.call_times[0]
assert third_delay >= 0.15
@pytest.mark.asyncio
async def test_api_client_request_stats_track_success_and_failure(caplog: pytest.LogCaptureFixture) -> None:
client = ApiClient(
base_url="http://example.com",
uid="uid",
secret="secret",
)
logger_name = "sync_state_machine.datasource.api.client"
success_client = _FakeAsyncClient()
client._client = success_client
with caplog.at_level(logging.INFO, logger=logger_name):
await client.request("GET", "/ping")
failing_client = _FailingAsyncClient()
client._client = failing_client
with pytest.raises(httpx.HTTPStatusError):
await client.request("GET", "/ping")
stats = client.get_request_stats()
assert stats == {"total": 2, "success": 1, "failure": 1}
assert client.format_request_stats().endswith("total=2, success=1, failure=1")
await client.close()
assert failing_client.closed is True
assert "📊 ApiClient request stats: total=2, success=1, failure=1" in caplog.text
@pytest.mark.asyncio
async def test_api_client_logs_one_line_request_summary_in_debug_mode(caplog: pytest.LogCaptureFixture) -> None:
client = ApiClient(
base_url="http://example.com",
uid="uid",
secret="secret",
debug=True,
)
logger_name = "sync_state_machine.datasource.api.client"
fake_client = _FakeAsyncClient()
client._client = fake_client
with caplog.at_level(logging.DEBUG, logger=logger_name):
await client.request("GET", "/ping")
assert "ApiClient request: method=GET endpoint=/ping elapsed=" in caplog.text