IndexerStatusCommandTest.php 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Indexer\Test\Unit\Console\Command;
  7. use Magento\Framework\Indexer\StateInterface;
  8. use Magento\Indexer\Console\Command\IndexerStatusCommand;
  9. use Symfony\Component\Console\Tester\CommandTester;
  10. class IndexerStatusCommandTest extends AbstractIndexerCommandCommonSetup
  11. {
  12. /**
  13. * Command being tested
  14. *
  15. * @var IndexerStatusCommand
  16. */
  17. private $command;
  18. /**
  19. * @param \PHPUnit_Framework_MockObject_MockObject $indexerMock
  20. * @param array $data
  21. * @return mixed
  22. */
  23. private function attachViewToIndexerMock($indexerMock, array $data)
  24. {
  25. /** @var \Magento\Framework\Mview\View\Changelog|\PHPUnit_Framework_MockObject_MockObject $changelog */
  26. $changelog = $this->getMockBuilder(\Magento\Framework\Mview\View\Changelog::class)
  27. ->disableOriginalConstructor()
  28. ->getMock();
  29. $changelog->expects($this->any())
  30. ->method('getList')
  31. ->willReturn(range(0, $data['view']['changelog']['list_size']-1));
  32. /** @var \Magento\Indexer\Model\Mview\View\State|\PHPUnit_Framework_MockObject_MockObject $stateMock */
  33. $stateMock = $this->getMockBuilder(\Magento\Indexer\Model\Mview\View\State::class)
  34. ->disableOriginalConstructor()
  35. ->setMethods(null)
  36. ->getMock();
  37. $stateMock->addData($data['view']['state']);
  38. /** @var \Magento\Framework\Mview\View|\PHPUnit_Framework_MockObject_MockObject $viewMock */
  39. $viewMock = $this->getMockBuilder(\Magento\Framework\Mview\View::class)
  40. ->disableOriginalConstructor()
  41. ->setMethods(['getChangelog', 'getState'])
  42. ->getMock();
  43. $viewMock->expects($this->any())
  44. ->method('getState')
  45. ->willReturn($stateMock);
  46. $viewMock->expects($this->any())
  47. ->method('getChangelog')
  48. ->willReturn($changelog);
  49. $indexerMock->method('getView')
  50. ->willReturn($viewMock);
  51. return $indexerMock;
  52. }
  53. /**
  54. * @param array $indexers
  55. *
  56. * @dataProvider executeAllDataProvider
  57. */
  58. public function testExecuteAll(array $indexers)
  59. {
  60. $this->configureAdminArea();
  61. $indexerMocks = [];
  62. foreach ($indexers as $indexerData) {
  63. $indexerMock = $this->getIndexerMock(
  64. ['getStatus', 'isScheduled', 'getState', 'getView'],
  65. $indexerData
  66. );
  67. $indexerMock->method('getStatus')
  68. ->willReturn($indexerData['status']);
  69. $indexerMock->method('isScheduled')
  70. ->willReturn($indexerData['is_scheduled']);
  71. if ($indexerData['is_scheduled']) {
  72. $this->attachViewToIndexerMock($indexerMock, $indexerData);
  73. }
  74. $indexerMocks[] = $indexerMock;
  75. }
  76. $this->initIndexerCollectionByItems($indexerMocks);
  77. $this->command = new IndexerStatusCommand($this->objectManagerFactory);
  78. $commandTester = new CommandTester($this->command);
  79. $commandTester->execute([]);
  80. $linesOutput = array_filter(explode(PHP_EOL, $commandTester->getDisplay()));
  81. $spacer = '+----------------+------------------+-----------+-------------------------+---------------------+';
  82. $this->assertCount(8, $linesOutput, 'There should be 8 lines output. 3 Spacers, 1 header, 4 content.');
  83. $this->assertEquals($linesOutput[0], $spacer, "Lines 0, 2, 7 should be spacer lines");
  84. $this->assertEquals($linesOutput[2], $spacer, "Lines 0, 2, 7 should be spacer lines");
  85. $this->assertEquals($linesOutput[7], $spacer, "Lines 0, 2, 7 should be spacer lines");
  86. $headerValues = array_values(array_filter(explode('|', $linesOutput[1])));
  87. $this->assertEquals('Title', trim($headerValues[0]));
  88. $this->assertEquals('Status', trim($headerValues[1]));
  89. $this->assertEquals('Update On', trim($headerValues[2]));
  90. $this->assertEquals('Schedule Status', trim($headerValues[3]));
  91. $this->assertEquals('Schedule Updated', trim($headerValues[4]));
  92. $indexer1 = array_values(array_filter(explode('|', $linesOutput[3])));
  93. $this->assertEquals('Title_indexer1', trim($indexer1[0]));
  94. $this->assertEquals('Ready', trim($indexer1[1]));
  95. $this->assertEquals('Schedule', trim($indexer1[2]));
  96. $this->assertEquals('idle (10 in backlog)', trim($indexer1[3]));
  97. $this->assertEquals('2017-01-01 11:11:11', trim($indexer1[4]));
  98. $indexer2 = array_values(array_filter(explode('|', $linesOutput[4])));
  99. $this->assertEquals('Title_indexer2', trim($indexer2[0]));
  100. $this->assertEquals('Reindex required', trim($indexer2[1]));
  101. $this->assertEquals('Save', trim($indexer2[2]));
  102. $this->assertEquals('', trim($indexer2[3]));
  103. $this->assertEquals('', trim($indexer2[4]));
  104. $indexer3 = array_values(array_filter(explode('|', $linesOutput[5])));
  105. $this->assertEquals('Title_indexer3', trim($indexer3[0]));
  106. $this->assertEquals('Processing', trim($indexer3[1]));
  107. $this->assertEquals('Schedule', trim($indexer3[2]));
  108. $this->assertEquals('idle (100 in backlog)', trim($indexer3[3]));
  109. $this->assertEquals('2017-01-01 11:11:11', trim($indexer3[4]));
  110. $indexer4 = array_values(array_filter(explode('|', $linesOutput[6])));
  111. $this->assertEquals('Title_indexer4', trim($indexer4[0]));
  112. $this->assertEquals('unknown', trim($indexer4[1]));
  113. $this->assertEquals('Schedule', trim($indexer4[2]));
  114. $this->assertEquals('running (20 in backlog)', trim($indexer4[3]));
  115. $this->assertEquals('2017-01-01 11:11:11', trim($indexer4[4]));
  116. }
  117. /**
  118. * @return array
  119. */
  120. public function executeAllDataProvider()
  121. {
  122. return [
  123. [
  124. 'indexers' => [
  125. 'indexer_1' => [
  126. 'indexer_id' => 'indexer_1',
  127. 'title' => 'Title_indexer1',
  128. 'status' => StateInterface::STATUS_VALID,
  129. 'is_scheduled' => true,
  130. 'view' => [
  131. 'state' => [
  132. 'status' => 'idle',
  133. 'updated' => '2017-01-01 11:11:11',
  134. ],
  135. 'changelog' => [
  136. 'list_size' => 10
  137. ]
  138. ]
  139. ],
  140. 'indexer_2' => [
  141. 'indexer_id' => 'indexer_2',
  142. 'title' => 'Title_indexer2',
  143. 'status' => StateInterface::STATUS_INVALID,
  144. 'is_scheduled' => false,
  145. 'view' => [
  146. 'state' => [
  147. 'status' => 'idle',
  148. 'updated' => '2017-01-01 11:11:11',
  149. ],
  150. 'changelog' => [
  151. 'list_size' => 99999999
  152. ]
  153. ]
  154. ],
  155. 'indexer_3' => [
  156. 'indexer_id' => 'indexer_3',
  157. 'title' => 'Title_indexer3',
  158. 'status' => StateInterface::STATUS_WORKING,
  159. 'is_scheduled' => true,
  160. 'view' => [
  161. 'state' => [
  162. 'status' => 'idle',
  163. 'updated' => '2017-01-01 11:11:11',
  164. ],
  165. 'changelog' => [
  166. 'list_size' => 100
  167. ]
  168. ]
  169. ],
  170. 'indexer_4' => [
  171. 'indexer_id' => 'indexer_4',
  172. 'title' => 'Title_indexer4',
  173. 'status' => null,
  174. 'is_scheduled' => true,
  175. 'view' => [
  176. 'state' => [
  177. 'status' => 'running',
  178. 'updated' => '2017-01-01 11:11:11',
  179. ],
  180. 'changelog' => [
  181. 'list_size' => 20
  182. ]
  183. ]
  184. ],
  185. ],
  186. ],
  187. ];
  188. }
  189. }