X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=vendor%2Fdrush%2Fdrush%2Ftests%2FqueueTest.php;fp=vendor%2Fdrush%2Fdrush%2Ftests%2FqueueTest.php;h=1e2fdb4737fba4dd67353b490dff349988f69b3e;hp=0000000000000000000000000000000000000000;hb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;hpb=57c063afa3f66b07c4bbddc2d6129a96d90f0aad diff --git a/vendor/drush/drush/tests/queueTest.php b/vendor/drush/drush/tests/queueTest.php new file mode 100644 index 000000000..1e2fdb473 --- /dev/null +++ b/vendor/drush/drush/tests/queueTest.php @@ -0,0 +1,113 @@ +markTestSkipped("Queue API not available in Drupal 6."); + } + + if (UNISH_DRUPAL_MAJOR_VERSION == 7) { + $expected = 'aggregator_feeds,%items,SystemQueue'; + } + else { + $expected = 'aggregator_feeds,%items,Drupal\Core\Queue\DatabaseQueue'; + } + + $sites = $this->setUpDrupal(1, TRUE); + $options = array( + 'yes' => NULL, + 'root' => $this->webroot(), + 'uri' => key($sites), + ); + + // Enable aggregator since it declares a queue. + $this->drush('pm-enable', array('aggregator'), $options); + + $this->drush('queue-list', array(), $options); + $output = $this->getOutput(); + $this->assertContains('aggregator_feeds', $output, 'Queue list shows the declared queue.'); + + $this->drush('php-script', array('queue_script-D' . UNISH_DRUPAL_MAJOR_VERSION), $options + array('script-path' => dirname(__FILE__) . '/resources')); + $this->drush('queue-list', array(), $options + array('pipe' => TRUE)); + $output = trim($this->getOutput()); + $parts = explode(",", $output); + $this->assertEquals(str_replace('%items', 1, $expected), $output, 'Item was successfully added to the queue.'); + $output = $this->getOutput(); + + $this->drush('queue-run', array('aggregator_feeds'), $options); + $this->drush('queue-list', array(), $options + array('pipe' => TRUE)); + $output = trim($this->getOutput()); + $parts = explode(",", $output); + $this->assertEquals(str_replace('%items', 0, $expected), $output, 'Queue item processed.'); + } + + /** + * Tests the RequeueException. + */ + public function testRequeueException() { + if (UNISH_DRUPAL_MAJOR_VERSION < 8) { + $this->markTestSkipped("RequeueException only available in Drupal 8."); + } + + $sites = $this->setUpDrupal(1, TRUE); + $options = array( + 'yes' => NULL, + 'root' => $this->webroot(), + 'uri' => key($sites), + ); + + // Copy the 'woot' module over to the Drupal site we just set up. + $this->setupModulesForTests($this->webroot()); + + // Enable woot module, which contains a queue worker that throws a + // RequeueException. + $this->drush('pm-enable', array('woot'), $options, NULL, NULL, self::EXIT_SUCCESS); + + // Add an item to the queue. + $this->drush('php-script', array('requeue_script'), $options + array('script-path' => dirname(__FILE__) . '/resources')); + + // Check that the queue exists and it has one item in it. + $expected = 'woot_requeue_exception,%items,Drupal\Core\Queue\DatabaseQueue'; + $this->drush('queue-list', array(), $options + array('pipe' => TRUE)); + $output = trim($this->getOutput()); + $this->assertEquals(str_replace('%items', 1, $expected), $output, 'Item was successfully added to the queue.'); + + // Process the queue. + $this->drush('queue-run', array('woot_requeue_exception'), $options); + + // Check that the item was processed after being requeued once. + // Here is the detailed workflow of what the above command did. + // 1. Drush calls drush queue-run woot_requeue_exception. + // 2. Drush claims the item. The worker sets a state variable (see below) + // and throws the RequeueException. + // 3. Drush catches the exception and puts it back in the queue. + // 4. Drush claims the next item, which is the one that we just requeued. + // 5. The worker finds the state variable, so it does not throw the + // RequeueException this time (see below). + // 6. Drush removes the item from the queue. + // 7. Command finishes. The queue is empty. + $this->drush('queue-list', array(), $options + array('pipe' => TRUE)); + $output = trim($this->getOutput()); + $this->assertEquals(str_replace('%items', 0, $expected), $output, 'Queue item processed after being requeued.'); + } + + /** + * Copies the woot module into Drupal. + * + * @param string $root + * The path to the root directory of Drupal. + */ + public function setupModulesForTests($root) { + $wootModule = __DIR__ . '/resources/modules/d' . UNISH_DRUPAL_MAJOR_VERSION . '/woot'; + $modulesDir = "$root/sites/all/modules"; + $this->mkdir($modulesDir); + \symlink($wootModule, "$modulesDir/woot"); + } + +}