/vendor/magento/framework/View/Test/Unit/Layout/GeneratorPoolTest.php

https://gitlab.com/yousafsyed/easternglamor · PHP · 179 lines · 111 code · 20 blank · 48 comment · 0 complexity · ceead6f22c657dac68f74940375a0ffa MD5 · raw file

  1. <?php
  2. /**
  3. * Copyright © 2016 Magento. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. /**
  7. * Test class for \Magento\Framework\View\Layout\Element
  8. */
  9. namespace Magento\Framework\View\Test\Unit\Layout;
  10. use \Magento\Framework\View\Layout\GeneratorPool;
  11. use \Magento\Framework\View\Layout\ScheduledStructure;
  12. use \Magento\Framework\View\Layout\Data\Structure as DataStructure;
  13. class GeneratorPoolTest extends \PHPUnit_Framework_TestCase
  14. {
  15. /**
  16. * @var \Magento\Framework\View\Layout\ScheduledStructure\Helper|\PHPUnit_Framework_MockObject_MockObject
  17. */
  18. protected $helperMock;
  19. /**
  20. * @var \Magento\Framework\View\Layout\Reader\Context|\PHPUnit_Framework_MockObject_MockObject
  21. */
  22. protected $readerContextMock;
  23. /**
  24. * @var \Magento\Framework\View\Layout\Generator\Context|\PHPUnit_Framework_MockObject_MockObject
  25. */
  26. protected $generatorContextMock;
  27. /**
  28. * @var ScheduledStructure
  29. */
  30. protected $scheduledStructure;
  31. /**
  32. * @var \Magento\Framework\View\Layout\Data\Structure|\PHPUnit_Framework_MockObject_MockObject
  33. */
  34. protected $structureMock;
  35. /**
  36. * @var GeneratorPool
  37. */
  38. protected $model;
  39. /**
  40. * @return void
  41. */
  42. protected function setUp()
  43. {
  44. // ScheduledStructure
  45. $this->readerContextMock = $this->getMockBuilder('Magento\Framework\View\Layout\Reader\Context')
  46. ->disableOriginalConstructor()
  47. ->getMock();
  48. $this->scheduledStructure = new ScheduledStructure();
  49. $this->readerContextMock->expects($this->any())->method('getScheduledStructure')
  50. ->willReturn($this->scheduledStructure);
  51. // DataStructure
  52. $this->generatorContextMock = $this->getMockBuilder('Magento\Framework\View\Layout\Generator\Context')
  53. ->disableOriginalConstructor()
  54. ->getMock();
  55. $this->structureMock = $this->getMockBuilder('Magento\Framework\View\Layout\Data\Structure')
  56. ->disableOriginalConstructor()
  57. ->setMethods(['reorderChildElement'])
  58. ->getMock();
  59. $this->generatorContextMock->expects($this->any())->method('getStructure')
  60. ->willReturn($this->structureMock);
  61. $this->helperMock = $this->getMockBuilder('Magento\Framework\View\Layout\ScheduledStructure\Helper')
  62. ->disableOriginalConstructor()
  63. ->getMock();
  64. $helperObjectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
  65. $this->model = $helperObjectManager->getObject(
  66. 'Magento\Framework\View\Layout\GeneratorPool',
  67. [
  68. 'helper' => $this->helperMock,
  69. 'generators' => $this->getGeneratorsMocks()
  70. ]
  71. );
  72. }
  73. /**
  74. * @return \PHPUnit_Framework_MockObject_MockObject[]
  75. */
  76. protected function getGeneratorsMocks()
  77. {
  78. $firstGenerator = $this->getMock('Magento\Framework\View\Layout\GeneratorInterface');
  79. $firstGenerator->expects($this->any())->method('getType')->willReturn('first_generator');
  80. $firstGenerator->expects($this->atLeastOnce())->method('process');
  81. $secondGenerator = $this->getMock('Magento\Framework\View\Layout\GeneratorInterface');
  82. $secondGenerator->expects($this->any())->method('getType')->willReturn('second_generator');
  83. $secondGenerator->expects($this->atLeastOnce())->method('process');
  84. return [$firstGenerator, $secondGenerator];
  85. }
  86. /**
  87. * @param array $schedule
  88. * @param array $expectedSchedule
  89. * @return void
  90. * @dataProvider processDataProvider
  91. */
  92. public function testProcess($schedule, $expectedSchedule)
  93. {
  94. foreach ($schedule['structure'] as $structureElement) {
  95. $this->scheduledStructure->setStructureElement($structureElement, []);
  96. }
  97. $reorderMap = [];
  98. foreach ($schedule['sort'] as $elementName => $sort) {
  99. list($parentName, $sibling, $isAfter) = $sort;
  100. $this->scheduledStructure->setElementToSortList($parentName, $elementName, $sibling, $isAfter);
  101. $reorderMap[] = [$parentName, $elementName, $sibling, $isAfter];
  102. }
  103. foreach ($schedule['move'] as $elementName => $move) {
  104. $this->scheduledStructure->setElementToMove($elementName, $move);
  105. list($destination, $sibling, $isAfter) = $move;
  106. $reorderMap[] = [$destination, $elementName, $sibling, $isAfter];
  107. }
  108. $invocation = $this->structureMock->expects($this->any())->method('reorderChildElement');
  109. call_user_func_array([$invocation, 'withConsecutive'], $reorderMap);
  110. foreach ($schedule['remove'] as $remove) {
  111. $this->scheduledStructure->setElementToRemoveList($remove);
  112. }
  113. $this->helperMock->expects($this->atLeastOnce())->method('scheduleElement')
  114. ->with($this->scheduledStructure, $this->structureMock, $this->anything())
  115. ->willReturnCallback(function ($scheduledStructure, $structure, $elementName) use ($schedule) {
  116. /**
  117. * @var $scheduledStructure ScheduledStructure
  118. * @var $structure DataStructure
  119. */
  120. $this->assertContains($elementName, $schedule['structure']);
  121. $scheduledStructure->unsetStructureElement($elementName);
  122. $scheduledStructure->setElement($elementName, []);
  123. $structure->createStructuralElement($elementName, 'block', 'someClass');
  124. });
  125. $this->model->process($this->readerContextMock, $this->generatorContextMock);
  126. $this->assertEquals($expectedSchedule, $this->scheduledStructure->getElements());
  127. }
  128. /**
  129. * Data provider fo testProcess
  130. *
  131. * @return array
  132. */
  133. public function processDataProvider()
  134. {
  135. return [
  136. [
  137. 'schedule' => [
  138. 'structure' => [
  139. 'first.element',
  140. 'second.element',
  141. 'third.element',
  142. 'remove.element',
  143. 'sort.element',
  144. ],
  145. 'move' => [
  146. 'third.element' => ['second.element', 'sibling', false, 'alias'],
  147. ],
  148. 'remove' => ['remove.element'],
  149. 'sort' => [
  150. 'sort.element' => ['second.element', 'sibling', false, 'alias'],
  151. ],
  152. ],
  153. 'expectedScheduledElements' => [
  154. 'first.element' => [], 'second.element' => [], 'third.element' => [], 'sort.element' => []
  155. ],
  156. ],
  157. ];
  158. }
  159. }