Skip to content

Commit 0bfcae7

Browse files
author
Davert
committed
amqp module improvied
1 parent d07d919 commit 0bfcae7

1 file changed

Lines changed: 97 additions & 17 deletions

File tree

‎src/Codeception/Module/AMQP.php‎

Lines changed: 97 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,36 +3,53 @@
33
namespace Codeception\Module;
44

55
use Codeception\Exception\Module as ModuleException;
6+
use PhpAmqpLib\Message\AMQPMessage;
67
use PhpAmqpLib\Connection\AMQPConnection;
8+
use PhpAmqpLib\Channel\AMQPChannel;
79
use PhpAmqpLib\Exception\AMQPChannelException;
810

911
/**
1012
* This module interacts with message broker software that implements
11-
* the Advanced Message Queuing Protocol (AMQP) standard. For example, RabbitMQ.
13+
* the Advanced Message Queuing Protocol (AMQP) standard. For example, RabbitMQ (tested).
1214
* Use it to cleanup the queue between tests.
1315
*
1416
* ## Config
1517
*
18+
* * host: localhost - host to connect
19+
* * username: guest - username to connect
20+
* * password: guest - password to connect
21+
* * vhost: '/' - vhost to connect
1622
* * cleanup: true - defined queues will be purged before running every test.
23+
* * queues: [mail, twitter] - queues to cleanup
1724
*
18-
* ## Other
25+
* ## Public Properties
26+
*
27+
* * connection - AMQPConnection - current connection
28+
* * channel - AMQPChannel - current channel
1929
*
2030
* @since 1.1.2
2131
* @author tiger.seo@gmail.com
2232
*/
2333
class AMQP extends \Codeception\Module
2434
{
25-
const DEFAULT_PORT = 5672;
26-
2735
protected $config = array(
36+
'host' => 'locahost',
37+
'username' => 'guest',
38+
'password' => 'guest',
39+
'port' => '5672',
40+
'vhost' => '/',
2841
'cleanup' => true,
29-
'port' => self::DEFAULT_PORT
3042
);
3143

3244
/**
3345
* @var AMQPConnection
3446
*/
35-
protected $_connection;
47+
public $connection;
48+
49+
/**
50+
* @var AMQPChannel
51+
*/
52+
protected $channel;
3653

3754
protected $requiredFields = array('host', 'username', 'password', 'vhost');
3855

@@ -45,38 +62,101 @@ public function _initialize()
4562
$vhost = $this->config['vhost'];
4663

4764
try {
48-
$this->_connection = new AMQPConnection($host, $port, $username, $password, $vhost);
65+
$this->connection = new AMQPConnection($host, $port, $username, $password, $vhost);
4966
} catch (\Exception $e) {
5067
throw new ModuleException(__CLASS__, $e->getMessage() . ' while establishing connection to MQ server');
5168
}
69+
$this->channel = $this->connection->channel();
5270
}
5371

5472
public function _before(\Codeception\TestCase $test)
5573
{
5674
if ($this->config['cleanup']) {
5775
$this->cleanup();
5876
}
59-
parent::_before($test);
6077
}
6178

6279
/**
63-
* Cleans up queue.
80+
* Sends message to exchange
81+
*
82+
* ``` php
83+
* <?php
84+
* $I->pushToExchange('exchange.emails', 'thanks');
85+
* $I->pushToExchange('exchange.emails', new AMQPMessage('Thanks!'));
86+
* ?>
87+
* ```
88+
*
89+
* @param $exchange
90+
* @param $message string|AMQPMessage
91+
*/
92+
public function pushToExchange($exchange, $message)
93+
{
94+
$message = $message instanceof AMQPMessage
95+
? $message
96+
: new AMQPMessage($message);
97+
$this->channel->basic_publish($message, $exchange);
98+
}
99+
100+
/**
101+
* Sends message to queue
102+
*
103+
* ``` php
104+
* <?php
105+
* $I->pushToQueue('queue.jobs', 'create user');
106+
* $I->pushToQueue('queue.jobs', new AMQPMessage('create'));
107+
* ?>
108+
* ```
109+
*
110+
* @param $queue
111+
* @param $message string|AMQPMessage
64112
*/
65-
public function cleanupAMQP() {
66-
$this->cleanup();
113+
public function pushToQueue($queue, $message)
114+
{
115+
$message = $message instanceof AMQPMessage
116+
? $message
117+
: new AMQPMessage($message);
118+
119+
$this->channel->basic_publish(new AMQPMessage($message), '',$queue);
120+
}
121+
122+
/**
123+
* Checks if message containing text received.
124+
*
125+
* **This method drops message from queue**
126+
* **This method will wait for message. If none is sent the script will stuck**.
127+
* **Purges queue in the end**
128+
*
129+
* ``` php
130+
* <?php
131+
* $I->pushToQueue('queue.emails', 'Hello, davert');
132+
* $I->seeMessageInQueue('queue.emails','davert');
133+
* ?>
134+
* ```
135+
*
136+
* @param $queue
137+
* @param $message
138+
*/
139+
public function seeMessageInQueue($queue, $message)
140+
{
141+
$this->channel->basic_consume($queue, '', false, false, false, false, function (AMQPMessage $msg) use ($message) {
142+
\PHPUnit_Framework_Assert::assertContains($message, $msg->body);
143+
});
144+
$this->debug("waiting for messages in queue '$queue''");
145+
$this->channel->wait();
146+
$this->channel->queue_purge($queue);
67147
}
68148

69149
protected function cleanup()
70150
{
71-
if (! isset($this->config['routes'])) {
72-
return;
151+
if (! isset($this->config['queues'])) {
152+
throw new ModuleException(__CLASS__, "please set queues for cleanup");
73153
}
74154

75-
$channel = $this->_connection->channel(1);
76-
77-
foreach ($this->config['routes'] as $route) {
155+
$channel = $this->channel;
156+
157+
foreach ($this->config['queues'] as $queue) {
78158
try {
79-
$channel->queue_purge($route['queue']);
159+
$channel->queue_purge($queue);
80160
} catch (AMQPChannelException $e) {
81161
# ignore if exchange/queue doesn't exist and rethrow exception if it's something else
82162
if ($e->getCode() !== 404) {

0 commit comments

Comments
 (0)