Drupal modules for browsing and managing Fedora-based digital repositories.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

128 lines
3.8 KiB

<?php
namespace Drupal\Tests\islandora\Kernel;
use Stomp\Exception\StompException;
use Stomp\StatefulStomp;
use Drupal\islandora\Plugin\RulesAction\Broadcaster;
/**
* Broadcaster tests.
*
* @group islandora
* @coversDefaultClass \Drupal\islandora\Plugin\RulesAction\Broadcaster
*/
class BroadcasterTest extends IslandoraKernelTestBase {
protected $testQueue = 'islandora-broadcaster-test-queue';
/**
* Tests that the action does not WSOD Drupal when there's a StompException.
*
* @covers \Drupal\islandora\Plugin\RulesAction\Broadcaster::execute
*/
public function testExecuteSquashesStompExceptions() {
// Set up a fake Stomp client to throw a StompException when used.
$prophecy = $this->prophesize(StatefulStomp::CLASS);
$prophecy->begin()->willThrow(new StompException('STOMP EXCEPTION'));
$stomp = $prophecy->reveal();
$action = $this->createBroadcaster($stomp);
try {
// Execute the action.
$action->execute();
$this->assertTrue(TRUE, "The execute() method must squash StompExceptions.");
}
catch (\Exception $e) {
$this->assertTrue(FALSE, "The execute() method must squash StompExceptions.");
}
}
/**
* Tests that the action DOES NOT squash any other Exception.
*
* @covers \Drupal\islandora\Plugin\RulesAction\Broadcaster::execute
* @expectedException \Exception
*/
public function testExecuteDoesNotSquashOtherExceptions() {
// Set up a fake Stomp client to throw a non-StompException when used.
$prophecy = $this->prophesize(StatefulStomp::CLASS);
$prophecy->begin()->willThrow(new \Exception('NOT A STOMP EXCEPTION'));
$stomp = $prophecy->reveal();
$action = $this->createBroadcaster($stomp);
// This should throw an exception.
$action->execute();
}
/**
* Tests that the action publishes the message to be broadcast to a broker.
*
* @covers \Drupal\islandora\Plugin\RulesAction\Broadcaster::execute
*/
public function testBrokerIntegration() {
// Grab a legit stomp client, using values from config.
$this->installConfig('islandora');
$stomp = $this->container->get('islandora.stomp');
// Create and execute the action.
$action = $this->createBroadcaster($stomp);
$action->execute();
// Verify the message actually got sent.
try {
$stomp->subscribe($this->testQueue);
$msg = $stomp->read();
$this->assertTrue(
strcmp($msg->getBody(), 'test') == 0,
"Message body is not 'test'"
);
$headers = $msg->getHeaders();
$this->assertTrue(
strcmp($headers['IslandoraBroadcastRecipients'], 'activemq:queue:foo,activemq:queue:bar') == 0,
"IslandoraBroadcastRecipients header must be a comma separated list of endpoints"
);
$stomp->unsubscribe();
}
catch (StompException $e) {
$this->assertTrue(FALSE, "There was an error connecting to the stomp broker");
}
}
/**
* Utility function to create a broadcaster action from a Stomp prophecy.
*
* @param StatefulStomp $stomp
* Stomp instance or prophecy.
*
* @return \Drupal\islandora\Plugin\RulesAction\Broadcaster
* Broadcaster, ready to test.
*/
protected function createBroadcaster(StatefulStomp $stomp) {
// Pull the plugin definition out of the plugin system.
$actionManager = $this->container->get('plugin.manager.rules_action');
$definitions = $actionManager->getDefinitions();
$pluginDefinition = $definitions['islandora_broadcast'];
$action = new Broadcaster(
[],
'islandora_broadcast',
$pluginDefinition,
$this->testQueue,
$stomp
);
// Set the required contexts for the action to run.
$action->setContextValue('message', "test");
$action->setContextValue('recipients', ['activemq:queue:foo', 'activemq:queue:bar']);
return $action;
}
}