Civi::queue(string $name) - Add facade to load queue by name. Add test.
authorTim Otten <totten@civicrm.org>
Sat, 29 Jan 2022 06:35:30 +0000 (22:35 -0800)
committerTim Otten <totten@civicrm.org>
Tue, 1 Feb 2022 01:15:17 +0000 (17:15 -0800)
The test includes coverage for a couple flows - eg creating the queue
via traditional `CRM_Queue_Service` or with the newer Civi\Api4\Queue.

Civi.php
tests/phpunit/CRM/Queue/QueueTest.php

index 9e4b8dcbfd764a9e0243b80c7a0e54484d88ca19..d081572f992e8bde77fab68f07e5151b255b43e6 100644 (file)
--- a/Civi.php
+++ b/Civi.php
@@ -105,6 +105,23 @@ class Civi {
     return \Civi\Core\Container::getBootService('paths');
   }
 
+  /**
+   * Fetch a queue object.
+   *
+   * @param string $name
+   *   Name of the queue.
+   *   The queue must be persistent (stored in `civicrm_queue`).
+   * @return \CRM_Queue_Queue
+   * @see \CRM_Queue_Service
+   */
+  public static function queue(string $name): CRM_Queue_Queue {
+    return CRM_Queue_Service::singleton()->create([
+      'name' => $name,
+      'reset' => FALSE,
+      'is_persistent' => TRUE,
+    ]);
+  }
+
   /**
    * Obtain the formatting object.
    *
index 8a9f25dcb95e861c303549d3800f17e568f97282..c4b37644b387e94f7f9f7ad83a877910bfbb2ba2 100644 (file)
@@ -207,6 +207,54 @@ class CRM_Queue_QueueTest extends CiviUnitTestCase {
     $this->assertEquals(0, $this->queue->numberOfItems());
   }
 
+  /**
+   * Create a persistent queue via CRM_Queue_Service. Get a queue object with Civi::queue().
+   *
+   * @dataProvider getQueueSpecs
+   * @param $queueSpec
+   */
+  public function testPersistentUsage_service($queueSpec) {
+    $this->assertTrue(!empty($queueSpec['name']));
+    $this->assertTrue(!empty($queueSpec['type']));
+
+    $this->assertDBQuery(0, 'SELECT count(*) FROM civicrm_queue');
+    $q1 = CRM_Queue_Service::singleton()->create($queueSpec + [
+      'is_persistent' => TRUE,
+    ]);
+    $this->assertDBQuery(1, 'SELECT count(*) FROM civicrm_queue');
+
+    $q2 = Civi::queue($queueSpec['name']);
+    $this->assertInstanceOf('CRM_Queue_Queue_' . $queueSpec['type'], $q2);
+    $this->assertTrue($q1 === $q2);
+  }
+
+  /**
+   * Create a persistent queue via APIv4. Get a queue object with Civi::queue().
+   *
+   * @dataProvider getQueueSpecs
+   * @param $queueSpec
+   */
+  public function testPersistentUsage_api4($queueSpec) {
+    $this->assertTrue(!empty($queueSpec['name']));
+    $this->assertTrue(!empty($queueSpec['type']));
+
+    \Civi\Api4\Queue::create(0)
+      ->setValues($queueSpec)
+      ->execute();
+
+    $q1 = Civi::queue($queueSpec['name']);
+    $this->assertInstanceOf('CRM_Queue_Queue_' . $queueSpec['type'], $q1);
+
+    if ($queueSpec['type'] !== 'Memory') {
+      CRM_Queue_Service::singleton(TRUE);
+      $q2 = CRM_Queue_Service::singleton()->load([
+        'name' => $queueSpec['name'],
+        'is_persistent' => TRUE,
+      ]);
+      $this->assertInstanceOf('CRM_Queue_Queue_' . $queueSpec['type'], $q1);
+    }
+  }
+
   /**
    * Test that queue content is reset when reset=>TRUE
    *