QueueTest.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\MysqlMq\Test\Unit\Model\ResourceModel;
  7. /**
  8. * Unit test for Queue resource model.
  9. */
  10. class QueueTest extends \PHPUnit\Framework\TestCase
  11. {
  12. /**
  13. * @var \Magento\Framework\App\ResourceConnection|\PHPUnit_Framework_MockObject_MockObject
  14. */
  15. private $resources;
  16. /**
  17. * @var \Magento\MysqlMq\Model\ResourceModel\Queue
  18. */
  19. private $queue;
  20. /**
  21. * Set up.
  22. *
  23. * @return void
  24. */
  25. protected function setUp()
  26. {
  27. $this->resources = $this->getMockBuilder(\Magento\Framework\App\ResourceConnection::class)
  28. ->disableOriginalConstructor()->getMock();
  29. $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
  30. $this->queue = $objectManager->getObject(
  31. \Magento\MysqlMq\Model\ResourceModel\Queue::class,
  32. [
  33. '_resources' => $this->resources,
  34. ]
  35. );
  36. }
  37. /**
  38. * Test for saveMessage method.
  39. *
  40. * @return void
  41. */
  42. public function testSaveMessage()
  43. {
  44. $messageTopic = 'topic.name';
  45. $message = 'messageBody';
  46. $tableName = 'queue_message';
  47. $messageId = 2;
  48. $connection = $this->getMockBuilder(\Magento\Framework\DB\Adapter\AdapterInterface::class)
  49. ->setMethods(['insert', 'lastInsertId'])
  50. ->disableOriginalConstructor()
  51. ->getMockForAbstractClass();
  52. $this->resources->expects($this->exactly(2))->method('getConnection')->with('default')->willReturn($connection);
  53. $this->resources->expects($this->once())
  54. ->method('getTableName')->with($tableName, 'default')->willReturn($tableName);
  55. $connection->expects($this->once())->method('insert')
  56. ->with($tableName, ['topic_name' => $messageTopic, 'body' => $message])->willReturn(1);
  57. $connection->expects($this->once())->method('lastInsertId')->with($tableName)->willReturn($messageId);
  58. $this->assertEquals($messageId, $this->queue->saveMessage($messageTopic, $message));
  59. }
  60. /**
  61. * Test for saveMessages method.
  62. *
  63. * @return void
  64. */
  65. public function testSaveMessages()
  66. {
  67. $messageTopic = 'topic.name';
  68. $messages = ['messageBody0', 'messageBody1'];
  69. $tableName = 'queue_message';
  70. $messageIds = [3, 4];
  71. $connection = $this->getMockBuilder(\Magento\Framework\DB\Adapter\AdapterInterface::class)
  72. ->setMethods(['insertMultiple', 'lastInsertId'])
  73. ->disableOriginalConstructor()
  74. ->getMockForAbstractClass();
  75. $this->resources->expects($this->atLeastOnce())
  76. ->method('getConnection')->with('default')->willReturn($connection);
  77. $this->resources->expects($this->once())
  78. ->method('getTableName')->with($tableName, 'default')->willReturn($tableName);
  79. $connection->expects($this->once())->method('insertMultiple')
  80. ->with(
  81. $tableName,
  82. [
  83. ['topic_name' => $messageTopic, 'body' => $messages[0]],
  84. ['topic_name' => $messageTopic, 'body' => $messages[1]],
  85. ]
  86. )->willReturn(2);
  87. $connection->expects($this->once())->method('lastInsertId')->with($tableName)->willReturn($messageIds[0]);
  88. $select = $this->getMockBuilder(\Magento\Framework\DB\Select::class)
  89. ->disableOriginalConstructor()->getMock();
  90. $connection->expects($this->once())->method('select')->willReturn($select);
  91. $select->expects($this->once())->method('from')->with(['qm' => $tableName], ['id'])->willReturnSelf();
  92. $select->expects($this->once())->method('where')->with('qm.id >= ?', $messageIds[0])->willReturnSelf();
  93. $select->expects($this->once())->method('limit')->with(2)->willReturnSelf();
  94. $connection->expects($this->once())->method('fetchCol')->with($select)->willReturn($messageIds);
  95. $this->assertEquals($messageIds, $this->queue->saveMessages($messageTopic, $messages));
  96. }
  97. /**
  98. * Test for linkQueues method.
  99. *
  100. * @return void
  101. */
  102. public function testLinkQueues()
  103. {
  104. $messageId = 3;
  105. $queueNames = ['queueName0', 'queueName1'];
  106. $queueIds = [5, 6];
  107. $tableNames = ['queue', 'queue_message_status'];
  108. $connection = $this->getMockBuilder(\Magento\Framework\DB\Adapter\AdapterInterface::class)
  109. ->disableOriginalConstructor()->getMock();
  110. $this->resources->expects($this->atLeastOnce())
  111. ->method('getConnection')->with('default')->willReturn($connection);
  112. $this->resources->expects($this->exactly(2))->method('getTableName')
  113. ->withConsecutive([$tableNames[0], 'default'], [$tableNames[1], 'default'])
  114. ->willReturnOnConsecutiveCalls($tableNames[0], $tableNames[1]);
  115. $select = $this->getMockBuilder(\Magento\Framework\DB\Select::class)
  116. ->disableOriginalConstructor()->getMock();
  117. $connection->expects($this->once())->method('select')->willReturn($select);
  118. $select->expects($this->once())->method('from')->with(['queue' => $tableNames[0]])->willReturnSelf();
  119. $select->expects($this->once())->method('columns')->with(['id'])->willReturnSelf();
  120. $select->expects($this->once())->method('where')->with('queue.name IN (?)', $queueNames)->willReturnSelf();
  121. $connection->expects($this->once())->method('fetchCol')->with($select)->willReturn($queueIds);
  122. $connection->expects($this->once())->method('insertArray')->with(
  123. $tableNames[1],
  124. ['queue_id', 'message_id', 'status'],
  125. [
  126. [
  127. $queueIds[0],
  128. $messageId,
  129. \Magento\MysqlMq\Model\QueueManagement::MESSAGE_STATUS_NEW
  130. ],
  131. [
  132. $queueIds[1],
  133. $messageId,
  134. \Magento\MysqlMq\Model\QueueManagement::MESSAGE_STATUS_NEW
  135. ],
  136. ]
  137. )->willReturn(4);
  138. $this->assertEquals($this->queue, $this->queue->linkQueues($messageId, $queueNames));
  139. }
  140. /**
  141. * Test for getMessages method.
  142. *
  143. * @return void
  144. */
  145. public function testGetMessages()
  146. {
  147. $limit = 100;
  148. $queueName = 'queueName0';
  149. $tableNames = ['queue_message', 'queue_message_status', 'queue'];
  150. $messages = [['message0_data'], ['message1_data']];
  151. $connection = $this->getMockBuilder(\Magento\Framework\DB\Adapter\AdapterInterface::class)
  152. ->disableOriginalConstructor()->getMock();
  153. $this->resources->expects($this->atLeastOnce())
  154. ->method('getConnection')->with('default')->willReturn($connection);
  155. $this->resources->expects($this->exactly(3))->method('getTableName')
  156. ->withConsecutive([$tableNames[0], 'default'], [$tableNames[1], 'default'], [$tableNames[2], 'default'])
  157. ->willReturnOnConsecutiveCalls($tableNames[0], $tableNames[1], $tableNames[2]);
  158. $select = $this->getMockBuilder(\Magento\Framework\DB\Select::class)
  159. ->disableOriginalConstructor()->getMock();
  160. $connection->expects($this->once())->method('select')->willReturn($select);
  161. $select->expects($this->once())->method('from')->with(
  162. ['queue_message' => $tableNames[0]],
  163. [
  164. \Magento\MysqlMq\Model\QueueManagement::MESSAGE_TOPIC => 'topic_name',
  165. \Magento\MysqlMq\Model\QueueManagement::MESSAGE_BODY => 'body'
  166. ]
  167. )->willReturnSelf();
  168. $select->expects($this->exactly(2))->method('join')->withConsecutive(
  169. [
  170. ['queue_message_status' => $tableNames[1]],
  171. 'queue_message.id = queue_message_status.message_id',
  172. [
  173. \Magento\MysqlMq\Model\QueueManagement::MESSAGE_QUEUE_RELATION_ID => 'id',
  174. \Magento\MysqlMq\Model\QueueManagement::MESSAGE_QUEUE_ID => 'queue_id',
  175. \Magento\MysqlMq\Model\QueueManagement::MESSAGE_ID => 'message_id',
  176. \Magento\MysqlMq\Model\QueueManagement::MESSAGE_STATUS => 'status',
  177. \Magento\MysqlMq\Model\QueueManagement::MESSAGE_UPDATED_AT => 'updated_at',
  178. \Magento\MysqlMq\Model\QueueManagement::MESSAGE_NUMBER_OF_TRIALS => 'number_of_trials'
  179. ]
  180. ],
  181. [
  182. ['queue' => $tableNames[2]],
  183. 'queue.id = queue_message_status.queue_id',
  184. [\Magento\MysqlMq\Model\QueueManagement::MESSAGE_QUEUE_NAME => 'name']
  185. ]
  186. )->willReturnSelf();
  187. $select->expects($this->exactly(2))->method('where')->withConsecutive(
  188. [
  189. 'queue_message_status.status IN (?)',
  190. [
  191. \Magento\MysqlMq\Model\QueueManagement::MESSAGE_STATUS_NEW,
  192. \Magento\MysqlMq\Model\QueueManagement::MESSAGE_STATUS_RETRY_REQUIRED
  193. ]
  194. ],
  195. [
  196. 'queue.name = ?', $queueName
  197. ]
  198. )->willReturnSelf();
  199. $select->expects($this->once())
  200. ->method('order')->with('queue_message_status.updated_at ASC')->willReturnSelf();
  201. $select->expects($this->once())->method('limit')->with($limit)->willReturnSelf();
  202. $connection->expects($this->once())->method('fetchAll')->with($select)->willReturn($messages);
  203. $this->assertEquals($messages, $this->queue->getMessages($queueName, $limit));
  204. }
  205. /**
  206. * Test for deleteMarkedMessages method.
  207. *
  208. * @return void
  209. */
  210. public function testDeleteMarkedMessages()
  211. {
  212. $messageIds = [1, 2];
  213. $tableNames = ['queue_message_status', 'queue_message'];
  214. $connection = $this->getMockBuilder(\Magento\Framework\DB\Adapter\AdapterInterface::class)
  215. ->disableOriginalConstructor()->getMock();
  216. $this->resources->expects($this->atLeastOnce())
  217. ->method('getConnection')->with('default')->willReturn($connection);
  218. $this->resources->expects($this->exactly(2))->method('getTableName')
  219. ->withConsecutive([$tableNames[0], 'default'], [$tableNames[1], 'default'])
  220. ->willReturnOnConsecutiveCalls($tableNames[0], $tableNames[1]);
  221. $select = $this->getMockBuilder(\Magento\Framework\DB\Select::class)
  222. ->disableOriginalConstructor()->getMock();
  223. $connection->expects($this->once())->method('select')->willReturn($select);
  224. $select->expects($this->once())
  225. ->method('from')->with(['queue_message_status' => $tableNames[0]], ['message_id'])->willReturnSelf();
  226. $select->expects($this->once())->method('where')
  227. ->with('status <> ?', \Magento\MysqlMq\Model\QueueManagement::MESSAGE_STATUS_TO_BE_DELETED)
  228. ->willReturnSelf();
  229. $select->expects($this->once())->method('distinct')->willReturnSelf();
  230. $connection->expects($this->once())->method('fetchCol')->with($select)->willReturn($messageIds);
  231. $connection->expects($this->once())->method('delete')
  232. ->with($tableNames[1], ['id NOT IN (?)' => $messageIds])->willReturn(2);
  233. $this->queue->deleteMarkedMessages();
  234. }
  235. /**
  236. * Test for takeMessagesInProgress method.
  237. *
  238. * @return void
  239. */
  240. public function testTakeMessagesInProgress()
  241. {
  242. $relationIds = [1, 2];
  243. $tableName = 'queue_message_status';
  244. $connection = $this->getMockBuilder(\Magento\Framework\DB\Adapter\AdapterInterface::class)
  245. ->disableOriginalConstructor()->getMock();
  246. $this->resources->expects($this->atLeastOnce())
  247. ->method('getConnection')->with('default')->willReturn($connection);
  248. $this->resources->expects($this->once())->method('getTableName')->with($tableName)->willReturn($tableName);
  249. $connection->expects($this->exactly(2))->method('update')->withConsecutive(
  250. [
  251. $tableName,
  252. ['status' => \Magento\MysqlMq\Model\QueueManagement::MESSAGE_STATUS_IN_PROGRESS],
  253. ['id = ?' => $relationIds[0]]
  254. ],
  255. [
  256. $tableName,
  257. ['status' => \Magento\MysqlMq\Model\QueueManagement::MESSAGE_STATUS_IN_PROGRESS],
  258. ['id = ?' => $relationIds[1]]
  259. ]
  260. )->willReturnOnConsecutiveCalls(1, 0);
  261. $this->assertEquals([$relationIds[0]], $this->queue->takeMessagesInProgress($relationIds));
  262. }
  263. /**
  264. * Test for pushBackForRetry method.
  265. *
  266. * @return void
  267. */
  268. public function testPushBackForRetry()
  269. {
  270. $relationId = 1;
  271. $tableName = 'queue_message_status';
  272. $connection = $this->getMockBuilder(\Magento\Framework\DB\Adapter\AdapterInterface::class)
  273. ->disableOriginalConstructor()->getMock();
  274. $this->resources->expects($this->atLeastOnce())
  275. ->method('getConnection')->with('default')->willReturn($connection);
  276. $this->resources->expects($this->once())->method('getTableName')->with($tableName)->willReturn($tableName);
  277. $connection->expects($this->once())->method('update')->with(
  278. $tableName,
  279. [
  280. 'status' => \Magento\MysqlMq\Model\QueueManagement::MESSAGE_STATUS_RETRY_REQUIRED,
  281. 'number_of_trials' => new \Zend_Db_Expr('number_of_trials+1')
  282. ],
  283. ['id = ?' => $relationId]
  284. )->willReturn(1);
  285. $this->queue->pushBackForRetry($relationId);
  286. }
  287. /**
  288. * Test for changeStatus method.
  289. *
  290. * @return void
  291. */
  292. public function testChangeStatus()
  293. {
  294. $relationIds = [1, 2];
  295. $status = \Magento\MysqlMq\Model\QueueManagement::MESSAGE_STATUS_RETRY_REQUIRED;
  296. $tableName = 'queue_message_status';
  297. $connection = $this->getMockBuilder(\Magento\Framework\DB\Adapter\AdapterInterface::class)
  298. ->disableOriginalConstructor()->getMock();
  299. $this->resources->expects($this->atLeastOnce())
  300. ->method('getConnection')->with('default')->willReturn($connection);
  301. $this->resources->expects($this->once())->method('getTableName')->with($tableName)->willReturn($tableName);
  302. $connection->expects($this->once())
  303. ->method('update')->with($tableName, ['status' => $status], ['id IN (?)' => $relationIds])->willReturn(1);
  304. $this->queue->changeStatus($relationIds, $status);
  305. }
  306. }