1+ from typing import Any
12"""Tests for Phase 2 — Telemetry Hardening (TEL-01 through TEL-04)."""
23
34from unittest .mock import MagicMock , patch
@@ -110,12 +111,13 @@ def test_all_loop_stages_share_one_trace_without_prompt_or_output_attributes() -
110111 pass
111112
112113 spans = exporter .get_finished_spans ()
113- assert {span .attributes ["cas.stage" ] for span in spans } == {stage .value for stage in LoopStage }
114+ stage_values = {stage .value for stage in LoopStage }
115+ assert {span .attributes ["cas.stage" ] for span in spans if span .attributes } == stage_values
114116 assert len ({span .context .trace_id for span in spans }) == 1
115117 assert all (
116118 "prompt" not in key and "output" not in key
117119 for span in spans
118- for key in span .attributes
120+ for key in ( span .attributes or {})
119121 )
120122
121123
@@ -140,7 +142,7 @@ def test_install_propagator_sets_w3c_propagator() -> None:
140142# ---------------------------------------------------------------------------
141143
142144
143- def test_workflow_endpoint_creates_span (in_memory_exporter : InMemorySpanExporter , envelope ) -> None :
145+ def test_workflow_endpoint_creates_span (in_memory_exporter : InMemorySpanExporter , envelope : "Any" ) -> None :
144146 client = TestClient (create_app (Settings ()))
145147 response = client .post ("/api/v1/workflows" , json = envelope .model_dump (mode = "json" ))
146148
@@ -157,12 +159,13 @@ def test_workflow_endpoint_creates_span(in_memory_exporter: InMemorySpanExporter
157159# ---------------------------------------------------------------------------
158160
159161
160- def test_workflow_span_attributes (in_memory_exporter : InMemorySpanExporter , envelope ) -> None :
162+ def test_workflow_span_attributes (in_memory_exporter : InMemorySpanExporter , envelope : "Any" ) -> None :
161163 client = TestClient (create_app (Settings ()))
162164 client .post ("/api/v1/workflows" , json = envelope .model_dump (mode = "json" ))
163165
164166 spans = in_memory_exporter .get_finished_spans ()
165167 api_span = next (s for s in spans if s .name == "cas.api.workflows.execute" )
168+ assert api_span .attributes
166169 assert api_span .attributes .get ("cas.correlation_id" ) == envelope .correlationId
167170 assert api_span .attributes .get ("cas.run_id" ) == envelope .runId
168171 assert api_span .attributes .get ("cas.intent" ) == envelope .intent
@@ -174,7 +177,7 @@ def test_workflow_span_attributes(in_memory_exporter: InMemorySpanExporter, enve
174177
175178
176179def test_workflow_span_events_started_and_completed (
177- in_memory_exporter : InMemorySpanExporter , envelope
180+ in_memory_exporter : InMemorySpanExporter , envelope : "Any"
178181) -> None :
179182 client = TestClient (create_app (Settings ()))
180183 client .post ("/api/v1/workflows" , json = envelope .model_dump (mode = "json" ))
@@ -188,12 +191,12 @@ def test_workflow_span_events_started_and_completed(
188191
189192
190193def test_workflow_span_events_started_and_failed (
191- in_memory_exporter : InMemorySpanExporter , envelope
194+ in_memory_exporter : InMemorySpanExporter , envelope : "Any"
192195) -> None :
193196 from cas_reference_product .workflow import WorkflowAgentServiceError
194197
195198 class FailingService :
196- def run (self , _env ) -> str :
199+ def run (self : "Any" , _env : "Any" ) -> str :
197200 raise WorkflowAgentServiceError ("backend down" )
198201
199202 with patch (
@@ -213,14 +216,15 @@ def run(self, _env) -> str:
213216
214217
215218def test_span_event_carries_correlation_id (
216- in_memory_exporter : InMemorySpanExporter , envelope
219+ in_memory_exporter : InMemorySpanExporter , envelope : "Any"
217220) -> None :
218221 client = TestClient (create_app (Settings ()))
219222 client .post ("/api/v1/workflows" , json = envelope .model_dump (mode = "json" ))
220223
221224 spans = in_memory_exporter .get_finished_spans ()
222225 api_span = next (s for s in spans if s .name == "cas.api.workflows.execute" )
223226 started_event = next (e for e in api_span .events if e .name == "workflow.started" )
227+ assert started_event .attributes
224228 assert started_event .attributes .get ("cas.correlation_id" ) == envelope .correlationId
225229 assert started_event .attributes .get ("cas.run_id" ) == envelope .runId
226230
@@ -231,7 +235,7 @@ def test_span_event_carries_correlation_id(
231235
232236
233237def test_w3c_traceparent_propagated_inbound (
234- in_memory_exporter : InMemorySpanExporter , envelope
238+ in_memory_exporter : InMemorySpanExporter , envelope : "Any"
235239) -> None :
236240 """Request with a W3C traceparent header links the API span as a child."""
237241 incoming_traceparent = "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"
0 commit comments