From 6588aad6cd2d674426af018c80b31fe5051a3279 Mon Sep 17 00:00:00 2001 From: Adrian Date: Sat, 9 Dec 2023 09:01:24 +0200 Subject: [PATCH 1/2] Added testChainBatchUniqueJobsFireOnlyOnce Testing if a unique job that is chained multiple times only triggers once --- tests/Integration/Queue/JobChainingTest.php | 32 +++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tests/Integration/Queue/JobChainingTest.php b/tests/Integration/Queue/JobChainingTest.php index 9dec15912fbd..0e5cdfbc1680 100644 --- a/tests/Integration/Queue/JobChainingTest.php +++ b/tests/Integration/Queue/JobChainingTest.php @@ -4,6 +4,7 @@ use Illuminate\Bus\Batchable; use Illuminate\Bus\Queueable; +use Illuminate\Contracts\Queue\ShouldBeUnique; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Foundation\Testing\DatabaseMigrations; @@ -387,6 +388,18 @@ public function testChainBatchFailureNotAllowed() $this->assertEquals(['c1', 'c2', 'b1', 'b3'], JobRunRecorder::$results); $this->assertEquals(['batch failed', 'chain failed'], JobRunRecorder::$failures); } + + public function testChainBatchUniqueJobsFireOnlyOnce() + { + Bus::chain([ + new JobChainingTestUniqueJob('c1'), + new JobChainingTestUniqueJob('c2'), + new JobChainingTestUniqueJob('c3'), + new JobChainingTestUniqueJob('c4'), + ])->dispatch(); + + $this->assertEquals(['c1'], JobRunRecorder::$results); + } } class JobChainingTestFirstJob implements ShouldQueue @@ -584,6 +597,25 @@ public function handle() } } +class JobChainingTestUniqueJob implements ShouldBeUnique +{ + use Dispatchable, InteractsWithQueue, Queueable; + + public static $results = []; + + public string $id; + + public function __construct(string $id) + { + $this->id = $id; + } + + public function handle() + { + JobRunRecorder::record($this->id); + } +} + class JobRunRecorder { public static $results = []; From bfd4a543708c8abe67dea419721c668cb939f5bc Mon Sep 17 00:00:00 2001 From: Adrian Date: Sat, 9 Dec 2023 17:32:51 +0200 Subject: [PATCH 2/2] Refactoring `firesOnlyOnce`-> `firesAtLeastOnce` --- tests/Integration/Queue/JobChainingTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Integration/Queue/JobChainingTest.php b/tests/Integration/Queue/JobChainingTest.php index 0e5cdfbc1680..a278dd4c8bf9 100644 --- a/tests/Integration/Queue/JobChainingTest.php +++ b/tests/Integration/Queue/JobChainingTest.php @@ -389,7 +389,7 @@ public function testChainBatchFailureNotAllowed() $this->assertEquals(['batch failed', 'chain failed'], JobRunRecorder::$failures); } - public function testChainBatchUniqueJobsFireOnlyOnce() + public function testChainBatchUniqueJobFiresAtLeastOnce() { Bus::chain([ new JobChainingTestUniqueJob('c1'),