Skip to content

Commit bfb3fc9

Browse files
committed
test: adapt streaming model usage tests to next's always-emit behavior
1 parent 25d8560 commit bfb3fc9

2 files changed

Lines changed: 38 additions & 32 deletions

File tree

tests/lib/adk/test_tracing_module.py

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,11 @@ async def test_start_span_in_workflow_returns_none_when_activity_fails(self):
113113
mock_service, module = _make_module()
114114
mock_meter = _make_metric_meter()
115115

116-
with patch.object(_tracing_mod, "in_temporal_workflow", return_value=True), \
117-
patch.object(_tracing_mod, "ActivityHelpers") as mock_helpers, \
118-
patch.object(_tracing_mod.workflow, "logger") as mock_logger, \
119-
patch.object(_tracing_mod.workflow, "metric_meter", return_value=mock_meter):
116+
with patch.object(_tracing_mod, "in_temporal_workflow", return_value=True), patch.object(
117+
_tracing_mod, "ActivityHelpers"
118+
) as mock_helpers, patch.object(_tracing_mod.workflow, "logger") as mock_logger, patch.object(
119+
_tracing_mod.workflow, "metric_meter", return_value=mock_meter
120+
):
120121
mock_helpers.execute_activity = AsyncMock(side_effect=_make_activity_error())
121122
result = await module.start_span(trace_id="trace-123", name="test-span")
122123

@@ -127,9 +128,7 @@ async def test_start_span_in_workflow_returns_none_when_activity_fails(self):
127128
description="Temporal tracing span activities dropped after fail-open",
128129
unit="1",
129130
)
130-
mock_meter.create_counter.return_value.add.assert_called_once_with(
131-
1, {"event_type": "start"}
132-
)
131+
mock_meter.create_counter.return_value.add.assert_called_once_with(1, {"event_type": "start"})
133132
mock_helpers.execute_activity.assert_called_once()
134133
mock_service.start_span.assert_not_called()
135134

@@ -138,10 +137,11 @@ async def test_end_span_in_workflow_returns_span_when_activity_fails(self):
138137
span = _make_span()
139138
mock_meter = _make_metric_meter()
140139

141-
with patch.object(_tracing_mod, "in_temporal_workflow", return_value=True), \
142-
patch.object(_tracing_mod, "ActivityHelpers") as mock_helpers, \
143-
patch.object(_tracing_mod.workflow, "logger") as mock_logger, \
144-
patch.object(_tracing_mod.workflow, "metric_meter", return_value=mock_meter):
140+
with patch.object(_tracing_mod, "in_temporal_workflow", return_value=True), patch.object(
141+
_tracing_mod, "ActivityHelpers"
142+
) as mock_helpers, patch.object(_tracing_mod.workflow, "logger") as mock_logger, patch.object(
143+
_tracing_mod.workflow, "metric_meter", return_value=mock_meter
144+
):
145145
mock_helpers.execute_activity = AsyncMock(side_effect=_make_activity_error())
146146
result = await module.end_span(trace_id="trace-123", span=span)
147147

@@ -152,18 +152,16 @@ async def test_end_span_in_workflow_returns_span_when_activity_fails(self):
152152
description="Temporal tracing span activities dropped after fail-open",
153153
unit="1",
154154
)
155-
mock_meter.create_counter.return_value.add.assert_called_once_with(
156-
1, {"event_type": "end"}
157-
)
155+
mock_meter.create_counter.return_value.add.assert_called_once_with(1, {"event_type": "end"})
158156
mock_helpers.execute_activity.assert_called_once()
159157
mock_service.end_span.assert_not_called()
160158

161159
async def test_context_manager_skips_end_when_temporal_start_fails(self):
162160
mock_service, module = _make_module()
163161

164-
with patch.object(_tracing_mod, "in_temporal_workflow", return_value=True), \
165-
patch.object(_tracing_mod, "ActivityHelpers") as mock_helpers, \
166-
patch.object(_tracing_mod.workflow, "logger"):
162+
with patch.object(_tracing_mod, "in_temporal_workflow", return_value=True), patch.object(
163+
_tracing_mod, "ActivityHelpers"
164+
) as mock_helpers, patch.object(_tracing_mod.workflow, "logger"):
167165
mock_helpers.execute_activity = AsyncMock(side_effect=_make_activity_error())
168166
async with module.span(trace_id="trace-123", name="test-span") as span:
169167
assert span is None
@@ -175,8 +173,9 @@ async def test_context_manager_skips_end_when_temporal_start_fails(self):
175173
async def test_start_span_in_workflow_propagates_unexpected_errors(self):
176174
mock_service, module = _make_module()
177175

