Skip to content

Commit cb82dd7

Browse files
authored
Fix deleted models (#209)
1 parent a71fa08 commit cb82dd7

3 files changed

Lines changed: 97 additions & 0 deletions

File tree

src/Middleware/ActivityMiddleware.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ public function handle($job, $next): void
4141
now()
4242
->format('Y-m-d\TH:i:s.u\Z')
4343
);
44+
} catch (\Illuminate\Database\Eloquent\ModelNotFoundException $throwable) {
45+
$job->storedWorkflow->toWorkflow()
46+
->fail($throwable);
4447
} catch (\Spatie\ModelStates\Exceptions\TransitionNotFound) {
4548
if ($job->storedWorkflow->toWorkflow()->running()) {
4649
$job->release();
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tests\Fixtures;
6+
7+
use Workflow\Models\StoredWorkflowLog;
8+
use Workflow\Workflow;
9+
10+
class TestModelNotFoundWorkflow extends Workflow
11+
{
12+
public $connection = 'redis';
13+
14+
public $queue = 'default';
15+
16+
public function execute(StoredWorkflowLog $log)
17+
{
18+
}
19+
}

tests/Unit/Middleware/ActivityMiddlewareTest.php

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55
namespace Tests\Unit\Middleware;
66

77
use Exception;
8+
use Illuminate\Database\Eloquent\ModelNotFoundException;
89
use Illuminate\Support\Facades\Event;
910
use Illuminate\Support\Facades\Queue;
1011
use Mockery\MockInterface;
1112
use Tests\Fixtures\TestActivity;
13+
use Tests\Fixtures\TestModelNotFoundWorkflow;
1214
use Tests\Fixtures\TestWorkflow;
1315
use Tests\TestCase;
1416
use Workflow\Events\ActivityCompleted;
@@ -17,6 +19,7 @@
1719
use Workflow\Middleware\ActivityMiddleware;
1820
use Workflow\Models\StoredWorkflow;
1921
use Workflow\States\WorkflowCompletedStatus;
22+
use Workflow\States\WorkflowFailedStatus;
2023
use Workflow\States\WorkflowRunningStatus;
2124
use Workflow\States\WorkflowWaitingStatus;
2225
use Workflow\WorkflowStub;
@@ -151,4 +154,76 @@ public function testException(): void
151154
Event::assertDispatched(ActivityFailed::class);
152155
Queue::assertPushed(TestWorkflow::class, 1);
153156
}
157+
158+
public function testModelNotFoundException(): void
159+
{
160+
Event::fake();
161+
Queue::fake();
162+
163+
$workflow = WorkflowStub::make(TestWorkflow::class);
164+
$workflow->start();
165+
166+
$storedWorkflow = StoredWorkflow::findOrFail($workflow->id());
167+
$storedWorkflow->update([
168+
'status' => WorkflowWaitingStatus::class,
169+
]);
170+
171+
$activity = $this->mock(TestActivity::class);
172+
$activity->index = 0;
173+
$activity->now = now()
174+
->toDateTimeString();
175+
$activity->storedWorkflow = $storedWorkflow;
176+
177+
$middleware = new ActivityMiddleware();
178+
179+
try {
180+
$middleware->handle($activity, static function ($job) {
181+
throw new ModelNotFoundException('test');
182+
});
183+
} catch (Exception $exception) {
184+
$this->assertSame('test', $exception->getMessage());
185+
}
186+
187+
Event::assertDispatched(ActivityStarted::class);
188+
Event::assertDispatched(ActivityFailed::class);
189+
Queue::assertPushed(TestWorkflow::class, 1);
190+
191+
$this->assertSame(WorkflowWaitingStatus::class, $workflow->status());
192+
}
193+
194+
public function testModelNotFoundExceptionInNextMethod(): void
195+
{
196+
Event::fake();
197+
Queue::fake();
198+
199+
$deletedWorkflow = StoredWorkflow::create([
200+
'class' => TestWorkflow::class,
201+
]);
202+
203+
$workflow = WorkflowStub::make(TestModelNotFoundWorkflow::class);
204+
$workflow->start($deletedWorkflow);
205+
206+
$storedWorkflow = StoredWorkflow::findOrFail($workflow->id());
207+
$storedWorkflow->update([
208+
'status' => WorkflowWaitingStatus::class,
209+
]);
210+
211+
$deletedWorkflow->delete();
212+
213+
$activity = $this->mock(TestActivity::class);
214+
$activity->index = 0;
215+
$activity->now = now()
216+
->toDateTimeString();
217+
$activity->storedWorkflow = $storedWorkflow;
218+
219+
$middleware = new ActivityMiddleware();
220+
221+
$middleware->handle($activity, static function ($job) {
222+
return true;
223+
});
224+
225+
$this->assertSame(WorkflowFailedStatus::class, $workflow->status());
226+
227+
Queue::assertPushed(TestWorkflow::class, 0);
228+
}
154229
}

0 commit comments

Comments
 (0)