From 41de0c7037792e22b89ab10ed80285876ccf51f0 Mon Sep 17 00:00:00 2001 From: Stephen Odoardi Date: Tue, 6 Apr 2021 19:20:04 +0200 Subject: [PATCH 1/5] fix(2228): added transaction free deleteAndRelease() Method --- src/Jenssegers/Mongodb/Queue/MongoQueue.php | 9 +++++++++ tests/QueueTest.php | 16 ++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/Jenssegers/Mongodb/Queue/MongoQueue.php b/src/Jenssegers/Mongodb/Queue/MongoQueue.php index 369ef6b72..f1568b4b4 100644 --- a/src/Jenssegers/Mongodb/Queue/MongoQueue.php +++ b/src/Jenssegers/Mongodb/Queue/MongoQueue.php @@ -131,4 +131,13 @@ public function deleteReserved($queue, $id) { $this->database->collection($this->table)->where('_id', $id)->delete(); } + + /** + * @inheritdoc + */ + public function deleteAndRelease($queue, $job, $delay) + { + $this->deleteReserved($queue, $job->getJobId()); + $this->release($queue, $job->getJobRecord(), $delay); + } } diff --git a/tests/QueueTest.php b/tests/QueueTest.php index 5b07c9492..7d690b5ba 100644 --- a/tests/QueueTest.php +++ b/tests/QueueTest.php @@ -103,4 +103,20 @@ public function testIncrementAttempts(): void $this->assertCount(1, $others_jobs); $this->assertEquals(0, $others_jobs[0]['attempts']); } + + public function testReleaseJob(): void + { + $job_id = Queue::push('test', ['action' => 'QueueJobExpired'], 'test'); + $this->assertNotNull($job_id); + + $job = Queue::pop('test'); + $job->release(); + + $jobs = Queue::getDatabase() + ->table(Config::get('queue.connections.database.table')) + ->get(); + + $this->assertCount(1, $jobs); + $this->assertEquals(1, $jobs[0]['attempts']); + } } From 5e2fe1bbbe144d826f86d21c7ae64784f3c92778 Mon Sep 17 00:00:00 2001 From: Stephen Odoardi Date: Sun, 2 May 2021 08:37:46 +0200 Subject: [PATCH 2/5] fix(2228): added test for queue deleteAndRelease Method --- tests/QueueTest.php | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/tests/QueueTest.php b/tests/QueueTest.php index 7d690b5ba..f8cdd3370 100644 --- a/tests/QueueTest.php +++ b/tests/QueueTest.php @@ -104,7 +104,7 @@ public function testIncrementAttempts(): void $this->assertEquals(0, $others_jobs[0]['attempts']); } - public function testReleaseJob(): void + public function testJobRelease(): void { $job_id = Queue::push('test', ['action' => 'QueueJobExpired'], 'test'); $this->assertNotNull($job_id); @@ -118,5 +118,23 @@ public function testReleaseJob(): void $this->assertCount(1, $jobs); $this->assertEquals(1, $jobs[0]['attempts']); + $this->assertNotEquals($job_id, $jobs[0]['_id']); + } + + public function testQueueDeleteAndRelease(): void + { + $queue = 'test'; + $job_id = Queue::push($queue, ['action' => 'QueueJobExpired'], 'test'); + + $job = Queue::pop('test'); + Queue::deleteAndRelease($queue, $job, 0); + + $jobs = Queue::getDatabase() + ->table(Config::get('queue.connections.database.table')) + ->get(); + + $this->assertCount(1, $jobs); + $this->assertEquals(1, $jobs[0]['attempts']); + $this->assertNotEquals($job_id, $jobs[0]['_id']); } } From 14d998b19ffe5397cf9a64d59fb731d9e301d2dc Mon Sep 17 00:00:00 2001 From: Stephen Odoardi Date: Sun, 2 May 2021 08:49:11 +0200 Subject: [PATCH 3/5] fix(2228): style fix --- tests/QueueTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/QueueTest.php b/tests/QueueTest.php index f8cdd3370..281429360 100644 --- a/tests/QueueTest.php +++ b/tests/QueueTest.php @@ -1,4 +1,5 @@ 'QueueJobExpired'], 'test'); - + $job = Queue::pop('test'); Queue::deleteAndRelease($queue, $job, 0); From 2ea0d427a7b29ff910921c2078cb420d8975aa6b Mon Sep 17 00:00:00 2001 From: Stephen Odoardi Date: Sun, 2 May 2021 09:38:16 +0200 Subject: [PATCH 4/5] fix(2228): restructure queue tests --- docker-compose.yml | 1 + tests/QueueTest.php | 59 ++++++++++++++++++++++++++++++++++++--------- 2 files changed, 49 insertions(+), 11 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index ec612f1fe..ecc5ede62 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,6 +12,7 @@ services: depends_on: - mongodb - mysql + command: vendor/bin/phpunit mysql: container_name: mysql diff --git a/tests/QueueTest.php b/tests/QueueTest.php index 281429360..aa01d0791 100644 --- a/tests/QueueTest.php +++ b/tests/QueueTest.php @@ -5,6 +5,7 @@ use Carbon\Carbon; use Illuminate\Support\Str; use Jenssegers\Mongodb\Queue\Failed\MongoFailedJobProvider; +use Jenssegers\Mongodb\Queue\MongoQueue; class QueueTest extends TestCase { @@ -107,10 +108,11 @@ public function testIncrementAttempts(): void public function testJobRelease(): void { - $job_id = Queue::push('test', ['action' => 'QueueJobExpired'], 'test'); + $queue = 'test'; + $job_id = Queue::push($queue, ['action' => 'QueueJobRelease'], 'test'); $this->assertNotNull($job_id); - $job = Queue::pop('test'); + $job = Queue::pop($queue); $job->release(); $jobs = Queue::getDatabase() @@ -119,23 +121,58 @@ public function testJobRelease(): void $this->assertCount(1, $jobs); $this->assertEquals(1, $jobs[0]['attempts']); - $this->assertNotEquals($job_id, $jobs[0]['_id']); } - public function testQueueDeleteAndRelease(): void + public function testQueueDeleteReserved(): void { $queue = 'test'; - $job_id = Queue::push($queue, ['action' => 'QueueJobExpired'], 'test'); - - $job = Queue::pop('test'); - Queue::deleteAndRelease($queue, $job, 0); + $job_id = Queue::push($queue, ['action' => 'QueueDeleteReserved'], 'test'); + Queue::deleteReserved($queue, $job_id, 0); $jobs = Queue::getDatabase() ->table(Config::get('queue.connections.database.table')) ->get(); - $this->assertCount(1, $jobs); - $this->assertEquals(1, $jobs[0]['attempts']); - $this->assertNotEquals($job_id, $jobs[0]['_id']); + $this->assertCount(0, $jobs); + } + + public function testQueueRelease(): void + { + Carbon::setTestNow(); + $queue = 'test'; + $delay = 123; + Queue::push($queue, ['action' => 'QueueRelease'], 'test'); + + $job = Queue::pop($queue); + $released_job_id = Queue::release($queue, $job->getJobRecord(), $delay); + + $released_job = Queue::getDatabase() + ->table(Config::get('queue.connections.database.table')) + ->where('_id', $released_job_id) + ->first(); + + $this->assertEquals($queue, $released_job['queue']); + $this->assertEquals(1, $released_job['attempts']); + $this->assertNull($released_job['reserved_at']); + $this->assertEquals( + Carbon::now()->addRealSeconds($delay)->getTimestamp(), + $released_job['available_at'] + ); + $this->assertEquals(Carbon::now()->getTimestamp(), $released_job['created_at']); + $this->assertEquals($job->getRawBody(), $released_job['payload']); + } + + public function testQueueDeleteAndRelease(): void + { + $queue = 'test'; + $delay = 123; + Queue::push($queue, ['action' => 'QueueDeleteAndRelease'], 'test'); + $job = Queue::pop($queue); + + $mock = Mockery::mock(MongoQueue::class)->makePartial(); + $mock->expects('deleteReserved')->once()->with($queue, $job->getJobId()); + $mock->expects('release')->once()->with($queue, $job->getJobRecord(), $delay); + + $mock->deleteAndRelease($queue, $job, $delay); } } From f89159af6faad79e81891ff72b523b7a7cd5d692 Mon Sep 17 00:00:00 2001 From: Stephen Odoardi Date: Sun, 2 May 2021 09:45:23 +0200 Subject: [PATCH 5/5] fix(2228): revert docker-compose change --- docker-compose.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index ecc5ede62..ec612f1fe 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,7 +12,6 @@ services: depends_on: - mongodb - mysql - command: vendor/bin/phpunit mysql: container_name: mysql