diff --git a/changelog/fixed/timeless-tortoise.md b/changelog/fixed/timeless-tortoise.md new file mode 100644 index 0000000000..e29259f3fc --- /dev/null +++ b/changelog/fixed/timeless-tortoise.md @@ -0,0 +1 @@ +`ActivityHandle.describe()` now returns `None` as the `expiration_time` of a Standalone Activity that has no schedule-to-close timeout, instead of a naive `datetime.min`. diff --git a/temporalio/client/_activity.py b/temporalio/client/_activity.py index df7cd5c283..ec127d6313 100644 --- a/temporalio/client/_activity.py +++ b/temporalio/client/_activity.py @@ -362,7 +362,7 @@ def _from_resp( expiration_time=( resp.info.expiration_time.ToDatetime(tzinfo=timezone.utc) if resp.info.HasField("expiration_time") - else datetime.min + else None ), heartbeat_timeout=( resp.info.heartbeat_timeout.ToTimedelta() diff --git a/tests/test_activity.py b/tests/test_activity.py index b3208d951d..d0a5de60a7 100644 --- a/tests/test_activity.py +++ b/tests/test_activity.py @@ -167,6 +167,23 @@ async def test_describe(self, client: Client, activity_handle: ActivityHandle): assert desc.next_attempt_schedule_time is None assert desc.retry_policy is not None + async def test_describe_without_schedule_to_close_timeout( + self, client: Client, env: WorkflowEnvironment, task_queue: str + ): + if env.supports_time_skipping_v1: + pytest.skip( + "Java test server: https://github.com/temporalio/sdk-java/issues/2741" + ) + activity_handle = await client.start_activity( + heartbeat_fail_increment, + args=(1,), + id=str(uuid.uuid4()), + task_queue=task_queue, + start_to_close_timeout=timedelta(minutes=1), + ) + desc = await activity_handle.describe() + assert desc.expiration_time is None # no schedule-to-close timeout + async def test_describe_payloads( self, client: Client, activity_handle: ActivityHandle, task_queue: str ):