17 use Symfony\Component\Console\Tester\CommandTester;
39 private $indexerRegistryMock;
44 private $dependencyInfoProviderMock;
49 private $objectManagerHelper;
56 $this->objectManagerHelper =
new ObjectManagerHelper($this);
57 $this->configMock = $this->createMock(\
Magento\Indexer\Model\Config::class);
58 $this->indexerRegistryMock = $this->getMockBuilder(IndexerRegistry::class)
59 ->disableOriginalConstructor()
61 $this->dependencyInfoProviderMock = $this->objectManagerHelper->getObject(
62 DependencyInfoProvider::class,
64 'config' => $this->configMock,
77 $result = parent::getObjectManagerReturnValueMap();
79 $result[] = [DependencyInfoProvider::class, $this->dependencyInfoProviderMock];
85 $this->stateMock->expects($this->never())->method(
'setAreaCode');
87 $optionsList = $this->command->getInputList();
88 $this->assertSame(1,
sizeof($optionsList));
89 $this->assertSame(
'index', $optionsList[0]->getName());
94 $this->configMock->expects($this->once())->method(
'getIndexer')->will($this->returnValue([
95 'title' =>
'Title_indexerOne',
96 'shared_index' =>
null 100 $this->getIndexerMock(
101 [
'reindexAll',
'getStatus'],
102 [
'indexer_id' =>
'id_indexerOne',
'title' =>
'Title_indexerOne']
105 $this->indexerFactory->expects($this->never())->method(
'create');
107 $commandTester =
new CommandTester($this->command);
108 $commandTester->execute([]);
109 $actualValue = $commandTester->getDisplay();
111 $this->assertStringStartsWith(
'Title_indexerOne index has been rebuilt successfully in', $actualValue);
124 array $inputIndexers,
127 array $reindexAllCallMatchers,
128 array $executedIndexers,
129 array $executedSharedIndexers
131 $this->addSeparateIndexersToConfigMock($indexers);
132 $this->addAllIndexersToConfigMock($indexers);
135 foreach ($indexers as $indexerData) {
136 $indexer = $this->getIndexerMock([
'getState',
'reindexAll',
'isInvalid'], $indexerData);
140 [
'loadByIndexer',
'setStatus',
'save'],
147 ->method(
'reindexAll');
152 $emptyIndexer = $this->getIndexerMock([
'load',
'getState']);
153 $this->indexerRegistryMock
154 ->expects($this->exactly(count($executedSharedIndexers)))
156 ->withConsecutive(...$executedSharedIndexers)
157 ->willReturn($emptyIndexer);
158 $emptyIndexer->method(
'getState')
159 ->willReturn($this->getStateMock([
'setStatus',
'save']));
164 $this->objectManagerFactory,
165 $this->indexerRegistryMock
167 $commandTester =
new CommandTester($this->command);
168 $commandTester->execute([
'index' => $inputIndexers]);
171 $template =
'{Title} index has been rebuilt successfully in \d{2}:\d{2}:\d{2}\W*';
172 foreach ($executedIndexers as $indexerId) {
175 $indexers[$indexerId][
'title'],
180 $this->assertRegExp(
$pattern, $commandTester->getDisplay());
186 private function addSeparateIndexersToConfigMock(array $indexers)
189 ->method(
'getIndexer')
193 return [$elem[
'indexer_id'], $elem];
203 private function addAllIndexersToConfigMock(array $indexers)
206 ->method(
'getIndexers')
207 ->willReturn($indexers);
215 private function getStateMock(array
$methods =
null, array
$data = [])
218 $state = $this->getMockBuilder(StateInterface::class)
220 ->disableOriginalConstructor()
221 ->getMockForAbstractClass();
222 $state->method(
'getStatus')
234 'Without dependencies' => [
240 'indexer_id' =>
'indexer_1',
241 'title' =>
'Title_indexer_1',
242 'shared_index' =>
null,
243 'dependencies' => [],
246 'indexer_id' =>
'indexer_2',
247 'title' =>
'Title_indexer_2',
248 'shared_index' =>
'with_indexer_3',
249 'dependencies' => [],
252 'indexer_id' =>
'indexer_3',
253 'title' =>
'Title_indexer_3',
254 'shared_index' =>
'with_indexer_3',
255 'dependencies' => [],
258 'indexer_states' => [
266 'expected_reindex_all_calls' => [
267 'indexer_1' => $this->once(),
268 'indexer_2' => $this->never(),
269 'indexer_3' => $this->never(),
271 'executed_indexers' => [
'indexer_1'],
272 'executed_shared_indexers' => [],
274 'With dependencies and some indexers is invalid' => [
280 'indexer_id' =>
'indexer_2',
281 'title' =>
'Title_indexer_2',
282 'shared_index' =>
'with_indexer_3',
283 'dependencies' => [],
286 'indexer_id' =>
'indexer_3',
287 'title' =>
'Title_indexer_3',
288 'shared_index' =>
'with_indexer_3',
289 'dependencies' => [],
292 'indexer_id' =>
'indexer_1',
293 'title' =>
'Title_indexer_1',
294 'shared_index' =>
null,
295 'dependencies' => [
'indexer_2',
'indexer_3'],
298 'indexer_id' =>
'indexer_4',
299 'title' =>
'Title_indexer_4',
300 'shared_index' =>
null,
301 'dependencies' => [],
304 'indexer_id' =>
'indexer_5',
305 'title' =>
'Title_indexer_5',
306 'shared_index' =>
null,
307 'dependencies' => [
'indexer_1'],
310 'indexer_states' => [
324 'expected_reindex_all_calls' => [
325 'indexer_1' => $this->once(),
326 'indexer_2' => $this->never(),
327 'indexer_3' => $this->once(),
328 'indexer_4' => $this->never(),
329 'indexer_5' => $this->once(),
331 'executed_indexers' => [
'indexer_3',
'indexer_1',
'indexer_5'],
332 'executed_shared_indexers' => [[
'indexer_2'],[
'indexer_3']],
334 'With dependencies and multiple indexers in request' => [
336 'indexer_1',
'indexer_3' 340 'indexer_id' =>
'indexer_2',
341 'title' =>
'Title_indexer_2',
342 'shared_index' =>
null,
343 'dependencies' => [],
346 'indexer_id' =>
'indexer_1',
347 'title' =>
'Title_indexer_1',
348 'shared_index' =>
null,
349 'dependencies' => [
'indexer_2'],
352 'indexer_id' =>
'indexer_4',
353 'title' =>
'Title_indexer_4',
354 'shared_index' =>
null,
355 'dependencies' => [],
358 'indexer_id' =>
'indexer_3',
359 'title' =>
'Title_indexer_3',
360 'shared_index' =>
null,
361 'dependencies' => [
'indexer_4'],
364 'indexer_id' =>
'indexer_5',
365 'title' =>
'Title_indexer_5',
366 'shared_index' =>
null,
367 'dependencies' => [
'indexer_1'],
370 'indexer_states' => [
381 'expected_reindex_all_calls' => [
382 'indexer_1' => $this->once(),
383 'indexer_2' => $this->never(),
384 'indexer_3' => $this->once(),
385 'indexer_4' => $this->once(),
386 'indexer_5' => $this->once(),
388 'executed_indexers' => [
'indexer_1',
'indexer_4',
'indexer_3',
'indexer_5'],
389 'executed_shared_indexers' => [],
397 $indexerOne = $this->getIndexerMock([
'reindexAll',
'getStatus'], [
'indexer_id' =>
'indexer_1']);
399 $indexerOne->expects($this->once())->method(
'reindexAll')->will($this->throwException($localizedException));
402 $commandTester =
new CommandTester($this->command);
403 $commandTester->execute([
'index' => [
'indexer_1']]);
404 $actualValue = $commandTester->getDisplay();
406 $this->assertStringStartsWith(
'Some Exception Message', $actualValue);
412 $indexerOne = $this->getIndexerMock(
413 [
'reindexAll',
'getStatus'],
414 [
'indexer_id' =>
'indexer_1',
'title' =>
'Title_indexer_1']
416 $indexerOne->expects($this->once())
417 ->method(
'reindexAll')
418 ->willThrowException(
new \Exception());
421 $commandTester =
new CommandTester($this->command);
422 $commandTester->execute([
'index' => [
'indexer_1']]);
423 $actualValue = $commandTester->getDisplay();
425 $this->assertStringStartsWith(
'Title_indexer_1' .
' indexer process unknown error:', $actualValue);
428 public function testExecuteWithExceptionInGetIndexers()
431 $inputIndexers = [
'indexer_2'];
433 'indexer_id' =>
'indexer_1',
434 'shared_index' =>
'new',
436 $indexerOne = $this->getIndexerMock(
437 [
'reindexAll',
'getStatus',
'load'],
442 $indexerOne->expects($this->never())->method(
'getTitle');
443 $this->expectException(\InvalidArgumentException::class);
444 $this->expectExceptionMessage(
445 "The following requested index types are not supported: '" 446 . join(
"', '", $inputIndexers)
447 .
"'." . PHP_EOL .
'Supported types: ' 448 . join(
", ", array_map(
453 $this->indexerCollectionMock->getItems()
456 $this->command =
new IndexerReindexCommand($this->objectManagerFactory);
457 $commandTester =
new CommandTester($this->command);
458 $commandTester->execute([
'index' => $inputIndexers]);
testExecuteWithException()
testExecuteWithIndex(array $inputIndexers, array $indexers, array $states, array $reindexAllCallMatchers, array $executedIndexers, array $executedSharedIndexers)
executeWithIndexDataProvider()
testExecuteWithLocalizedException()
initIndexerCollectionByItems(array $items)
getObjectManagerReturnValueMap()