![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/magento/module-backend/Test/Unit/Model/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ declare(strict_types=1); namespace Magento\Backend\Test\Unit\Model; use Magento\Backend\Model\Menu; use Magento\Backend\Model\Menu\Item; use Magento\Backend\Model\Menu\Item\Factory; use Magento\Framework\Serialize\SerializerInterface; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; class MenuTest extends TestCase { /** * @var Menu */ protected $_model; /** * @var LoggerInterface */ protected $_logger; /** * @var Item[] */ protected $_items = []; /** * @var ObjectManager */ private $objectManagerHelper; protected function setUp(): void { $this->objectManagerHelper = new ObjectManager($this); $this->_items['item1'] = $this->createMock(Item::class); $this->_items['item1']->expects($this->any())->method('getId')->willReturn('item1'); $this->_items['item2'] = $this->createMock(Item::class); $this->_items['item2']->expects($this->any())->method('getId')->willReturn('item2'); $this->_items['item3'] = $this->createMock(Item::class); $this->_items['item3']->expects($this->any())->method('getId')->willReturn('item3'); $this->_logger = $this->getMockForAbstractClass(LoggerInterface::class); $this->_model = $this->objectManagerHelper->getObject( Menu::class, [ 'logger' => $this->_logger ] ); } public function testAdd() { $item = $this->createMock(Item::class); $this->_model->add($item); $this->assertCount(1, $this->_model); $this->assertEquals($item, $this->_model[0]); } public function testAddDoLogAddAction() { $result = $this->_model->add($this->_items['item1']); $this->assertNull($result); } public function testAddToItem() { $subMenu = $this->getMockBuilder(Menu::class) ->disableOriginalConstructor() ->getMock(); $subMenu->expects($this->once())->method("add")->with($this->_items['item2']); $this->_items['item1']->expects($this->once())->method("getChildren")->willReturn($subMenu); $this->_model->add($this->_items['item1']); $this->_model->add($this->_items['item2'], 'item1'); } public function testAddWithSortIndexThatAlreadyExistsAddsItemOnNextAvailableIndex() { $this->_model->add($this->createMock(Item::class)); $this->_model->add($this->createMock(Item::class)); $this->_model->add($this->createMock(Item::class)); $this->_model->add($this->_items['item1'], null, 2); $this->assertCount(4, $this->_model); $this->assertEquals($this->_items['item1'], $this->_model[3]); } public function testAddSortsItemsByTheirSortIndex() { $this->_model->add($this->_items['item1'], null, 10); $this->_model->add($this->_items['item2'], null, 20); $this->_model->add($this->_items['item3'], null, 15); $this->assertCount(3, $this->_model); $itemsOrdered = []; foreach ($this->_model as $item) { /** @var \Magento\Backend\Model\Menu\Item $item */ $itemsOrdered[] = $item->getId(); } $this->assertEquals(['item1', 'item3', 'item2'], $itemsOrdered); } public function testGet() { $this->_model->add($this->_items['item1']); $this->_model->add($this->_items['item2']); $this->assertEquals($this->_items['item1'], $this->_model[0]); $this->assertEquals($this->_items['item2'], $this->_model[1]); } public function testGetRecursive() { $menuOne = $this->objectManagerHelper->getObject( Menu::class, [ 'logger' => $this->_logger ] ); $menuTwo = $this->objectManagerHelper->getObject( Menu::class, [ 'logger' => $this->_logger ] ); $this->_items['item1']->expects($this->any())->method('hasChildren')->willReturn(true); $this->_items['item1']->expects($this->any())->method('getChildren')->willReturn($menuOne); $this->_model->add($this->_items['item1']); $this->_items['item2']->expects($this->any())->method('hasChildren')->willReturn(true); $this->_items['item2']->expects($this->any())->method('getChildren')->willReturn($menuTwo); $menuOne->add($this->_items['item2']); $this->_items['item3']->expects($this->any())->method('hasChildren')->willReturn(false); $menuTwo->add($this->_items['item3']); $this->assertEquals($this->_items['item1'], $this->_model->get('item1')); $this->assertEquals($this->_items['item2'], $this->_model->get('item2')); $this->assertEquals($this->_items['item3'], $this->_model->get('item3')); } public function testMove() { $this->_model->add($this->_items['item1']); $this->_model->add($this->_items['item2']); $this->_model->add($this->_items['item3']); $subMenu = $this->getMockBuilder(Menu::class) ->disableOriginalConstructor() ->getMock(); $subMenu->expects($this->once())->method("add")->with($this->_items['item3']); $this->_items['item1']->expects($this->once())->method("getChildren")->willReturn($subMenu); $this->_model->move('item3', 'item1'); $this->assertCount(2, $this->_model); $this->assertArrayNotHasKey(2, $this->_model, "ttt"); } public function testMoveNonExistentItemThrowsException() { $this->expectException('InvalidArgumentException'); $this->_model->add($this->_items['item1']); $this->_model->add($this->_items['item2']); $this->_model->add($this->_items['item3']); $this->_model->move('item4', 'item1'); } public function testMoveToNonExistentItemThrowsException() { $this->expectException('InvalidArgumentException'); $this->_model->add($this->_items['item1']); $this->_model->add($this->_items['item2']); $this->_model->add($this->_items['item3']); $this->_model->move('item3', 'item4'); } public function testRemoveRemovesMenuItem() { $this->_model->add($this->_items['item1']); $this->assertCount(1, $this->_model); $this->assertEquals($this->_items['item1'], $this->_model->get('item1')); $this->_model->remove('item1'); $this->assertCount(0, $this->_model); $this->assertNull($this->_model->get('item1')); } public function testRemoveRemovesMenuItemRecursively() { $menuMock = $this->getMockBuilder(Menu::class) ->disableOriginalConstructor() ->getMock(); $menuMock->expects($this->once())->method('remove')->with('item2'); $this->_items['item1']->expects($this->any())->method('hasChildren')->willReturn(true); $this->_items['item1']->expects($this->any())->method('getChildren')->willReturn($menuMock); $this->_model->add($this->_items['item1']); $result = $this->_model->remove('item2'); $this->assertNull($result); } public function testRemoveDoLogRemoveAction() { $this->_model->add($this->_items['item1']); $result = $this->_model->remove('item1'); $this->assertTrue($result); } public function testReorderReordersItemOnTopLevel() { $this->_model->add($this->_items['item1'], null, 10); $this->_model->add($this->_items['item2'], null, 20); $this->assertEquals($this->_items['item2'], $this->_model[20]); $this->_model->reorder('item2', 5); $this->assertEquals($this->_items['item2'], $this->_model[5]); $this->assertArrayNotHasKey(20, $this->_model); } public function testReorderReordersItemOnItsLevel() { $this->_logger->expects($this->any())->method('log'); $subMenu = $this->objectManagerHelper->getObject( Menu::class, [ 'logger' => $this->_logger ] ); $this->_items['item1']->expects($this->any())->method("hasChildren")->willReturn(true); $this->_items['item1']->expects($this->any())->method("getChildren")->willReturn($subMenu); $this->_model->add($this->_items['item1']); $this->_model->add($this->_items['item2'], 'item1', 10); $this->_model->add($this->_items['item3'], 'item1', 20); $this->_model->reorder('item2', 25); $subMenu->reorder('item3', 30); $this->assertEquals($this->_items['item2'], $subMenu[25]); $this->assertEquals($this->_items['item3'], $subMenu[30]); } public function testIsLast() { $this->_model->add($this->_items['item1'], null, 10); $this->_model->add($this->_items['item2'], null, 16); $this->_model->add($this->_items['item3'], null, 15); $this->assertTrue($this->_model->isLast($this->_items['item2'])); $this->assertFalse($this->_model->isLast($this->_items['item3'])); } public function testGetFirstAvailableReturnsLeafNode() { $item = $this->getMockBuilder(Item::class) ->addMethods(['getFirstAvailable']) ->onlyMethods(['isAllowed']) ->disableOriginalConstructor() ->getMock(); $item->expects($this->never())->method('getFirstAvailable'); $this->_model->add($item); $this->_items['item1']->expects($this->once())->method('isAllowed')->willReturn(true); $this->_items['item1']->expects($this->once())->method('isDisabled')->willReturn(false); $this->_items['item1']->expects($this->once())->method('hasChildren'); $this->_model->add($this->_items['item1']); $this->assertEquals($this->_items['item1'], $this->_model->getFirstAvailable()); } public function testGetFirstAvailableReturnsOnlyAllowedAndNotDisabledItem() { $this->_items['item1']->expects($this->exactly(1))->method('isAllowed')->willReturn(true); $this->_items['item1']->expects($this->exactly(1))->method('isDisabled')->willReturn(true); $this->_model->add($this->_items['item1']); $this->_items['item2']->expects($this->exactly(1))->method('isAllowed')->willReturn(false); $this->_model->add($this->_items['item2']); $this->_items['item3']->expects($this->exactly(1))->method('isAllowed')->willReturn(true); $this->_items['item3']->expects($this->exactly(1))->method('isDisabled')->willReturn(false); $this->_model->add($this->_items['item3']); $this->assertEquals($this->_items['item3'], $this->_model->getFirstAvailable()); } public function testMultipleIterationsWorkProperly() { $this->_model->add($this->createMock(Item::class)); $this->_model->add($this->createMock(Item::class)); $this->_model->add($this->_items['item1']); $this->_model->add($this->_items['item2']); $items = []; /** @var \Magento\Backend\Model\Menu\Item $item */ foreach ($this->_model as $item) { $items[] = $item->getId(); } $itemsTwo = []; foreach ($this->_model as $item) { $itemsTwo[] = $item->getId(); } $this->assertEquals($items, $itemsTwo); } /** * Test reset iterator to first element before each foreach */ public function testNestedLoop() { $this->_model->add($this->_items['item1']); $this->_model->add($this->_items['item2']); $this->_model->add($this->_items['item3']); $expected = [ 'item1' => ['item1', 'item2', 'item3'], 'item2' => ['item1', 'item2', 'item3'], 'item3' => ['item1', 'item2', 'item3'], ]; $actual = []; foreach ($this->_model as $valLoopOne) { $keyLevelOne = $valLoopOne->getId(); foreach ($this->_model as $valLoopTwo) { $actual[$keyLevelOne][] = $valLoopTwo->getId(); } } $this->assertEquals($expected, $actual); } public function testSerialize() { $serializerMock = $this->getMockForAbstractClass(SerializerInterface::class); $serializerMock->expects($this->once()) ->method('serialize') ->with([['arrayData']]) ->willReturn('serializedString'); $menu = $this->objectManagerHelper->getObject( Menu::class, [ 'logger' => $this->_logger, 'serializer' => $serializerMock, ] ); $itemMock = $this->createMock(Item::class); $itemMock->expects($this->any())->method('getId')->willReturn('item1'); $itemMock->expects($this->once()) ->method('toArray') ->willReturn(['arrayData']); $menu->add($itemMock); $this->assertEquals('serializedString', $menu->serialize()); } public function testUnserialize() { $serializerMock = $this->getMockForAbstractClass(SerializerInterface::class); $serializerMock->expects($this->once()) ->method('unserialize') ->willReturn([['unserializedData']]); $menuItemFactoryMock = $this->createMock(Factory::class); $menuItemFactoryMock->expects($this->once()) ->method('create') ->with(['unserializedData']); $menu = $this->objectManagerHelper->getObject( Menu::class, [ 'logger' => $this->_logger, 'serializer' => $serializerMock, 'menuItemFactory' => $menuItemFactoryMock, ] ); $menu->unserialize('serializedString'); } }