|
5 | 5 | namespace Tests\Unit\Middleware; |
6 | 6 |
|
7 | 7 | use Exception; |
| 8 | +use Illuminate\Database\Eloquent\ModelNotFoundException; |
8 | 9 | use Illuminate\Support\Facades\Event; |
9 | 10 | use Illuminate\Support\Facades\Queue; |
10 | 11 | use Mockery\MockInterface; |
11 | 12 | use Tests\Fixtures\TestActivity; |
| 13 | +use Tests\Fixtures\TestModelNotFoundWorkflow; |
12 | 14 | use Tests\Fixtures\TestWorkflow; |
13 | 15 | use Tests\TestCase; |
14 | 16 | use Workflow\Events\ActivityCompleted; |
|
17 | 19 | use Workflow\Middleware\ActivityMiddleware; |
18 | 20 | use Workflow\Models\StoredWorkflow; |
19 | 21 | use Workflow\States\WorkflowCompletedStatus; |
| 22 | +use Workflow\States\WorkflowFailedStatus; |
20 | 23 | use Workflow\States\WorkflowRunningStatus; |
21 | 24 | use Workflow\States\WorkflowWaitingStatus; |
22 | 25 | use Workflow\WorkflowStub; |
@@ -151,4 +154,76 @@ public function testException(): void |
151 | 154 | Event::assertDispatched(ActivityFailed::class); |
152 | 155 | Queue::assertPushed(TestWorkflow::class, 1); |
153 | 156 | } |
| 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 | + } |
154 | 229 | } |
0 commit comments