/src/Symfony/Component/Messenger/Tests/Transport/AmqpExt/ConnectionTest.php

https://github.com/gimler/symfony · PHP · 228 lines · 182 code · 31 blank · 15 comment · 0 complexity · 9eeae149e3a5edf911b7b81d82764fe7 MD5 · raw file

  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Component\Messenger\Tests\Transport\AmqpExt;
  11. use PHPUnit\Framework\TestCase;
  12. use Symfony\Component\Messenger\Transport\AmqpExt\AmqpFactory;
  13. use Symfony\Component\Messenger\Transport\AmqpExt\Connection;
  14. /**
  15. * @requires extension amqp
  16. */
  17. class ConnectionTest extends TestCase
  18. {
  19. /**
  20. * @expectedException \InvalidArgumentException
  21. * @expectedExceptionMessage The given AMQP DSN "amqp://" is invalid.
  22. */
  23. public function testItCannotBeConstructedWithAWrongDsn()
  24. {
  25. Connection::fromDsn('amqp://');
  26. }
  27. public function testItGetsParametersFromTheDsn()
  28. {
  29. $this->assertEquals(
  30. new Connection(array(
  31. 'host' => 'localhost',
  32. 'port' => 5672,
  33. 'vhost' => '/',
  34. ), array(
  35. 'name' => 'messages',
  36. ), array(
  37. 'name' => 'messages',
  38. )),
  39. Connection::fromDsn('amqp://localhost/%2f/messages')
  40. );
  41. }
  42. public function testOverrideOptionsViaQueryParameters()
  43. {
  44. $this->assertEquals(
  45. new Connection(array(
  46. 'host' => 'redis',
  47. 'port' => 1234,
  48. 'vhost' => '/',
  49. 'login' => 'guest',
  50. 'password' => 'password',
  51. ), array(
  52. 'name' => 'exchangeName',
  53. ), array(
  54. 'name' => 'queue',
  55. )),
  56. Connection::fromDsn('amqp://guest:password@redis:1234/%2f/queue?exchange[name]=exchangeName')
  57. );
  58. }
  59. public function testOptionsAreTakenIntoAccountAndOverwrittenByDsn()
  60. {
  61. $this->assertEquals(
  62. new Connection(array(
  63. 'host' => 'redis',
  64. 'port' => 1234,
  65. 'vhost' => '/',
  66. 'login' => 'guest',
  67. 'password' => 'password',
  68. 'persistent' => 'true',
  69. ), array(
  70. 'name' => 'exchangeName',
  71. ), array(
  72. 'name' => 'queueName',
  73. )),
  74. Connection::fromDsn('amqp://guest:password@redis:1234/%2f/queue?exchange[name]=exchangeName&queue[name]=queueName', array(
  75. 'persistent' => 'true',
  76. 'exchange' => array('name' => 'toBeOverwritten'),
  77. ))
  78. );
  79. }
  80. public function testSetsParametersOnTheQueueAndExchange()
  81. {
  82. $factory = new TestAmqpFactory(
  83. $amqpConnection = $this->getMockBuilder(\AMQPConnection::class)->disableOriginalConstructor()->getMock(),
  84. $amqpChannel = $this->getMockBuilder(\AMQPChannel::class)->disableOriginalConstructor()->getMock(),
  85. $amqpQueue = $this->getMockBuilder(\AMQPQueue::class)->disableOriginalConstructor()->getMock(),
  86. $amqpExchange = $this->getMockBuilder(\AMQPExchange::class)->disableOriginalConstructor()->getMock()
  87. );
  88. $amqpQueue->expects($this->once())->method('setArguments')->with(array(
  89. 'x-dead-letter-exchange' => 'dead-exchange',
  90. 'x-message-ttl' => '1200',
  91. ));
  92. $amqpExchange->expects($this->once())->method('setArguments')->with(array(
  93. 'alternate-exchange' => 'alternate',
  94. ));
  95. $connection = Connection::fromDsn('amqp://localhost/%2f/messages?queue[arguments][x-dead-letter-exchange]=dead-exchange', array(
  96. 'queue' => array(
  97. 'arguments' => array(
  98. 'x-message-ttl' => '1200',
  99. ),
  100. ),
  101. 'exchange' => array(
  102. 'arguments' => array(
  103. 'alternate-exchange' => 'alternate',
  104. ),
  105. ),
  106. ), true, $factory);
  107. $connection->publish('body');
  108. }
  109. public function testItUsesANormalConnectionByDefault()
  110. {
  111. $factory = new TestAmqpFactory(
  112. $amqpConnection = $this->getMockBuilder(\AMQPConnection::class)->disableOriginalConstructor()->getMock(),
  113. $amqpChannel = $this->getMockBuilder(\AMQPChannel::class)->disableOriginalConstructor()->getMock(),
  114. $amqpQueue = $this->getMockBuilder(\AMQPQueue::class)->disableOriginalConstructor()->getMock(),
  115. $amqpExchange = $this->getMockBuilder(\AMQPExchange::class)->disableOriginalConstructor()->getMock()
  116. );
  117. $amqpConnection->expects($this->once())->method('connect');
  118. $connection = Connection::fromDsn('amqp://localhost/%2f/messages', array(), false, $factory);
  119. $connection->publish('body');
  120. }
  121. public function testItAllowsToUseAPersistentConnection()
  122. {
  123. $factory = new TestAmqpFactory(
  124. $amqpConnection = $this->getMockBuilder(\AMQPConnection::class)->disableOriginalConstructor()->getMock(),
  125. $amqpChannel = $this->getMockBuilder(\AMQPChannel::class)->disableOriginalConstructor()->getMock(),
  126. $amqpQueue = $this->getMockBuilder(\AMQPQueue::class)->disableOriginalConstructor()->getMock(),
  127. $amqpExchange = $this->getMockBuilder(\AMQPExchange::class)->disableOriginalConstructor()->getMock()
  128. );
  129. $amqpConnection->expects($this->once())->method('pconnect');
  130. $connection = Connection::fromDsn('amqp://localhost/%2f/messages?persistent=true', array(), false, $factory);
  131. $connection->publish('body');
  132. }
  133. public function testItSetupsTheConnectionWhenDebug()
  134. {
  135. $factory = new TestAmqpFactory(
  136. $amqpConnection = $this->getMockBuilder(\AMQPConnection::class)->disableOriginalConstructor()->getMock(),
  137. $amqpChannel = $this->getMockBuilder(\AMQPChannel::class)->disableOriginalConstructor()->getMock(),
  138. $amqpQueue = $this->getMockBuilder(\AMQPQueue::class)->disableOriginalConstructor()->getMock(),
  139. $amqpExchange = $this->getMockBuilder(\AMQPExchange::class)->disableOriginalConstructor()->getMock()
  140. );
  141. $amqpExchange->method('getName')->willReturn('exchange_name');
  142. $amqpExchange->expects($this->once())->method('declareExchange');
  143. $amqpQueue->expects($this->once())->method('declareQueue');
  144. $amqpQueue->expects($this->once())->method('bind')->with('exchange_name', 'my_key');
  145. $connection = Connection::fromDsn('amqp://localhost/%2f/messages?queue[routing_key]=my_key', array(), true, $factory);
  146. $connection->publish('body');
  147. }
  148. public function testItCanDisableTheSetup()
  149. {
  150. $factory = new TestAmqpFactory(
  151. $amqpConnection = $this->getMockBuilder(\AMQPConnection::class)->disableOriginalConstructor()->getMock(),
  152. $amqpChannel = $this->getMockBuilder(\AMQPChannel::class)->disableOriginalConstructor()->getMock(),
  153. $amqpQueue = $this->getMockBuilder(\AMQPQueue::class)->disableOriginalConstructor()->getMock(),
  154. $amqpExchange = $this->getMockBuilder(\AMQPExchange::class)->disableOriginalConstructor()->getMock()
  155. );
  156. $amqpExchange->method('getName')->willReturn('exchange_name');
  157. $amqpExchange->expects($this->never())->method('declareExchange');
  158. $amqpQueue->expects($this->never())->method('declareQueue');
  159. $amqpQueue->expects($this->never())->method('bind');
  160. $connection = Connection::fromDsn('amqp://localhost/%2f/messages?queue[routing_key]=my_key', array('auto-setup' => 'false'), true, $factory);
  161. $connection->publish('body');
  162. $connection = Connection::fromDsn('amqp://localhost/%2f/messages?queue[routing_key]=my_key', array('auto-setup' => false), true, $factory);
  163. $connection->publish('body');
  164. $connection = Connection::fromDsn('amqp://localhost/%2f/messages?queue[routing_key]=my_key&auto-setup=false', array(), true, $factory);
  165. $connection->publish('body');
  166. }
  167. }
  168. class TestAmqpFactory extends AmqpFactory
  169. {
  170. private $connection;
  171. private $channel;
  172. private $queue;
  173. private $exchange;
  174. public function __construct(\AMQPConnection $connection, \AMQPChannel $channel, \AMQPQueue $queue, \AMQPExchange $exchange)
  175. {
  176. $this->connection = $connection;
  177. $this->channel = $channel;
  178. $this->queue = $queue;
  179. $this->exchange = $exchange;
  180. }
  181. public function createConnection(array $credentials): \AMQPConnection
  182. {
  183. return $this->connection;
  184. }
  185. public function createChannel(\AMQPConnection $connection): \AMQPChannel
  186. {
  187. return $this->channel;
  188. }
  189. public function createQueue(\AMQPChannel $channel): \AMQPQueue
  190. {
  191. return $this->queue;
  192. }
  193. public function createExchange(\AMQPChannel $channel): \AMQPExchange
  194. {
  195. return $this->exchange;
  196. }
  197. }