Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
MenuTest.php
Go to the documentation of this file.
1 <?php
7 
11 
12 class MenuTest extends \PHPUnit\Framework\TestCase
13 {
17  protected $_model;
18 
22  protected $_logger;
23 
27  protected $_items = [];
28 
32  private $objectManagerHelper;
33 
34  protected function setUp()
35  {
36  $this->objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
37  $this->_items['item1'] = $this->createMock(\Magento\Backend\Model\Menu\Item::class);
38  $this->_items['item1']->expects($this->any())->method('getId')->will($this->returnValue('item1'));
39 
40  $this->_items['item2'] = $this->createMock(\Magento\Backend\Model\Menu\Item::class);
41  $this->_items['item2']->expects($this->any())->method('getId')->will($this->returnValue('item2'));
42 
43  $this->_items['item3'] = $this->createMock(\Magento\Backend\Model\Menu\Item::class);
44  $this->_items['item3']->expects($this->any())->method('getId')->will($this->returnValue('item3'));
45 
46  $this->_logger = $this->createMock(\Psr\Log\LoggerInterface::class);
47 
48  $this->_model = $this->objectManagerHelper->getObject(
49  \Magento\Backend\Model\Menu::class,
50  [
51  'logger' => $this->_logger
52  ]
53  );
54  }
55 
56  public function testAdd()
57  {
58  $item = $this->createMock(\Magento\Backend\Model\Menu\Item::class);
59  $this->_model->add($item);
60  $this->assertCount(1, $this->_model);
61  $this->assertEquals($item, $this->_model[0]);
62  }
63 
64  public function testAddDoLogAddAction()
65  {
66  $result = $this->_model->add($this->_items['item1']);
67  $this->assertNull($result);
68  }
69 
70  public function testAddToItem()
71  {
72  $subMenu = $this->getMockBuilder(\Magento\Backend\Model\Menu::class)->disableOriginalConstructor()->getMock();
73  $subMenu->expects($this->once())->method("add")->with($this->_items['item2']);
74 
75  $this->_items['item1']->expects($this->once())->method("getChildren")->will($this->returnValue($subMenu));
76 
77  $this->_model->add($this->_items['item1']);
78  $this->_model->add($this->_items['item2'], 'item1');
79  }
80 
82  {
83  $this->_model->add($this->createMock(\Magento\Backend\Model\Menu\Item::class));
84  $this->_model->add($this->createMock(\Magento\Backend\Model\Menu\Item::class));
85  $this->_model->add($this->createMock(\Magento\Backend\Model\Menu\Item::class));
86 
87  $this->_model->add($this->_items['item1'], null, 2);
88  $this->assertCount(4, $this->_model);
89  $this->assertEquals($this->_items['item1'], $this->_model[3]);
90  }
91 
92  public function testAddSortsItemsByTheirSortIndex()
93  {
94  $this->_model->add($this->_items['item1'], null, 10);
95  $this->_model->add($this->_items['item2'], null, 20);
96  $this->_model->add($this->_items['item3'], null, 15);
97 
98  $this->assertCount(3, $this->_model);
99  $itemsOrdered = [];
100  foreach ($this->_model as $item) {
102  $itemsOrdered[] = $item->getId();
103  }
104  $this->assertEquals(['item1', 'item3', 'item2'], $itemsOrdered);
105  }
106 
107  public function testGet()
108  {
109  $this->_model->add($this->_items['item1']);
110  $this->_model->add($this->_items['item2']);
111 
112  $this->assertEquals($this->_items['item1'], $this->_model[0]);
113  $this->assertEquals($this->_items['item2'], $this->_model[1]);
114  $this->assertEquals($this->_items['item1'], $this->_model->get(\item1::class));
115  $this->assertEquals($this->_items['item2'], $this->_model->get(\item2::class));
116  }
117 
118  public function testGetRecursive()
119  {
120  $menuOne = $this->objectManagerHelper->getObject(
121  \Magento\Backend\Model\Menu::class,
122  [
123  'logger' => $this->_logger
124  ]
125  );
126  $menuTwo = $this->objectManagerHelper->getObject(
127  \Magento\Backend\Model\Menu::class,
128  [
129  'logger' => $this->_logger
130  ]
131  );
132 
133  $this->_items['item1']->expects($this->any())->method('hasChildren')->will($this->returnValue(true));
134  $this->_items['item1']->expects($this->any())->method('getChildren')->will($this->returnValue($menuOne));
135  $this->_model->add($this->_items['item1']);
136 
137  $this->_items['item2']->expects($this->any())->method('hasChildren')->will($this->returnValue(true));
138  $this->_items['item2']->expects($this->any())->method('getChildren')->will($this->returnValue($menuTwo));
139  $menuOne->add($this->_items['item2']);
140 
141  $this->_items['item3']->expects($this->any())->method('hasChildren')->will($this->returnValue(false));
142  $menuTwo->add($this->_items['item3']);
143 
144  $this->assertEquals($this->_items['item1'], $this->_model->get('item1'));
145  $this->assertEquals($this->_items['item2'], $this->_model->get('item2'));
146  $this->assertEquals($this->_items['item3'], $this->_model->get('item3'));
147  }
148 
149  public function testMove()
150  {
151  $this->_model->add($this->_items['item1']);
152  $this->_model->add($this->_items['item2']);
153  $this->_model->add($this->_items['item3']);
154 
155  $subMenu = $this->getMockBuilder(\Magento\Backend\Model\Menu::class)->disableOriginalConstructor()->getMock();
156  $subMenu->expects($this->once())->method("add")->with($this->_items['item3']);
157 
158  $this->_items['item1']->expects($this->once())->method("getChildren")->will($this->returnValue($subMenu));
159 
160  $this->_model->move('item3', 'item1');
161 
162  $this->assertCount(2, $this->_model);
163  $this->assertFalse(isset($this->_model[2]), "ttt");
164  }
165 
170  {
171  $this->_model->add($this->_items['item1']);
172  $this->_model->add($this->_items['item2']);
173  $this->_model->add($this->_items['item3']);
174 
175  $this->_model->move('item4', 'item1');
176  }
177 
182  {
183  $this->_model->add($this->_items['item1']);
184  $this->_model->add($this->_items['item2']);
185  $this->_model->add($this->_items['item3']);
186 
187  $this->_model->move('item3', 'item4');
188  }
189 
190  public function testRemoveRemovesMenuItem()
191  {
192  $this->_model->add($this->_items['item1']);
193 
194  $this->assertCount(1, $this->_model);
195  $this->assertEquals($this->_items['item1'], $this->_model->get('item1'));
196 
197  $this->_model->remove('item1');
198  $this->assertCount(0, $this->_model);
199  $this->assertNull($this->_model->get('item1'));
200  }
201 
203  {
204  $menuMock = $this->getMockBuilder(\Magento\Backend\Model\Menu::class)->disableOriginalConstructor()->getMock();
205  $menuMock->expects($this->once())->method('remove')->with($this->equalTo('item2'));
206 
207  $this->_items['item1']->expects($this->any())->method('hasChildren')->will($this->returnValue(true));
208  $this->_items['item1']->expects($this->any())->method('getChildren')->will($this->returnValue($menuMock));
209  $this->_model->add($this->_items['item1']);
210 
211  $result = $this->_model->remove('item2');
212  $this->assertNull($result);
213  }
214 
215  public function testRemoveDoLogRemoveAction()
216  {
217  $this->_model->add($this->_items['item1']);
218  $result = $this->_model->remove('item1');
219  $this->assertTrue($result);
220  }
221 
223  {
224  $this->_model->add($this->_items['item1'], null, 10);
225  $this->_model->add($this->_items['item2'], null, 20);
226 
227  $this->assertEquals($this->_items['item2'], $this->_model[20]);
228  $this->_model->reorder('item2', 5);
229  $this->assertEquals($this->_items['item2'], $this->_model[5]);
230  $this->assertFalse(isset($this->_model[20]));
231  }
232 
234  {
235  $this->_logger->expects($this->any())->method('log');
236 
237  $subMenu = $this->objectManagerHelper->getObject(
238  \Magento\Backend\Model\Menu::class,
239  [
240  'logger' => $this->_logger
241  ]
242  );
243 
244  $this->_items['item1']->expects($this->any())->method("hasChildren")->will($this->returnValue(true));
245 
246  $this->_items['item1']->expects($this->any())->method("getChildren")->will($this->returnValue($subMenu));
247 
248  $this->_model->add($this->_items['item1']);
249  $this->_model->add($this->_items['item2'], 'item1', 10);
250  $this->_model->add($this->_items['item3'], 'item1', 20);
251 
252  $this->_model->reorder('item2', 25);
253  $subMenu->reorder('item3', 30);
254 
255  $this->assertEquals($this->_items['item2'], $subMenu[25]);
256  $this->assertEquals($this->_items['item3'], $subMenu[30]);
257  }
258 
259  public function testIsLast()
260  {
261  $this->_model->add($this->_items['item1'], null, 10);
262  $this->_model->add($this->_items['item2'], null, 16);
263  $this->_model->add($this->_items['item3'], null, 15);
264 
265  $this->assertTrue($this->_model->isLast($this->_items['item2']));
266  $this->assertFalse($this->_model->isLast($this->_items['item3']));
267  }
268 
270  {
271  $item = $this->createPartialMock(\Magento\Backend\Model\Menu\Item::class, ['getFirstAvailable', 'isAllowed']);
272  $item->expects($this->never())->method('getFirstAvailable');
273  $this->_model->add($item);
274 
275  $this->_items['item1']->expects($this->once())->method('isAllowed')->will($this->returnValue(true));
276  $this->_items['item1']->expects($this->once())->method('isDisabled')->will($this->returnValue(false));
277  $this->_items['item1']->expects($this->once())->method('hasChildren');
278  $this->_model->add($this->_items['item1']);
279 
280  $this->assertEquals($this->_items['item1'], $this->_model->getFirstAvailable());
281  }
282 
284  {
285  $this->_items['item1']->expects($this->exactly(1))->method('isAllowed')->will($this->returnValue(true));
286  $this->_items['item1']->expects($this->exactly(1))->method('isDisabled')->will($this->returnValue(true));
287  $this->_model->add($this->_items['item1']);
288 
289  $this->_items['item2']->expects($this->exactly(1))->method('isAllowed')->will($this->returnValue(false));
290  $this->_model->add($this->_items['item2']);
291 
292  $this->_items['item3']->expects($this->exactly(1))->method('isAllowed')->will($this->returnValue(true));
293  $this->_items['item3']->expects($this->exactly(1))->method('isDisabled')->will($this->returnValue(false));
294  $this->_model->add($this->_items['item3']);
295 
296  $this->assertEquals($this->_items['item3'], $this->_model->getFirstAvailable());
297  }
298 
299  public function testMultipleIterationsWorkProperly()
300  {
301  $this->_model->add($this->createMock(\Magento\Backend\Model\Menu\Item::class));
302  $this->_model->add($this->createMock(\Magento\Backend\Model\Menu\Item::class));
303 
304  $this->_model->add($this->_items['item1']);
305  $this->_model->add($this->_items['item2']);
306 
307  $items = [];
309  foreach ($this->_model as $item) {
310  $items[] = $item->getId();
311  }
312 
313  $itemsTwo = [];
314  foreach ($this->_model as $item) {
315  $itemsTwo[] = $item->getId();
316  }
317  $this->assertEquals($items, $itemsTwo);
318  }
319 
323  public function testNestedLoop()
324  {
325  $this->_model->add($this->_items['item1']);
326  $this->_model->add($this->_items['item2']);
327  $this->_model->add($this->_items['item3']);
328 
329  $expected = [
330  'item1' => ['item1', 'item2', 'item3'],
331  'item2' => ['item1', 'item2', 'item3'],
332  'item3' => ['item1', 'item2', 'item3'],
333  ];
334  $actual = [];
335  foreach ($this->_model as $valLoopOne) {
336  $keyLevelOne = $valLoopOne->getId();
337  foreach ($this->_model as $valLoopTwo) {
338  $actual[$keyLevelOne][] = $valLoopTwo->getId();
339  }
340  }
341  $this->assertEquals($expected, $actual);
342  }
343 
344  public function testSerialize()
345  {
346  $serializerMock = $this->createMock(SerializerInterface::class);
347  $serializerMock->expects($this->once())
348  ->method('serialize')
349  ->with([['arrayData']])
350  ->willReturn('serializedString');
351  $menu = $this->objectManagerHelper->getObject(
352  \Magento\Backend\Model\Menu::class,
353  [
354  'logger' => $this->_logger,
355  'serializer' => $serializerMock,
356  ]
357  );
358  $itemMock = $this->createMock(\Magento\Backend\Model\Menu\Item::class);
359  $itemMock->expects($this->any())->method('getId')->will($this->returnValue('item1'));
360  $itemMock->expects($this->once())
361  ->method('toArray')
362  ->willReturn(['arrayData']);
363  $menu->add($itemMock);
364  $this->assertEquals('serializedString', $menu->serialize());
365  }
366 
367  public function testUnserialize()
368  {
369  $serializerMock = $this->createMock(SerializerInterface::class);
370  $serializerMock->expects($this->once())
371  ->method('unserialize')
372  ->willReturn([['unserializedData']]);
373  $menuItemFactoryMock = $this->createMock(Factory::class);
374  $menuItemFactoryMock->expects($this->once())
375  ->method('create')
376  ->with(['unserializedData']);
377  $menu = $this->objectManagerHelper->getObject(
378  \Magento\Backend\Model\Menu::class,
379  [
380  'logger' => $this->_logger,
381  'serializer' => $serializerMock,
382  'menuItemFactory' => $menuItemFactoryMock,
383  ]
384  );
385  $menu->unserialize('serializedString');
386  }
387 }
$items