Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
GeneratorPoolTest.php
Go to the documentation of this file.
1 <?php
11 
12 use \Magento\Framework\View\Layout\GeneratorPool;
13 use \Magento\Framework\View\Layout\ScheduledStructure;
14 use \Magento\Framework\View\Layout\Data\Structure as DataStructure;
15 
16 class GeneratorPoolTest extends \PHPUnit\Framework\TestCase
17 {
21  protected $helperMock;
22 
26  protected $readerContextMock;
27 
32 
37 
41  protected $structureMock;
42 
46  protected $model;
47 
51  protected function setUp()
52  {
53  // ScheduledStructure
54  $this->readerContextMock = $this->getMockBuilder(\Magento\Framework\View\Layout\Reader\Context::class)
55  ->disableOriginalConstructor()
56  ->getMock();
57  $this->scheduledStructure = new ScheduledStructure();
58  $this->readerContextMock->expects($this->any())->method('getScheduledStructure')
59  ->willReturn($this->scheduledStructure);
60 
61  // DataStructure
62  $this->generatorContextMock = $this->getMockBuilder(\Magento\Framework\View\Layout\Generator\Context::class)
63  ->disableOriginalConstructor()
64  ->getMock();
65  $this->structureMock = $this->getMockBuilder(\Magento\Framework\View\Layout\Data\Structure::class)
66  ->disableOriginalConstructor()
67  ->setMethods(['reorderChildElement'])
68  ->getMock();
69  $this->generatorContextMock->expects($this->any())->method('getStructure')
70  ->willReturn($this->structureMock);
71 
72  $this->helperMock = $this->getMockBuilder(\Magento\Framework\View\Layout\ScheduledStructure\Helper::class)
73  ->disableOriginalConstructor()
74  ->getMock();
75 
76  $helperObjectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
77  $this->model = $helperObjectManager->getObject(
78  \Magento\Framework\View\Layout\GeneratorPool::class,
79  [
80  'helper' => $this->helperMock,
81  'generators' => $this->getGeneratorsMocks()
82  ]
83  );
84  }
85 
89  protected function getGeneratorsMocks()
90  {
91  $firstGenerator = $this->createMock(\Magento\Framework\View\Layout\GeneratorInterface::class);
92  $firstGenerator->expects($this->any())->method('getType')->willReturn('first_generator');
93  $firstGenerator->expects($this->atLeastOnce())->method('process');
94 
95  $secondGenerator = $this->createMock(\Magento\Framework\View\Layout\GeneratorInterface::class);
96  $secondGenerator->expects($this->any())->method('getType')->willReturn('second_generator');
97  $secondGenerator->expects($this->atLeastOnce())->method('process');
98  return [$firstGenerator, $secondGenerator];
99  }
100 
107  public function testProcess($schedule, $expectedSchedule)
108  {
109  foreach ($schedule['structure'] as $structureElement) {
110  $this->scheduledStructure->setStructureElement($structureElement, []);
111  }
112 
113  $reorderMap = [];
114  foreach ($schedule['sort'] as $elementName => $sort) {
115  list($parentName, $sibling, $isAfter) = $sort;
116  $this->scheduledStructure->setElementToSortList($parentName, $elementName, $sibling, $isAfter);
117  $reorderMap[] = [$parentName, $elementName, $sibling, $isAfter];
118  }
119  foreach ($schedule['move'] as $elementName => $move) {
120  $this->scheduledStructure->setElementToMove($elementName, $move);
121  list($destination, $sibling, $isAfter) = $move;
122  $reorderMap[] = [$destination, $elementName, $sibling, $isAfter];
123  }
124  $invocation = $this->structureMock->expects($this->any())->method('reorderChildElement');
125  call_user_func_array([$invocation, 'withConsecutive'], $reorderMap);
126 
127  foreach ($schedule['remove'] as $remove) {
128  $this->scheduledStructure->setElementToRemoveList($remove);
129  }
130 
131  $this->helperMock->expects($this->atLeastOnce())->method('scheduleElement')
132  ->with($this->scheduledStructure, $this->structureMock, $this->anything())
133  ->willReturnCallback(function ($scheduledStructure, $structure, $elementName) use ($schedule) {
138  $this->assertContains($elementName, $schedule['structure']);
139  $scheduledStructure->unsetStructureElement($elementName);
140  $scheduledStructure->setElement($elementName, ['block', []]);
141  $structure->createStructuralElement($elementName, 'block', 'someClass');
142  });
143 
144  $this->model->process($this->readerContextMock, $this->generatorContextMock);
145  $this->assertEquals($expectedSchedule, $this->scheduledStructure->getElements());
146  }
147 
153  public function processDataProvider()
154  {
155  return [
156  [
157  'schedule' => [
158  'structure' => [
159  'first.element',
160  'second.element',
161  'third.element',
162  'remove.element',
163  'sort.element',
164  ],
165  'move' => [
166  'third.element' => ['second.element', 'sibling', false, 'alias'],
167  ],
168  'remove' => ['remove.element'],
169  'sort' => [
170  'sort.element' => ['second.element', 'sibling', false, 'alias'],
171  ],
172  ],
173  'expectedScheduledElements' => [
174  'first.element' => ['block', []],
175  'second.element' => ['block', []],
176  'third.element' => ['block', []],
177  'sort.element' => ['block', []],
178  ],
179  ],
180  ];
181  }
182 }
$elementName
Definition: gallery.phtml:10