Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 7 |
CRAP | |
0.00% |
0 / 64 |
AMQP | |
0.00% |
0 / 1 |
|
0.00% |
0 / 7 |
380 | |
0.00% |
0 / 64 |
_initialize() | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 13 |
|||
_before(\Codeception\TestCase $test) | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 6 |
|||
pushToExchange($exchange, $message) | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 7 |
|||
pushToQueue($queue, $message) | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 8 |
|||
seeMessageInQueueContainsText($queue, $text) | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 8 |
|||
grabMessageFromQueue($queue) | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 5 |
|||
cleanup() | |
0.00% |
0 / 1 |
56 | |
0.00% |
0 / 17 |
<?php | |
namespace Codeception\Module; | |
use Codeception\Exception\Module as ModuleException; | |
use Exception; | |
use PhpAmqpLib\Message\AMQPMessage; | |
use PhpAmqpLib\Connection\AMQPConnection; | |
use PhpAmqpLib\Channel\AMQPChannel; | |
use PhpAmqpLib\Exception\AMQPChannelException; | |
/** | |
* This module interacts with message broker software that implements | |
* the Advanced Message Queuing Protocol (AMQP) standard. For example, RabbitMQ (tested). | |
* Use it to cleanup the queue between tests. | |
* | |
* ## Status | |
* * Maintainer: **davert**, **tiger-seo** | |
* * Stability: **alpha** | |
* * Contact: codecept@davert.mail.ua | |
* * Contact: tiger.seo@gmail.com | |
* | |
* *Please review the code of non-stable modules and provide patches if you have issues.* | |
* | |
* ## Config | |
* | |
* * host: localhost - host to connect | |
* * username: guest - username to connect | |
* * password: guest - password to connect | |
* * vhost: '/' - vhost to connect | |
* * cleanup: true - defined queues will be purged before running every test. | |
* * queues: [mail, twitter] - queues to cleanup | |
* | |
* ### Example | |
* | |
* modules: | |
* enabled: [AMQP] | |
* config: | |
* AMQP: | |
* host: 'localhost' | |
* port: '5672' | |
* username: 'guest' | |
* password: 'guest' | |
* vhost: '/' | |
* queues: [queue1, queue2] | |
* | |
* ## Public Properties | |
* | |
* * connection - AMQPConnection - current connection | |
* | |
* @since 1.1.2 | |
* @author tiger.seo@gmail.com | |
* @author davert | |
*/ | |
class AMQP extends \Codeception\Module | |
{ | |
protected $config = array( | |
'host' => 'locahost', | |
'username' => 'guest', | |
'password' => 'guest', | |
'port' => '5672', | |
'vhost' => '/', | |
'cleanup' => true, | |
); | |
/** | |
* @var AMQPConnection | |
*/ | |
public $connection; | |
/** | |
* @var AMQPChannel | |
*/ | |
protected $channel; | |
protected $requiredFields = array('host', 'username', 'password', 'vhost'); | |
public function _initialize() | |
{ | |
$host = $this->config['host']; | |
$port = $this->config['port']; | |
$username = $this->config['username']; | |
$password = $this->config['password']; | |
$vhost = $this->config['vhost']; | |
try { | |
$this->connection = new AMQPConnection($host, $port, $username, $password, $vhost); | |
} catch (\Exception $e) { | |
throw new ModuleException(__CLASS__, $e->getMessage() . ' while establishing connection to MQ server'); | |
} | |
} | |
public function _before(\Codeception\TestCase $test) | |
{ | |
if ($this->config['cleanup']) { | |
$this->cleanup(); | |
} | |
} | |
/** | |
* Sends message to exchange | |
* | |
* ``` php | |
* <?php | |
* $I->pushToExchange('exchange.emails', 'thanks'); | |
* $I->pushToExchange('exchange.emails', new AMQPMessage('Thanks!')); | |
* ?> | |
* ``` | |
* | |
* @param $exchange | |
* @param $message string|AMQPMessage | |
*/ | |
public function pushToExchange($exchange, $message) | |
{ | |
$message = $message instanceof AMQPMessage | |
? $message | |
: new AMQPMessage($message); | |
$this->connection->channel()->basic_publish($message, $exchange); | |
} | |
/** | |
* Sends message to queue | |
* | |
* ``` php | |
* <?php | |
* $I->pushToQueue('queue.jobs', 'create user'); | |
* $I->pushToQueue('queue.jobs', new AMQPMessage('create')); | |
* ?> | |
* ``` | |
* | |
* @param $queue | |
* @param $message string|AMQPMessage | |
*/ | |
public function pushToQueue($queue, $message) | |
{ | |
$message = $message instanceof AMQPMessage | |
? $message | |
: new AMQPMessage($message); | |
$this->connection->channel()->queue_declare($queue); | |
$this->connection->channel()->basic_publish($message, '',$queue); | |
} | |
/** | |
* Checks if message containing text received. | |
* | |
* **This method drops message from queue** | |
* **This method will wait for message. If none is sent the script will stuck**. | |
* | |
* ``` php | |
* <?php | |
* $I->pushToQueue('queue.emails', 'Hello, davert'); | |
* $I->seeMessageInQueueContainsText('queue.emails','davert'); | |
* ?> | |
* ``` | |
* | |
* @param $queue | |
* @param $text | |
*/ | |
public function seeMessageInQueueContainsText($queue, $text) | |
{ | |
$msg = $this->connection->channel()->basic_get($queue); | |
if (!$msg) $this->fail("Message was not received"); | |
if (!$msg instanceof AMQPMessage) $this->fail("Received message is not format of AMQPMessage"); | |
$this->debugSection("Message",$msg->body); | |
$this->assertContains($text, $msg->body); | |
} | |
/** | |
* Takes last message from queue. | |
* | |
* $message = $I->grabMessageFromQueue('queue.emails'); | |
* | |
* @param $queue | |
* @return AMQPMessage | |
*/ | |
public function grabMessageFromQueue($queue) | |
{ | |
$message = $this->connection->channel()->basic_get($queue); | |
return $message; | |
} | |
protected function cleanup() | |
{ | |
if (! isset($this->config['queues'])) { | |
throw new ModuleException(__CLASS__, "please set queues for cleanup"); | |
} | |
if (!$this->connection) return; | |
if ($this->connection->channel()->is_open) return; | |
foreach ($this->config['queues'] as $queue) { | |
try { | |
$this->connection->channel()->queue_purge($queue); | |
} catch (\PhpAmqpLib\Exception\AMQPProtocolChannelException $e) { | |
# ignore if exchange/queue doesn't exist and rethrow exception if it's something else | |
if ($e->getCode() !== 404) { | |
throw $e; | |
} | |
} | |
} | |
} |