Skip to content

Commit a6f33d6

Browse files
committed
Add test that confirms token present in callback headers for activities
1 parent 4d6c02e commit a6f33d6

3 files changed

Lines changed: 63 additions & 1 deletion

File tree

temporalio/client/_activity.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,13 +309,17 @@ class ActivityExecutionDescription(ActivityExecution):
309309
long_poll_token: bytes | None
310310
"""Token for follow-on long-poll requests. None if the activity is complete."""
311311

312+
raw_callbacks: Sequence[temporalio.api.activity.v1.CallbackInfo]
313+
"""Underlying protobuf callbacks"""
314+
312315
@classmethod
313316
async def _from_execution_info(
314317
cls,
315318
info: temporalio.api.activity.v1.ActivityExecutionInfo,
316319
long_poll_token: bytes | None,
317320
namespace: str,
318321
data_converter: temporalio.converter.DataConverter,
322+
callbacks: Sequence[temporalio.api.activity.v1.CallbackInfo],
319323
) -> Self:
320324
"""Create from raw proto activity execution info."""
321325
# Decode heartbeat details if present
@@ -409,6 +413,7 @@ async def _from_execution_info(
409413
typed_search_attributes=temporalio.converter.decode_typed_search_attributes(
410414
info.search_attributes
411415
),
416+
raw_callbacks=callbacks,
412417
)
413418

414419

temporalio/client/_impl.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,7 @@ async def describe_activity(
723723
workflow_id=input.activity_id, # Using activity_id as workflow_id for activities not started by a workflow
724724
)
725725
),
726+
callbacks=resp.callbacks,
726727
)
727728

728729
def list_activities(

tests/nexus/test_temporal_operation.py

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1132,7 +1132,7 @@ async def test_temporal_operation_overloads(
11321132
)
11331133

11341134

1135-
async def test_temporal_operation_includes_token_in_callback(
1135+
async def test_temporal_operation_includes_workflow_token_in_callback(
11361136
client: Client, env: WorkflowEnvironment
11371137
):
11381138
task_queue = str(uuid.uuid4())
@@ -1168,3 +1168,59 @@ async def test_temporal_operation_includes_token_in_callback(
11681168
).encode()
11691169

11701170
assert token == expected_token
1171+
1172+
1173+
async def test_temporal_operation_includes_activity_token_in_callback(
1174+
client: Client, env: WorkflowEnvironment
1175+
):
1176+
task_queue = str(uuid.uuid4())
1177+
endpoint_name = make_nexus_endpoint_name(task_queue)
1178+
await env.create_nexus_endpoint(endpoint_name, task_queue)
1179+
1180+
@service_handler
1181+
class ActivityTokenHandler:
1182+
@nexus.temporal_operation
1183+
async def echo_activity(
1184+
self,
1185+
_ctx: nexus.TemporalStartOperationContext,
1186+
client: nexus.TemporalNexusClient,
1187+
input: Input,
1188+
) -> nexus.TemporalOperationResult[str]:
1189+
return await client.start_activity(
1190+
echo_activity,
1191+
input,
1192+
id=input.value,
1193+
start_to_close_timeout=timedelta(seconds=10),
1194+
)
1195+
1196+
async with Worker(
1197+
client,
1198+
task_queue=task_queue,
1199+
nexus_service_handlers=[ActivityTokenHandler()],
1200+
activities=[echo_activity],
1201+
):
1202+
input_value = f"test-{uuid.uuid4()}"
1203+
1204+
nexus_client = client.create_nexus_client(ActivityTokenHandler, endpoint_name)
1205+
1206+
result = await nexus_client.execute_operation(
1207+
ActivityTokenHandler.echo_activity,
1208+
Input(value=input_value, task_queue=task_queue),
1209+
id=str(uuid.uuid4()),
1210+
)
1211+
assert result == input_value
1212+
1213+
activity_handle = client.get_activity_handle(input_value)
1214+
1215+
desc = await activity_handle.describe()
1216+
token = desc.raw_callbacks[0].info.callback.nexus.header[
1217+
"nexus-operation-token"
1218+
]
1219+
1220+
expected_token = OperationToken(
1221+
type=OperationTokenType.ACTIVITY,
1222+
namespace=client.namespace,
1223+
activity_id=input_value,
1224+
).encode()
1225+
1226+
assert token == expected_token

0 commit comments

Comments
 (0)