@@ -67,6 +67,7 @@ async def test_get_result(client: Client):
6767@dataclass
6868class ActivityInput :
6969 wait_for_signal_workflow_id : str
70+ wait_for_activity_start_workflow_id : str | None = None
7071
7172
7273@activity .defn
@@ -189,7 +190,9 @@ async def test_manual_failure(client: Client):
189190 activity_id = activity_id ,
190191 run_id = activity_handle .run_id ,
191192 )
192- await async_activity_handle .fail (ApplicationError ("Test failure" ))
193+ await async_activity_handle .fail (
194+ ApplicationError ("Test failure" , non_retryable = True )
195+ )
193196 with pytest .raises (ActivityFailedError ) as err :
194197 await activity_handle .result ()
195198 assert isinstance (err .value .cause , ApplicationError )
@@ -201,13 +204,22 @@ async def test_manual_failure(client: Client):
201204
202205@activity .defn
203206async def activity_for_testing_heartbeat (input : ActivityInput ) -> str :
204- wait_for_heartbeat_wf_handle = await activity .client ().start_workflow (
205- WaitForSignalWorkflow .run ,
206- id = input .wait_for_signal_workflow_id ,
207- task_queue = activity .info ().task_queue ,
208- )
209207 info = activity .info ()
210208 if info .attempt == 1 :
209+ # Signal that activity has started (only on first attempt)
210+ if input .wait_for_activity_start_workflow_id :
211+ await (
212+ activity .client ()
213+ .get_workflow_handle (
214+ workflow_id = input .wait_for_activity_start_workflow_id ,
215+ )
216+ .signal (WaitForSignalWorkflow .signal )
217+ )
218+ wait_for_heartbeat_wf_handle = await activity .client ().start_workflow (
219+ WaitForSignalWorkflow .run ,
220+ id = input .wait_for_signal_workflow_id ,
221+ task_queue = activity .info ().task_queue ,
222+ )
211223 # Wait for test to notify that it has sent heartbeat
212224 await wait_for_heartbeat_wf_handle .result ()
213225 raise Exception ("Intentional error to force retry" )
@@ -223,16 +235,25 @@ async def test_manual_heartbeat(client: Client):
223235 activity_id = str (uuid .uuid4 ())
224236 task_queue = str (uuid .uuid4 ())
225237 wait_for_signal_workflow_id = str (uuid .uuid4 ())
238+ wait_for_activity_start_workflow_id = str (uuid .uuid4 ())
226239
227240 activity_handle = await client .start_activity (
228241 activity_for_testing_heartbeat ,
229242 args = (
230- ActivityInput (wait_for_signal_workflow_id = wait_for_signal_workflow_id ),
243+ ActivityInput (
244+ wait_for_signal_workflow_id = wait_for_signal_workflow_id ,
245+ wait_for_activity_start_workflow_id = wait_for_activity_start_workflow_id ,
246+ ),
231247 ), # TODO: overloads
232248 id = activity_id ,
233249 task_queue = task_queue ,
234250 start_to_close_timeout = timedelta (seconds = 5 ),
235251 )
252+ wait_for_activity_start_wf_handle = await client .start_workflow (
253+ WaitForSignalWorkflow .run ,
254+ id = wait_for_activity_start_workflow_id ,
255+ task_queue = task_queue ,
256+ )
236257 async with Worker (
237258 client ,
238259 task_queue = task_queue ,
@@ -243,6 +264,7 @@ async def test_manual_heartbeat(client: Client):
243264 activity_id = activity_id ,
244265 run_id = activity_handle .run_id ,
245266 )
267+ await wait_for_activity_start_wf_handle .result ()
246268 await async_activity_handle .heartbeat ("Test heartbeat details" )
247269 await client .get_workflow_handle (
248270 workflow_id = wait_for_signal_workflow_id ,
0 commit comments