/
githubmirror
/
framework
Обзор
Документация
Войти
/
githubmirror
/
framework
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
13.x
tests/Integration/Queue/CallQueuedHandlerTest.php
289 строк
8 KB
Jason McCreary
[13.x] Mockery cleanup (#61117)
10 авг 2026, 20:23
Не верифицирован
10 авг 2026, 20:23
2ee40ee
Код
Авторство
О чём код?
<?php namespace Illuminate\Tests\Integration\Queue; use Illuminate\Bus\Batch; use Illuminate\Bus\Batchable; use Illuminate\Bus\BatchRepository; use Illuminate\Bus\Dispatcher; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\Job; use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Queue\Attributes\DeleteWhenMissingModels; use Illuminate\Queue\CallQueuedHandler; use Illuminate\Queue\Events\JobFailed; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Support\Facades\Event; use Mockery; use Orchestra\Testbench\TestCase; class CallQueuedHandlerTest extends TestCase { public function testJobCanBeDispatched() { CallQueuedHandlerTestJob::$handled = false; $instance = new CallQueuedHandler(new Dispatcher($this->app), $this->app); $job = Mockery::mock(Job::class); $job->expects('hasFailed')->andReturn(false); $job->expects('isReleased')->times(2)->andReturn(false); $job->expects('isDeletedOrReleased')->andReturn(false); $job->expects('delete'); $instance->call($job, [ 'command' => serialize(new CallQueuedHandlerTestJob), ]); $this->assertTrue(CallQueuedHandlerTestJob::$handled); } public function testJobCanBeDispatchedThroughMiddleware() { CallQueuedHandlerTestJobWithMiddleware::$handled = false; CallQueuedHandlerTestJobWithMiddleware::$middlewareCommand = null; $instance = new CallQueuedHandler(new Dispatcher($this->app), $this->app); $job = Mockery::mock(Job::class); $job->expects('hasFailed')->andReturn(false); $job->expects('isReleased')->times(2)->andReturn(false); $job->expects('isDeletedOrReleased')->andReturn(false); $job->expects('delete'); $instance->call($job, [ 'command' => serialize($command = new CallQueuedHandlerTestJobWithMiddleware), ]); $this->assertInstanceOf(CallQueuedHandlerTestJobWithMiddleware::class, CallQueuedHandlerTestJobWithMiddleware::$middlewareCommand); $this->assertTrue(CallQueuedHandlerTestJobWithMiddleware::$handled); } public function testJobCanBeDispatchedThroughMiddlewareOnDispatch() { $_SERVER['__test.dispatchMiddleware'] = false; CallQueuedHandlerTestJobWithMiddleware::$handled = false; CallQueuedHandlerTestJobWithMiddleware::$middlewareCommand = null; $instance = new CallQueuedHandler(new Dispatcher($this->app), $this->app); $job = Mockery::mock(Job::class); $job->expects('hasFailed')->andReturn(false); $job->expects('isReleased')->times(2)->andReturn(false); $job->expects('isDeletedOrReleased')->andReturn(false); $job->expects('delete'); $command = $command = new CallQueuedHandlerTestJobWithMiddleware; $command->through([new TestJobMiddleware]); $instance->call($job, [ 'command' => serialize($command), ]); $this->assertInstanceOf(CallQueuedHandlerTestJobWithMiddleware::class, CallQueuedHandlerTestJobWithMiddleware::$middlewareCommand); $this->assertTrue(CallQueuedHandlerTestJobWithMiddleware::$handled); $this->assertTrue($_SERVER['__test.dispatchMiddleware']); } public function testJobIsMarkedAsFailedIfModelNotFoundExceptionIsThrown() { $instance = new CallQueuedHandler(new Dispatcher($this->app), $this->app); $job = Mockery::mock(Job::class); $job->expects('payload')->andReturn(['deleteWhenMissingModels' => false]); $job->expects('fail'); $instance->call($job, [ 'command' => serialize(new CallQueuedHandlerExceptionThrowerWithoutDelete), ]); } public function testJobIsDeletedIfHasDeleteProperty() { Event::fake(); $instance = new CallQueuedHandler(new Dispatcher($this->app), $this->app); $job = Mockery::mock(Job::class); $job->expects('payload')->andReturn(['deleteWhenMissingModels' => true]); $job->expects('resolveQueuedJobClass')->andReturn(CallQueuedHandlerExceptionThrower::class); $job->shouldReceive('markAsFailed')->never(); $job->expects('delete'); $job->shouldReceive('failed')->never(); $instance->call($job, [ 'command' => serialize(new CallQueuedHandlerExceptionThrower), ]); Event::assertNotDispatched(JobFailed::class); } public function testJobIsDeletedIfHasDeleteAttribute() { Event::fake(); $instance = new CallQueuedHandler(new Dispatcher($this->app), $this->app); $job = Mockery::mock(Job::class); $job->expects('payload')->andReturn(['deleteWhenMissingModels' => true]); $job->expects('resolveQueuedJobClass')->andReturn(CallQueuedHandlerAttributeExceptionThrower::class); $job->shouldReceive('markAsFailed')->never(); $job->expects('delete'); $job->shouldReceive('failed')->never(); $instance->call($job, [ 'command' => serialize(new CallQueuedHandlerAttributeExceptionThrower()), ]); Event::assertNotDispatched(JobFailed::class); } public function testBatchJobIsRecordedWhenDeletedDueToMissingModel() { Event::fake(); $instance = new CallQueuedHandler(new Dispatcher($this->app), $this->app); $batch = Mockery::mock(Batch::class); $batch->expects('recordSuccessfulJob')->with('job-uuid'); $repository = Mockery::mock(BatchRepository::class); $repository->expects('find')->with('test-batch-id')->andReturn($batch); $this->app->instance(BatchRepository::class, $repository); $serialized = serialize((new CallQueuedHandlerBatchableExceptionThrower)->withBatchId('test-batch-id')); $job = Mockery::mock(Job::class); $job->expects('resolveQueuedJobClass')->andReturn(CallQueuedHandlerBatchableExceptionThrower::class); $job->shouldReceive('markAsFailed')->never(); $job->expects('delete'); $job->shouldReceive('failed')->never(); $job->expects('uuid')->times(3)->andReturn('job-uuid'); $job->expects('payload')->times(2)->andReturn([ 'deleteWhenMissingModels' => true, 'data' => [ 'batchId' => 'test-batch-id', 'command' => $serialized, ], ]); $instance->call($job, [ 'command' => $serialized, ]); Event::assertNotDispatched(JobFailed::class); } } class CallQueuedHandlerTestJob { use InteractsWithQueue; public static $handled = false; public function handle() { static::$handled = true; } } /** This exists to test that middleware can also be defined in base classes */ abstract class AbstractCallQueuedHandlerTestJobWithMiddleware { public static $middlewareCommand; public function middleware() { return [ new class { public function handle($command, $next) { AbstractCallQueuedHandlerTestJobWithMiddleware::$middlewareCommand = $command; return $next($command); } }, ]; } } class CallQueuedHandlerTestJobWithMiddleware extends AbstractCallQueuedHandlerTestJobWithMiddleware { use InteractsWithQueue, Queueable; public static $handled = false; public function handle() { static::$handled = true; } } class CallQueuedHandlerExceptionThrower { public $deleteWhenMissingModels = true; public function handle() { // } public function __wakeup() { throw new ModelNotFoundException('Foo'); } } class CallQueuedHandlerExceptionThrowerWithoutDelete { public function handle() { // } public function __wakeup() { throw new ModelNotFoundException('Foo'); } } #[DeleteWhenMissingModels] class CallQueuedHandlerAttributeExceptionThrower { public function handle() { // } public function __wakeup() { throw new ModelNotFoundException('Foo'); } } #[DeleteWhenMissingModels] class CallQueuedHandlerBatchableExceptionThrower { use Batchable, InteractsWithQueue; public function handle() { // } public function __wakeup() { throw new ModelNotFoundException('Foo'); } } class TestJobMiddleware { public function handle($command, $next) { $_SERVER['__test.dispatchMiddleware'] = true; return $next($command); } }