178-
with patch.object(_tracing_mod, "in_temporal_workflow", return_value=True), \
179-
patch.object(_tracing_mod, "ActivityHelpers") as mock_helpers:
176+
with patch.object(_tracing_mod, "in_temporal_workflow", return_value=True), patch.object(
177+
_tracing_mod, "ActivityHelpers"
178+
) as mock_helpers:
180179
mock_helpers.execute_activity = AsyncMock(side_effect=RuntimeError("bad response shape"))
181180
try:
182181
await module.start_span(trace_id="trace-123", name="test-span")
@@ -193,11 +192,11 @@ async def test_start_span_in_workflow_propagates_cancellation(self):
193192
activity_error = _make_activity_error()
194193
mock_meter = _make_metric_meter()
195194

196-
with patch.object(_tracing_mod, "in_temporal_workflow", return_value=True), \
197-
patch.object(_tracing_mod, "ActivityHelpers") as mock_helpers, \
198-
patch.object(_tracing_mod, "is_cancelled_exception", return_value=True), \
199-
patch.object(_tracing_mod.workflow, "logger") as mock_logger, \
200-
patch.object(_tracing_mod.workflow, "metric_meter", return_value=mock_meter):
195+
with patch.object(_tracing_mod, "in_temporal_workflow", return_value=True), patch.object(
196+
_tracing_mod, "ActivityHelpers"
197+
) as mock_helpers, patch.object(_tracing_mod, "is_cancelled_exception", return_value=True), patch.object(
198+
_tracing_mod.workflow, "logger"
199+
) as mock_logger, patch.object(_tracing_mod.workflow, "metric_meter", return_value=mock_meter):
201200
mock_helpers.execute_activity = AsyncMock(side_effect=activity_error)
202201

203202
with pytest.raises(ActivityError):
@@ -214,11 +213,11 @@ async def test_end_span_in_workflow_propagates_cancellation(self):
214213
activity_error = _make_activity_error()
215214
mock_meter = _make_metric_meter()
216215

217-
with patch.object(_tracing_mod, "in_temporal_workflow", return_value=True), \
218-
patch.object(_tracing_mod, "ActivityHelpers") as mock_helpers, \
219-
patch.object(_tracing_mod, "is_cancelled_exception", return_value=True), \
220-
patch.object(_tracing_mod.workflow, "logger") as mock_logger, \
221-
patch.object(_tracing_mod.workflow, "metric_meter", return_value=mock_meter):
216+
with patch.object(_tracing_mod, "in_temporal_workflow", return_value=True), patch.object(
217+
_tracing_mod, "ActivityHelpers"
218+
) as mock_helpers, patch.object(_tracing_mod, "is_cancelled_exception", return_value=True), patch.object(
219+
_tracing_mod.workflow, "logger"
220+
) as mock_logger, patch.object(_tracing_mod.workflow, "metric_meter", return_value=mock_meter):
222221
mock_helpers.execute_activity = AsyncMock(side_effect=activity_error)
223222

224223
with pytest.raises(ActivityError):

tests/lib/core/temporal/plugins/openai_agents/test_model_usage.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,6 @@ async def test_streaming_model_captures_final_response_usage(self, tracing_conte
183183
)
184184

185185
# Real usage lands on the returned ModelResponse (was zeroed before)
186-
assert response.usage.requests == 1
187186
assert response.usage.input_tokens == 120
188187
assert response.usage.output_tokens == 80
189188
assert response.usage.total_tokens == 200
@@ -195,7 +194,7 @@ async def test_streaming_model_captures_final_response_usage(self, tracing_conte
195194
span = fake_tracer.trace_obj.spans[0]
196195
assert _output_dict(span)["usage"] == EXPECTED_USAGE_BLOB
197196

198-
async def test_streaming_model_omits_usage_when_api_reports_none(self, tracing_contextvars):
197+
async def test_streaming_model_writes_zero_usage_when_api_reports_none(self, tracing_contextvars):
199198
completed = ResponseCompletedEvent.model_construct(
200199
type="response.completed",
201200
response=Response.model_construct(output=[], usage=None),
@@ -219,6 +218,14 @@ async def test_streaming_model_omits_usage_when_api_reports_none(self, tracing_c
219218
tracing=None,
220219
)
221220

221+
# No usage from the API: the model reports zeros rather than omitting,
222+
# so billing sums 0 instead of missing the span
222223
assert response.usage.input_tokens == 0
223224
span = fake_tracer.trace_obj.spans[0]
224-
assert "usage" not in _output_dict(span)
225+
assert _output_dict(span)["usage"] == {
226+
"input_tokens": 0,
227+
"output_tokens": 0,
228+
"total_tokens": 0,
229+
"cached_input_tokens": 0,
230+
"reasoning_tokens": 0,
231+
}

0 commit comments

Comments
 (0)