From e34aa7e5f63b6faf3276f053f0eaa6cb50b03d1e Mon Sep 17 00:00:00 2001 From: joskfg Date: Tue, 25 Jan 2022 13:44:36 +0100 Subject: [PATCH] Fix failed jobs when produces for a listener closure (#83) --- src/Queue/Jobs/Job.php | 7 +++++-- tests/Queue/Jobs/JobTest.php | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/Queue/Jobs/Job.php b/src/Queue/Jobs/Job.php index e707d31..f23ad74 100644 --- a/src/Queue/Jobs/Job.php +++ b/src/Queue/Jobs/Job.php @@ -71,7 +71,10 @@ public function failed($e): void { $this->markAsFailed(); - if (method_exists($listener = $this->resolve($this->listenerClass), 'failed')) { + if ( + $this->listenerClass !== \Closure::class + && method_exists($listener = $this->resolve($this->listenerClass), 'failed') + ) { $listener->failed($this->payload(), $e); } } @@ -113,7 +116,7 @@ public function displayName(): string { return $this->getName(); } - + /** * Get the timestamp indicating when the job should timeout. */ diff --git a/tests/Queue/Jobs/JobTest.php b/tests/Queue/Jobs/JobTest.php index 7c7bb8f..4414691 100644 --- a/tests/Queue/Jobs/JobTest.php +++ b/tests/Queue/Jobs/JobTest.php @@ -97,6 +97,25 @@ public function testFailing() self::assertEquals($message->getBody(), $listener->payload); } + public function testFailingClosure() + { + $exception = new \Exception("Exception in `fire` method"); + + $app = new Container(); + $message = $this->getMessage(); + + $queueManager = m::spy(Manager::class); + + $job = new Job($app, $queueManager, $message, + 'trim', + \Closure::class + ); + + $job->failed($exception); + + self::assertTrue($job->hasFailed()); + } + public function testGetJobId() { $job = $this->getJob();