Skip to content

Commit 91a9e70

Browse files
Queue::fake the 13 V2UpdateWorkflowTest waitFor-racing tests
Same bucket A pattern as previous V2WorkflowTest conversions: tests that relied on real testbench queue workers to drain the start workflow task before the test could send an update were timing out at the 30s waitFor budget under CI contention. Conversion: replace `waitFor(status === 'waiting')` with `Queue::fake()` plus `runReadyWorkflowTask($runId)`. The existing helper at line 1635 already runs one workflow task inline; combined with attemptUpdate's inline-drain at WorkflowStub.php:1957, the workflow advances through the update lifecycle deterministically without depending on real workers. Clears the 13 V2UpdateWorkflowTest CI-only failures from #399's run 24629752852: * testCallingAnnotatedUpdateMethodReturnsTheRawUpdateResult * testAttemptUpdateCanonicalizesDefaultArgumentsInDurableHistory * testAttemptUpdateRejectsInvalidArgumentsBeforeApplication * testAttemptUpdateRejectsNullArgumentsWhenTheContractDisallowsNull * testAttemptUpdateRejectsLaterUpdateWhileAnEarlierSignalIsStillPending * testAttemptUpdateDoesNotInlineDrainASignalThatWouldCloseTheRun * testLegacyRunsBackfillCommandSequenceBeforeRecordingLaterCommands * testUpdateFailuresAreRecordedWithoutClosingTheRun * testAttemptUpdateRejectsUnknownUpdateTarget * testSignalIntakeUsesDurableRunContractWhenWorkflowClassCannotBeResolved * testUnknownUpdateRejectionUsesDurableRunContractWhenWorkflowClassCannotBeResolved * testNamedUpdateValidationUsesDurableRunContractWhenWorkflowDefinitionCannotBeResolved * testAttemptUpdateRejectsWhenWorkflowDefinitionCannotBeResolvedAfterDurableValidation Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 22d0efa commit 91a9e70

1 file changed

Lines changed: 39 additions & 21 deletions

File tree

tests/Feature/V2/V2UpdateWorkflowTest.php

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -742,10 +742,12 @@ public function testSubmittedUpdateFailureIsRecordedAndWorkerReplaysCleanly(): v
742742

