From 13b30d9fd6762ebfe15fdfb98529b13ec101f9b6 Mon Sep 17 00:00:00 2001 From: Eileen McNaughton Date: Wed, 9 Aug 2023 16:52:36 +1200 Subject: [PATCH] Add queue runner test --- CRM/Queue/Runner.php | 2 +- tests/phpunit/CRM/Queue/RunnerTest.php | 34 +++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/CRM/Queue/Runner.php b/CRM/Queue/Runner.php index 33359009b4..f89e319127 100644 --- a/CRM/Queue/Runner.php +++ b/CRM/Queue/Runner.php @@ -214,7 +214,6 @@ class CRM_Queue_Runner { if ($taskResult['numberOfItems'] === 0) { $result = $this->handleEnd(); - $this->enableBackgroundExecution(); if (!empty($result['redirect_url'])) { CRM_Utils_System::redirect($result['redirect_url']); } @@ -353,6 +352,7 @@ class CRM_Queue_Runner { if (!empty($this->onEndUrl)) { $result['redirect_url'] = $this->onEndUrl; } + $this->enableBackgroundExecution(); return $result; } diff --git a/tests/phpunit/CRM/Queue/RunnerTest.php b/tests/phpunit/CRM/Queue/RunnerTest.php index 20c538bae0..aa151910d8 100644 --- a/tests/phpunit/CRM/Queue/RunnerTest.php +++ b/tests/phpunit/CRM/Queue/RunnerTest.php @@ -49,7 +49,15 @@ class CRM_Queue_RunnerTest extends CiviUnitTestCase { parent::tearDown(); } - public function testRunAllNormal() { + /** + * Test that the queue is not left in a state where another run causes an exception. + */ + public function testRunAllTwice(): void { + $this->runAQueue(); + $this->runAQueue(); + } + + public function testRunAllNormal(): void { // prepare a list of tasks with an error in the middle $this->queue->createItem(new CRM_Queue_Task( ['CRM_Queue_RunnerTest', '_recordValue'], @@ -284,4 +292,28 @@ class CRM_Queue_RunnerTest extends CiviUnitTestCase { return TRUE; } + protected function runAQueue(): void { + $this->queueService = CRM_Queue_Service::singleton(TRUE); + $queueName = 'seeing-double'; + $queue = \Civi::queue($queueName, [ + 'type' => 'Sql', + 'runner' => 'task', + 'retry_limit' => 3, + 'retry_interval' => 20, + 'error' => 'abort', + ]); + // prepare a list of tasks with an error in the middle + $queue->createItem(new CRM_Queue_Task( + ['CRM_Queue_RunnerTest', '_recordValue'], + ['a'], + 'Add "a"' + )); + // run the list of tasks + $runner = new CRM_Queue_Runner([ + 'queue' => $queue, + 'errorMode' => CRM_Queue_Runner::ERROR_ABORT, + ]); + $runner->runAll(); + } + } -- 2.25.1