Bump version to 0.1.3; enhance logging with correlation_id for better error tracing and add request lifecycle middleware
This commit is contained in:
@@ -230,3 +230,87 @@ def test_count_tokens() -> None:
|
||||
|
||||
assert response.status_code == 200
|
||||
assert response.json()["input_tokens"] > 0
|
||||
|
||||
|
||||
def test_validation_error_is_logged(caplog) -> None:
|
||||
caplog.set_level(logging.WARNING, logger="nexus_claude_api.routes.messages")
|
||||
|
||||
response = client().post(
|
||||
"/v1/messages",
|
||||
json={"model": "claude-opus-4.6", "max_tokens": -1},
|
||||
)
|
||||
|
||||
assert response.status_code == 400
|
||||
assert any("validation_error" in r.message for r in caplog.records)
|
||||
|
||||
|
||||
def test_nexus_error_non_stream_is_logged(caplog) -> None:
|
||||
caplog.set_level(logging.WARNING, logger="nexus_claude_api.routes.messages")
|
||||
|
||||
response = client(AccessDeniedNexusClient()).post(
|
||||
"/v1/messages",
|
||||
json={
|
||||
"model": "claude-opus-4.6",
|
||||
"messages": [{"role": "user", "content": "Hello"}],
|
||||
"max_tokens": 32,
|
||||
},
|
||||
)
|
||||
|
||||
assert response.status_code == 403
|
||||
assert any("nexus_error" in r.message for r in caplog.records)
|
||||
|
||||
|
||||
def test_stream_nexus_error_is_logged(caplog) -> None:
|
||||
caplog.set_level(logging.WARNING, logger="nexus_claude_api.routes.messages")
|
||||
|
||||
with client(StreamErrorNexusClient()).stream(
|
||||
"POST",
|
||||
"/v1/messages",
|
||||
json={
|
||||
"model": "claude-opus-4.6",
|
||||
"messages": [{"role": "user", "content": "Hello"}],
|
||||
"max_tokens": 32,
|
||||
"stream": True,
|
||||
},
|
||||
) as response:
|
||||
response.read()
|
||||
|
||||
assert any("stream_nexus_error" in r.message for r in caplog.records)
|
||||
|
||||
|
||||
def test_request_complete_is_logged(caplog) -> None:
|
||||
caplog.set_level(logging.INFO, logger="nexus_claude_api.server")
|
||||
|
||||
client().post(
|
||||
"/v1/messages",
|
||||
json={
|
||||
"model": "claude-opus-4.6",
|
||||
"messages": [{"role": "user", "content": "Hello"}],
|
||||
"max_tokens": 32,
|
||||
},
|
||||
)
|
||||
|
||||
assert any("request_complete" in r.message and "duration_ms" in r.message for r in caplog.records)
|
||||
|
||||
|
||||
class ExplodingNexusClient:
|
||||
def converse(self, request: dict, *, correlation_id: str | None = None) -> dict:
|
||||
raise RuntimeError("unexpected kaboom")
|
||||
|
||||
|
||||
def test_unexpected_exception_returns_500_and_is_logged(caplog) -> None:
|
||||
caplog.set_level(logging.ERROR, logger="nexus_claude_api.server")
|
||||
|
||||
response = client(ExplodingNexusClient()).post(
|
||||
"/v1/messages",
|
||||
json={
|
||||
"model": "claude-opus-4.6",
|
||||
"messages": [{"role": "user", "content": "Hello"}],
|
||||
"max_tokens": 32,
|
||||
},
|
||||
)
|
||||
|
||||
assert response.status_code == 500
|
||||
body = response.json()
|
||||
assert body["error"]["type"] == "api_error"
|
||||
assert any("unhandled_exception" in r.message for r in caplog.records)
|
||||
|
||||
Reference in New Issue
Block a user