743743
public function testCallingAnnotatedUpdateMethodReturnsTheRawUpdateResult(): void
744744
{
745+
Queue::fake();
746+
745747
$workflow = WorkflowStub::make(TestUpdateWorkflow::class, 'order-update-dynamic');
746748
$workflow->start();
747749

748-
$this->waitFor(static fn (): bool => $workflow->refresh()->status() === 'waiting');
750+
$this->runReadyWorkflowTask($workflow->runId());
749751

750752
$result = $workflow->approve(true, 'console');
751753

@@ -763,10 +765,12 @@ public function testCallingAnnotatedUpdateMethodReturnsTheRawUpdateResult(): voi
763765

764766
public function testAttemptUpdateCanonicalizesDefaultArgumentsInDurableHistory(): void
765767
{
768+
Queue::fake();
769+
766770
$workflow = WorkflowStub::make(TestUpdateWorkflow::class, 'order-update-defaults');
767771
$workflow->start();
768772

769-
$this->waitFor(static fn (): bool => $workflow->refresh()->status() === 'waiting');
773+
$this->runReadyWorkflowTask($workflow->runId());
770774

771775
$result = $workflow->attemptUpdate('approve', true);
772776

@@ -801,10 +805,12 @@ public function testAttemptUpdateCanonicalizesDefaultArgumentsInDurableHistory()
801805

802806
public function testAttemptUpdateRejectsInvalidArgumentsBeforeApplication(): void
803807
{
808+
Queue::fake();
809+
804810
$workflow = WorkflowStub::make(TestUpdateWorkflow::class, 'order-update-invalid');
805811
$workflow->start();
806812

807-
$this->waitFor(static fn (): bool => $workflow->refresh()->status() === 'waiting');
813+
$this->runReadyWorkflowTask($workflow->runId());
808814

809815
$result = $workflow->attemptUpdate('approve');
810816

@@ -839,10 +845,12 @@ public function testAttemptUpdateRejectsInvalidArgumentsBeforeApplication(): voi
839845

840846
public function testAttemptUpdateRejectsNullArgumentsWhenTheContractDisallowsNull(): void
841847
{
848+
Queue::fake();
849+
842850
$workflow = WorkflowStub::make(TestUpdateWorkflow::class, 'order-update-null-invalid');
843851
$workflow->start();
844852

845-
$this->waitFor(static fn (): bool => $workflow->refresh()->status() === 'waiting');
853+
$this->runReadyWorkflowTask($workflow->runId());
846854

847855
$result = $workflow->attemptUpdate('approve', null);
848856

@@ -872,12 +880,12 @@ public function testAttemptUpdateRejectsNullArgumentsWhenTheContractDisallowsNul
872880

873881
public function testAttemptUpdateRejectsLaterUpdateWhileAnEarlierSignalIsStillPending(): void
874882
{
883+
Queue::fake();
884+
875885
$workflow = WorkflowStub::make(TestSignalThenUpdateWorkflow::class, 'order-update-linearized');
876886
$workflow->start();
877887

878-
$this->waitFor(static fn (): bool => $workflow->refresh()->status() === 'waiting');
879-
880-
Queue::fake();
888+
$this->runReadyWorkflowTask($workflow->runId());
881889

882890
$signal = $workflow->signal('advance', 'Taylor');
883891

@@ -967,12 +975,12 @@ public function testAttemptUpdateRejectsLaterUpdateWhileAnEarlierSignalIsStillPe
967975

968976
public function testAttemptUpdateDoesNotInlineDrainASignalThatWouldCloseTheRun(): void
969977
{
978+
Queue::fake();
979+
970980
$workflow = WorkflowStub::make(TestUpdateWorkflow::class, 'order-update-blocked');
971981
$workflow->start();
972982

973-
$this->waitFor(static fn (): bool => $workflow->refresh()->status() === 'waiting');
974-
975-
Queue::fake();
983+
$this->runReadyWorkflowTask($workflow->runId());
976984

977985
$signal = $workflow->signal('name-provided', 'Taylor');
978986
$result = $workflow->attemptUpdate('approve', true, 'api');
@@ -1045,10 +1053,12 @@ public function testAttemptUpdateDoesNotInlineDrainASignalThatWouldCloseTheRun()
10451053

10461054
public function testLegacyRunsBackfillCommandSequenceBeforeRecordingLaterCommands(): void
10471055
{
1056+
Queue::fake();
1057+
10481058
$workflow = WorkflowStub::make(TestUpdateWorkflow::class, 'legacy-update-seq');
10491059
$workflow->start();
10501060

1051-
$this->waitFor(static fn (): bool => $workflow->refresh()->status() === 'waiting');
1061+
$this->runReadyWorkflowTask($workflow->runId());
10521062

10531063
WorkflowCommand::query()
10541064
->where('workflow_run_id', $workflow->runId())
@@ -1062,8 +1072,6 @@ public function testLegacyRunsBackfillCommandSequenceBeforeRecordingLaterCommand
10621072
'last_command_sequence' => 0,
10631073
]);
10641074

1065-
Queue::fake();
1066-
10671075
$signal = $workflow->signal('name-provided', 'Taylor');
10681076
$update = $workflow->attemptUpdate('approve', true, 'api');
10691077

@@ -1120,10 +1128,12 @@ public function testLegacyRunsBackfillCommandSequenceBeforeRecordingLaterCommand
11201128

11211129
public function testUpdateFailuresAreRecordedWithoutClosingTheRun(): void
11221130
{
1131+
Queue::fake();
1132+
11231133
$workflow = WorkflowStub::make(TestUpdateWorkflow::class, 'order-update-failure');
11241134
$workflow->start();
11251135

1126-
$this->waitFor(static fn (): bool => $workflow->refresh()->status() === 'waiting');
1136+
$this->runReadyWorkflowTask($workflow->runId());
11271137

11281138
$result = $workflow->attemptUpdate('explode', 'boom');
11291139

@@ -1345,10 +1355,12 @@ public function testUpdateFailureDetailUsesUpdateIdHistoryWhenCommandRelationIsM
13451355

13461356
public function testAttemptUpdateRejectsUnknownUpdateTarget(): void
13471357
{
1358+
Queue::fake();
1359+
13481360
$workflow = WorkflowStub::make(TestUpdateWorkflow::class, 'order-update-unknown');
13491361
$workflow->start();
13501362

1351-
$this->waitFor(static fn (): bool => $workflow->refresh()->status() === 'waiting');
1363+
$this->runReadyWorkflowTask($workflow->runId());
13521364

13531365
$result = $workflow->attemptUpdate('missingUpdate', true);
13541366

@@ -1402,12 +1414,12 @@ public function testAttemptUpdateRejectsUnknownUpdateTarget(): void
14021414

14031415
public function testSignalIntakeUsesDurableRunContractWhenWorkflowClassCannotBeResolved(): void
14041416
{
1417+
Queue::fake();
1418+
14051419
$workflow = WorkflowStub::make(TestUpdateWorkflow::class, 'order-ct-signal');
14061420
$workflow->start();
14071421

1408-
$this->waitFor(static fn (): bool => $workflow->refresh()->status() === 'waiting');
1409-
1410-
Queue::fake();
1422+
$this->runReadyWorkflowTask($workflow->runId());
14111423

14121424
WorkflowRun::query()->whereKey($workflow->runId())->update([
14131425
'workflow_class' => 'Missing\\Workflow\\TestUpdateWorkflow',
@@ -1433,10 +1445,12 @@ public function testSignalIntakeUsesDurableRunContractWhenWorkflowClassCannotBeR
14331445

14341446
public function testUnknownUpdateRejectionUsesDurableRunContractWhenWorkflowClassCannotBeResolved(): void
14351447
{
1448+
Queue::fake();
1449+
14361450
$workflow = WorkflowStub::make(TestUpdateWorkflow::class, 'order-ct-update');
14371451
$workflow->start();
14381452

1439-
$this->waitFor(static fn (): bool => $workflow->refresh()->status() === 'waiting');
1453+
$this->runReadyWorkflowTask($workflow->runId());
14401454

14411455
WorkflowRun::query()->whereKey($workflow->runId())->update([
14421456
'workflow_class' => 'Missing\\Workflow\\TestUpdateWorkflow',
@@ -1451,10 +1465,12 @@ public function testUnknownUpdateRejectionUsesDurableRunContractWhenWorkflowClas
14511465

14521466
public function testNamedUpdateValidationUsesDurableRunContractWhenWorkflowDefinitionCannotBeResolved(): void
14531467
{
1468+
Queue::fake();
1469+
14541470
$workflow = WorkflowStub::make(TestUpdateWorkflow::class, 'order-ct-update-validation');
14551471
$workflow->start();
14561472

1457-
$this->waitFor(static fn (): bool => $workflow->refresh()->status() === 'waiting');
1473+
$this->runReadyWorkflowTask($workflow->runId());
14581474

14591475
WorkflowRun::query()->whereKey($workflow->runId())->update([
14601476
'workflow_class' => 'Missing\\Workflow\\TestUpdateWorkflow',
@@ -1487,10 +1503,12 @@ public function testNamedUpdateValidationUsesDurableRunContractWhenWorkflowDefin
14871503

14881504
public function testAttemptUpdateRejectsWhenWorkflowDefinitionCannotBeResolvedAfterDurableValidation(): void
14891505
{
1506+
Queue::fake();
1507+
14901508
$workflow = WorkflowStub::make(TestUpdateWorkflow::class, 'order-ct-update-execution');
14911509
$workflow->start();
14921510

1493-
$this->waitFor(static fn (): bool => $workflow->refresh()->status() === 'waiting');
1511+
$this->runReadyWorkflowTask($workflow->runId());
14941512

14951513
WorkflowRun::query()->whereKey($workflow->runId())->update([
14961514
'workflow_class' => 'Missing\\Workflow\\TestUpdateWorkflow',

0 commit comments

Comments
 (0)