33namespace Codeception \Module ;
44
55use Codeception \Exception \Module as ModuleException ;
6+ use PhpAmqpLib \Message \AMQPMessage ;
67use PhpAmqpLib \Connection \AMQPConnection ;
8+ use PhpAmqpLib \Channel \AMQPChannel ;
79use 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 */
2333class 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