Skip to content

Commit 88e3d6e

Browse files
committed
Fixes per PR review feedback.
Refactored workflow to use workflow.init. Added unit test.
1 parent c3d9033 commit 88e3d6e

3 files changed

Lines changed: 44 additions & 14 deletions

File tree

tests/updatable_timer/__init__.py

Whitespace-only changes.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import datetime
2+
import logging
3+
import math
4+
import uuid
5+
6+
from temporalio.client import Client, WorkflowExecutionStatus
7+
from temporalio.testing import WorkflowEnvironment
8+
from temporalio.worker import Worker
9+
10+
from updatable_timer.workflow import Workflow
11+
12+
13+
async def test_updatable_timer_workflow(client: Client):
14+
logging.basicConfig(level=logging.DEBUG)
15+
16+
task_queue_name = str(uuid.uuid4())
17+
async with await WorkflowEnvironment.start_time_skipping() as env:
18+
async with Worker(env.client, task_queue=task_queue_name, workflows=[Workflow]):
19+
in_a_day = float(
20+
(datetime.datetime.now() + datetime.timedelta(days=1)).timestamp()
21+
)
22+
in_an_hour = float(
23+
(datetime.datetime.now() + datetime.timedelta(hours=1)).timestamp()
24+
)
25+
handle = await env.client.start_workflow(
26+
Workflow.run, in_a_day, id=str(uuid.uuid4()), task_queue=task_queue_name
27+
)
28+
wake_up_time1 = await handle.query(Workflow.get_wake_up_time)
29+
assert math.isclose(wake_up_time1, in_a_day)
30+
await handle.signal(Workflow.update_wake_up_time, in_an_hour)
31+
wake_up_time2 = await handle.query(Workflow.get_wake_up_time)
32+
assert math.isclose(wake_up_time2, in_an_hour)
33+
await handle.result()

updatable_timer/workflow.py

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,25 @@
88

99
@workflow.defn
1010
class Workflow:
11-
def __init__(self):
12-
self.timer: Optional[UpdatableTimer] = None
13-
14-
@workflow.run
15-
async def run(self, wake_up_time: float):
11+
@workflow.init
12+
def __init__(self, wake_up_time: float) -> None:
1613
self.timer = UpdatableTimer(
1714
datetime.fromtimestamp(wake_up_time, tz=timezone.utc)
1815
)
16+
17+
@workflow.run
18+
async def run(self, wake_up_time: float):
1919
await self.timer.sleep()
2020

2121
@workflow.signal
22-
async def update_wake_up_time(self, wake_up_time: float):
23-
# Deals with situation when the signal method is called before the run method.
24-
# This happens when a workflow task is executed after a signal is received
25-
# or when a workflow is started using the signal-with-start.
26-
await workflow.wait_condition(lambda: self.timer is not None)
27-
assert self.timer is not None # for mypy
22+
async def update_wake_up_time(self, wake_up_time: float) -> None:
23+
workflow.logger.info(f"update_wake_up_time: {wake_up_time}")
24+
2825
self.timer.update_wake_up_time(
2926
datetime.fromtimestamp(wake_up_time, tz=timezone.utc)
3027
)
3128

3229
@workflow.query
33-
def get_wake_up_time(self):
34-
assert self.timer is not None # for mypy
35-
return self.timer.get_wake_up_time()
30+
def get_wake_up_time(self) -> float:
31+
workflow.logger.info(f"get_wake_up_time")
32+
return float(self.timer.get_wake_up_time().timestamp())

0 commit comments

Comments
 (0)