From 2e75e53b892a34297bb6796a97c37f8b9c8abe29 Mon Sep 17 00:00:00 2001 From: zosimovaa Date: Sat, 2 May 2026 23:41:14 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20HTML=20=D0=BF=D0=BE=20=D0=B4=D0=B5=D1=84=D0=BE=D0=BB?= =?UTF-8?q?=D1=82=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 2 +- src/app_runtime/control/base.py | 2 +- src/app_runtime/control/trace_presenter.py | 2 +- tests/test_trace_endpoint.py | 33 +++++++++++++++++++--- 4 files changed, 32 insertions(+), 7 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index d46e8c9..c41bd21 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "plba" -version = "0.3.13" +version = "0.3.14" description = "Platform runtime for business applications" readme = "README.md" requires-python = ">=3.11" diff --git a/src/app_runtime/control/base.py b/src/app_runtime/control/base.py index 4c04045..70eafd7 100644 --- a/src/app_runtime/control/base.py +++ b/src/app_runtime/control/base.py @@ -26,7 +26,7 @@ TraceResponseFormat = Literal["json", "text", "html"] class TraceQueryRequest: levels: tuple[TraceLevel, ...] = ("ERROR", "WARNING", "INFO") include_attrs_json: bool = False - response_format: TraceResponseFormat = "text" + response_format: TraceResponseFormat = "html" TraceLookupHandler = Callable[[str, TraceQueryRequest], Awaitable[TraceLogView]] diff --git a/src/app_runtime/control/trace_presenter.py b/src/app_runtime/control/trace_presenter.py index 1a58c1b..3257b35 100644 --- a/src/app_runtime/control/trace_presenter.py +++ b/src/app_runtime/control/trace_presenter.py @@ -14,7 +14,7 @@ from app_runtime.contracts.trace import TraceLevel, TraceLogRecord, TraceLogView class TraceRequestParser: def parse(self, request: Request) -> TraceQueryRequest: raw_levels = request.query_params.get("levels") - raw_format = request.query_params.get("format", "text") + raw_format = request.query_params.get("format", "html") response_format = raw_format.strip().lower() if response_format not in {"json", "text", "html"}: raise ValueError(f"unsupported trace format: {raw_format}") diff --git a/tests/test_trace_endpoint.py b/tests/test_trace_endpoint.py index 0cfdcc2..900cbc5 100644 --- a/tests/test_trace_endpoint.py +++ b/tests/test_trace_endpoint.py @@ -46,7 +46,7 @@ def _build_client(trace_provider=None) -> TestClient: return TestClient(app) -def test_trace_endpoint_returns_text_with_default_levels() -> None: +def test_trace_endpoint_returns_html_by_default() -> None: captured: list[tuple[str, TraceQueryRequest]] = [] async def trace_provider(trace_id: str, request: TraceQueryRequest) -> TraceLogView: @@ -67,6 +67,32 @@ def test_trace_endpoint_returns_text_with_default_levels() -> None: finally: client.close() + assert response.status_code == 200 + assert response.headers["content-type"].startswith("text/html") + assert "trace_id:" in response.text + assert "first error" in response.text + assert "second warning" in response.text + assert captured == [("trace-1", TraceQueryRequest(levels=("ERROR", "WARNING", "INFO"), include_attrs_json=False, response_format="html"))] + + +def test_trace_endpoint_returns_text_when_requested() -> None: + async def trace_provider(_trace_id: str, _request: TraceQueryRequest) -> TraceLogView: + return TraceLogView( + trace_id="trace-1", + parent_id="root-trace", + child_ids=("child-1", "child-2"), + records=( + _trace_record(row_id=1, level="ERROR", message="first error"), + _trace_record(row_id=2, level="WARNING", message="second warning"), + ), + ) + + client = _build_client(trace_provider) + try: + response = client.get("/traces/trace-1?format=text") + finally: + client.close() + assert response.status_code == 200 assert response.text == ( "trace_id: trace-1\n" @@ -79,7 +105,6 @@ def test_trace_endpoint_returns_text_with_default_levels() -> None: "first error\n" "second warning" ) - assert captured == [("trace-1", TraceQueryRequest(levels=("ERROR", "WARNING", "INFO"), include_attrs_json=False, response_format="text"))] def test_trace_endpoint_appends_attrs_json_in_text_mode() -> None: @@ -95,7 +120,7 @@ def test_trace_endpoint_appends_attrs_json_in_text_mode() -> None: client = _build_client(trace_provider) try: - response = client.get("/traces/trace-1?attrs_json=true") + response = client.get("/traces/trace-1?format=text&attrs_json=true") finally: client.close() @@ -125,7 +150,7 @@ def test_trace_endpoint_separates_messages_by_step_in_text_mode() -> None: client = _build_client(trace_provider) try: - response = client.get("/traces/trace-1") + response = client.get("/traces/trace-1?format=text") finally: client.close()