StartConsumerCommandTest.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\MessageQueue\Test\Unit\Console;
  7. use Magento\MessageQueue\Console\StartConsumerCommand;
  8. use Magento\Framework\Filesystem\File\WriteFactory;
  9. use Magento\MessageQueue\Model\Cron\ConsumersRunner\PidConsumerManager;
  10. /**
  11. * Unit tests for StartConsumerCommand.
  12. */
  13. class StartConsumerCommandTest extends \PHPUnit\Framework\TestCase
  14. {
  15. /**
  16. * @var \Magento\Framework\MessageQueue\ConsumerFactory|\PHPUnit_Framework_MockObject_MockObject
  17. */
  18. private $consumerFactory;
  19. /**
  20. * @var \Magento\Framework\App\State|\PHPUnit_Framework_MockObject_MockObject
  21. */
  22. private $appState;
  23. /**
  24. * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
  25. */
  26. private $objectManager;
  27. /**
  28. * @var WriteFactory|\PHPUnit_Framework_MockObject_MockObject
  29. */
  30. private $writeFactoryMock;
  31. /**
  32. * @var PidConsumerManager|\PHPUnit_Framework_MockObject_MockObject
  33. */
  34. private $pidConsumerManagerMock;
  35. /**
  36. * @var StartConsumerCommand
  37. */
  38. private $command;
  39. /**
  40. * {@inheritdoc}
  41. */
  42. protected function setUp()
  43. {
  44. $this->pidConsumerManagerMock = $this->getMockBuilder(PidConsumerManager::class)
  45. ->disableOriginalConstructor()
  46. ->getMock();
  47. $this->consumerFactory = $this->getMockBuilder(\Magento\Framework\MessageQueue\ConsumerFactory::class)
  48. ->disableOriginalConstructor()->getMock();
  49. $this->appState = $this->getMockBuilder(\Magento\Framework\App\State::class)
  50. ->disableOriginalConstructor()->getMock();
  51. $this->writeFactoryMock = $this->getMockBuilder(WriteFactory::class)
  52. ->disableOriginalConstructor()
  53. ->getMock();
  54. $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
  55. $this->command = $this->objectManager->getObject(
  56. \Magento\MessageQueue\Console\StartConsumerCommand::class,
  57. [
  58. 'consumerFactory' => $this->consumerFactory,
  59. 'appState' => $this->appState,
  60. 'writeFactory' => $this->writeFactoryMock,
  61. 'pidConsumerManager' => $this->pidConsumerManagerMock,
  62. ]
  63. );
  64. parent::setUp();
  65. }
  66. /**
  67. * Test for execute method.
  68. *
  69. * @param string|null $pidFilePath
  70. * @param int $savePidExpects
  71. * @param int $isRunExpects
  72. * @param bool $isRun
  73. * @param int $runProcessExpects
  74. * @param int $expectedReturn
  75. * @return void
  76. * @dataProvider executeDataProvider
  77. */
  78. public function testExecute(
  79. $pidFilePath,
  80. $savePidExpects,
  81. $isRunExpects,
  82. $isRun,
  83. $runProcessExpects,
  84. $expectedReturn
  85. ) {
  86. $areaCode = 'area_code';
  87. $numberOfMessages = 10;
  88. $batchSize = null;
  89. $consumerName = 'consumer_name';
  90. $input = $this->getMockBuilder(\Symfony\Component\Console\Input\InputInterface::class)
  91. ->disableOriginalConstructor()->getMock();
  92. $output = $this->getMockBuilder(\Symfony\Component\Console\Output\OutputInterface::class)
  93. ->disableOriginalConstructor()->getMock();
  94. $input->expects($this->once())->method('getArgument')
  95. ->with(\Magento\MessageQueue\Console\StartConsumerCommand::ARGUMENT_CONSUMER)
  96. ->willReturn($consumerName);
  97. $input->expects($this->exactly(4))->method('getOption')
  98. ->withConsecutive(
  99. [\Magento\MessageQueue\Console\StartConsumerCommand::OPTION_NUMBER_OF_MESSAGES],
  100. [\Magento\MessageQueue\Console\StartConsumerCommand::OPTION_BATCH_SIZE],
  101. [\Magento\MessageQueue\Console\StartConsumerCommand::OPTION_AREACODE],
  102. [\Magento\MessageQueue\Console\StartConsumerCommand::PID_FILE_PATH]
  103. )->willReturnOnConsecutiveCalls(
  104. $numberOfMessages,
  105. $batchSize,
  106. $areaCode,
  107. $pidFilePath
  108. );
  109. $this->appState->expects($this->exactly($runProcessExpects))->method('setAreaCode')->with($areaCode);
  110. $consumer = $this->getMockBuilder(\Magento\Framework\MessageQueue\ConsumerInterface::class)
  111. ->disableOriginalConstructor()->getMock();
  112. $this->consumerFactory->expects($this->exactly($runProcessExpects))
  113. ->method('get')->with($consumerName, $batchSize)->willReturn($consumer);
  114. $consumer->expects($this->exactly($runProcessExpects))->method('process')->with($numberOfMessages);
  115. $this->pidConsumerManagerMock->expects($this->exactly($isRunExpects))
  116. ->method('isRun')
  117. ->with($pidFilePath)
  118. ->willReturn($isRun);
  119. $this->pidConsumerManagerMock->expects($this->exactly($savePidExpects))
  120. ->method('savePid')
  121. ->with($pidFilePath);
  122. $this->assertEquals(
  123. $expectedReturn,
  124. $this->command->run($input, $output)
  125. );
  126. }
  127. /**
  128. * @return array
  129. */
  130. public function executeDataProvider()
  131. {
  132. return [
  133. [
  134. 'pidFilePath' => null,
  135. 'savePidExpects' => 0,
  136. 'isRunExpects' => 0,
  137. 'isRun' => false,
  138. 'runProcessExpects' => 1,
  139. 'expectedReturn' => \Magento\Framework\Console\Cli::RETURN_SUCCESS,
  140. ],
  141. [
  142. 'pidFilePath' => '/var/consumer.pid',
  143. 'savePidExpects' => 1,
  144. 'isRunExpects' => 1,
  145. 'isRun' => false,
  146. 'runProcessExpects' => 1,
  147. 'expectedReturn' => \Magento\Framework\Console\Cli::RETURN_SUCCESS,
  148. ],
  149. [
  150. 'pidFilePath' => '/var/consumer.pid',
  151. 'savePidExpects' => 0,
  152. 'isRunExpects' => 1,
  153. 'isRun' => true,
  154. 'runProcessExpects' => 0,
  155. 'expectedReturn' => \Magento\Framework\Console\Cli::RETURN_FAILURE,
  156. ],
  157. ];
  158. }
  159. /**
  160. * Test configure() method implicitly via construct invocation.
  161. *
  162. * @return void
  163. */
  164. public function testConfigure()
  165. {
  166. $this->assertEquals(StartConsumerCommand::COMMAND_QUEUE_CONSUMERS_START, $this->command->getName());
  167. $this->assertEquals('Start MessageQueue consumer', $this->command->getDescription());
  168. /** Exception will be thrown if argument is not declared */
  169. $this->command->getDefinition()->getArgument(StartConsumerCommand::ARGUMENT_CONSUMER);
  170. $this->command->getDefinition()->getOption(StartConsumerCommand::OPTION_NUMBER_OF_MESSAGES);
  171. $this->command->getDefinition()->getOption(StartConsumerCommand::OPTION_AREACODE);
  172. $this->command->getDefinition()->getOption(StartConsumerCommand::PID_FILE_PATH);
  173. $this->assertContains('To start consumer which will process', $this->command->getHelp());
  174. }
  175. }