IndexerSetDimensionsModeCommandTest.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\Indexer\Test\Unit\Console\Command;
  8. use Magento\Indexer\Console\Command\IndexerSetDimensionsModeCommand;
  9. use Symfony\Component\Console\Tester\CommandTester;
  10. use Magento\Framework\App\Config\ScopeConfigInterface;
  11. use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
  12. /**
  13. * Test for class \Magento\Indexer\Model\ModeSwitcherInterface.
  14. */
  15. class IndexerSetDimensionsModeCommandTest extends AbstractIndexerCommandCommonSetup
  16. {
  17. /**
  18. * Command being tested
  19. *
  20. * @var IndexerSetDimensionsModeCommand|\PHPUnit_Framework_MockObject_MockObject
  21. */
  22. private $command;
  23. /**
  24. * ScopeConfigInterface
  25. *
  26. * @var ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject
  27. */
  28. private $configReaderMock;
  29. /**
  30. * @var \Magento\Indexer\Model\ModeSwitcherInterface[]
  31. */
  32. private $dimensionProviders;
  33. /**
  34. * @var \Magento\Indexer\Model\ModeSwitcherInterface|\PHPUnit_Framework_MockObject_MockObject
  35. */
  36. private $dimensionModeSwitcherMock;
  37. /**
  38. * @var \Magento\Indexer\Model\Indexer|\PHPUnit_Framework_MockObject_MockObject
  39. */
  40. private $indexerMock;
  41. /**
  42. * @var \Magento\Indexer\Model\DimensionModes|\PHPUnit_Framework_MockObject_MockObject
  43. */
  44. private $dimensionModes;
  45. /**
  46. * @inheritdoc
  47. */
  48. protected function setUp()
  49. {
  50. parent::setUp();
  51. $objectManagerHelper = new ObjectManagerHelper($this);
  52. $this->configReaderMock = $this->createMock(ScopeConfigInterface::class);
  53. $this->dimensionModeSwitcherMock =
  54. $this->createMock(\Magento\Indexer\Model\ModeSwitcherInterface::class);
  55. $this->dimensionProviders = [
  56. 'indexer_title' => $this->dimensionModeSwitcherMock,
  57. ];
  58. $this->dimensionModes = $this->createMock(\Magento\Indexer\Model\DimensionModes::class);
  59. $this->command = $objectManagerHelper->getObject(
  60. IndexerSetDimensionsModeCommand::class,
  61. [
  62. 'objectManagerFactory' => $this->objectManagerFactory,
  63. 'configReader' => $this->configReaderMock,
  64. 'dimensionSwitchers' => $this->dimensionProviders,
  65. ]
  66. );
  67. }
  68. /**
  69. * Get return value map for object manager
  70. *
  71. * @return array
  72. */
  73. protected function getObjectManagerReturnValueMap()
  74. {
  75. $result = parent::getObjectManagerReturnValueMap();
  76. $this->indexerMock = $this->createMock(\Magento\Indexer\Model\Indexer::class);
  77. $result[] = [\Magento\Indexer\Model\Indexer::class, $this->indexerMock];
  78. return $result;
  79. }
  80. /**
  81. * Tests method \Magento\Indexer\Console\Command\IndexerDimensionsModeCommand::execute
  82. *
  83. * @param string $indexerTitle
  84. * @param string $previousMode
  85. * @param string $command
  86. * @param string $consoleOutput
  87. * @dataProvider dimensionModesDataProvider
  88. * @return void
  89. */
  90. public function testExecuteWithAttributes($indexerTitle, $previousMode, $command, $consoleOutput)
  91. {
  92. $this->configureAdminArea();
  93. $commandTester = new CommandTester($this->command);
  94. $this->dimensionModes->method('getDimensions')->willReturn([
  95. $previousMode => 'dimension1',
  96. $command['mode'] => 'dimension2',
  97. ]);
  98. $this->dimensionModeSwitcherMock->method('getDimensionModes')->willReturn($this->dimensionModes);
  99. $this->indexerMock->method('load')->willReturnSelf();
  100. $this->indexerMock->method('getTitle')->willReturn($indexerTitle);
  101. $commandTester->execute($command);
  102. $actualValue = $commandTester->getDisplay();
  103. $this->assertEquals(
  104. $consoleOutput,
  105. $actualValue
  106. );
  107. }
  108. /**
  109. * @return array
  110. */
  111. public function dimensionModesDataProvider(): array
  112. {
  113. return [
  114. 'was_changed' => [
  115. 'indexer_title' => 'indexer_title',
  116. 'previousMode' => 'none',
  117. 'command' => [
  118. 'indexer' => 'indexer_title',
  119. 'mode' => 'store',
  120. ],
  121. 'output' =>
  122. sprintf(
  123. 'Dimensions mode for indexer "%s" was changed from \'%s\' to \'%s\'',
  124. 'indexer_title',
  125. 'none',
  126. 'store'
  127. ) . PHP_EOL
  128. ,
  129. ],
  130. 'was_not_changed' => [
  131. 'indexer_title' => 'indexer_title',
  132. 'previousMode' => 'none',
  133. 'command' => [
  134. 'indexer' => 'indexer_title',
  135. 'mode' => 'none',
  136. ],
  137. 'output' =>
  138. sprintf(
  139. 'Dimensions mode for indexer "%s" has not been changed',
  140. 'indexer_title'
  141. ) . PHP_EOL
  142. ,
  143. ],
  144. ];
  145. }
  146. /**
  147. * Tests indexer exception of method \Magento\Indexer\Console\Command\IndexerDimensionsModeCommand::execute
  148. *
  149. * @expectedException \InvalidArgumentException
  150. * @expectedExceptionMessage
  151. * Invalid value for "<indexer>" argument. Accepted values for "<indexer>" are 'indexer_title'
  152. * @return void
  153. */
  154. public function testExecuteWithIndxerException()
  155. {
  156. $commandTester = new CommandTester($this->command);
  157. $this->indexerMock->method('getTitle')->willReturn('indexer_title');
  158. $commandTester->execute(['indexer' => 'non_existing_title']);
  159. }
  160. /**
  161. * Tests indexer exception of method \Magento\Indexer\Console\Command\IndexerDimensionsModeCommand::execute
  162. *
  163. * @expectedException \InvalidArgumentException
  164. * @expectedExceptionMessage Missing argument "<mode>". Accepted values for "<mode>" are 'store,website'
  165. * @return void
  166. */
  167. public function testExecuteWithModeException()
  168. {
  169. $commandTester = new CommandTester($this->command);
  170. $this->dimensionModes->method('getDimensions')->willReturn([
  171. 'store' => 'dimension1',
  172. 'website' => 'dimension2',
  173. ]);
  174. $this->dimensionModeSwitcherMock->method('getDimensionModes')->willReturn($this->dimensionModes);
  175. $this->indexerMock->method('getTitle')->willReturn('indexer_title');
  176. $commandTester->execute([
  177. 'indexer' => 'indexer_title',
  178. ]);
  179. }
  180. /**
  181. * Test execution of command without any arguments
  182. *
  183. * @return void
  184. */
  185. public function testExecuteWithNoArguments()
  186. {
  187. $indexerTitle = 'indexer_title';
  188. $modesConfig = [
  189. 'store' => 'dimension1',
  190. 'website' => 'dimension2',
  191. ];
  192. $this->configureAdminArea();
  193. $commandTester = new CommandTester($this->command);
  194. $this->indexerMock->method('getTitle')->willReturn($indexerTitle);
  195. $this->dimensionModes->method('getDimensions')->willReturn($modesConfig);
  196. $this->dimensionModeSwitcherMock->method('getDimensionModes')->willReturn($this->dimensionModes);
  197. $commandTester->execute([]);
  198. $actualValue = $commandTester->getDisplay();
  199. $consoleOutput = sprintf('%-50s', 'Indexer') . 'Available modes' . PHP_EOL
  200. . sprintf('%-50s', $indexerTitle) . 'store,website' . PHP_EOL;
  201. $this->assertEquals(
  202. $consoleOutput,
  203. $actualValue
  204. );
  205. }
  206. }