layoutFactory = $objectManager->get('Magento\Framework\View\LayoutFactory');
$this->_layout = $this->layoutFactory->create();
$objectManager->get('Magento\Framework\App\Cache\Type\Layout')->clean();
}
public function testConstructorStructure()
{
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
$structure = $objectManager->get('Magento\Framework\View\Layout\Data\Structure');
$structure->createElement('test.container', []);
/** @var $layout \Magento\Framework\View\LayoutInterface */
$layout = $this->layoutFactory->create(['structure' => $structure]);
$this->assertTrue($layout->hasElement('test.container'));
}
/**
* @magentoAppIsolation enabled
* @magentoAppArea frontend
*/
public function testDestructor()
{
$this->_layout->addBlock('Magento\Framework\View\Element\Text', 'test');
$this->assertNotEmpty($this->_layout->getAllBlocks());
$this->_layout->__destruct();
$this->assertEmpty($this->_layout->getAllBlocks());
}
public function testGetUpdate()
{
$this->assertInstanceOf('Magento\Framework\View\Layout\ProcessorInterface', $this->_layout->getUpdate());
}
public function testGenerateXml()
{
$layoutUtility = new Utility\Layout($this);
/** @var $layout \Magento\Framework\View\LayoutInterface */
$layout = $this->getMock(
'Magento\Framework\View\Layout',
['getUpdate'],
$layoutUtility->getLayoutDependencies()
);
$merge = $this->getMock('StdClass', ['asSimplexml']);
$merge->expects(
$this->once()
)->method(
'asSimplexml'
)->will(
$this->returnValue(
simplexml_load_string(
'',
'Magento\Framework\View\Layout\Element'
)
)
);
$layout->expects($this->once())->method('getUpdate')->will($this->returnValue($merge));
$this->assertEmpty($layout->getXpath('/layout/container[@name="container1"]'));
$layout->generateXml();
$this->assertNotEmpty($layout->getXpath('/layout/container[@name="container1"]'));
}
/**
* A smoke test for generating elements
*
* See sophisticated tests at \Magento\Framework\View\LayoutDirectivesTest
* @see \Magento\Framework\View\LayoutDirectivesTest
* @magentoAppIsolation enabled
*/
public function testGenerateGetAllBlocks()
{
$this->_layout->setXml(
simplexml_load_string(
'
',
'Magento\Framework\View\Layout\Element'
)
);
$this->assertEquals([], $this->_layout->getAllBlocks());
$this->_layout->generateElements();
$expected = ['block1', 'block1_schedule_block0', 'schedule_block1', 'schedule_block2'];
$this->assertSame($expected, array_keys($this->_layout->getAllBlocks()));
$child = $this->_layout->getBlock('block1_schedule_block0');
$this->assertSame($this->_layout->getBlock('block1'), $child->getParentBlock());
$this->assertEquals('test', $this->_layout->getBlock('schedule_block1')->getData('template'));
$this->assertEquals('360', $this->_layout->getBlock('schedule_block1')->getData('ttl'));
$this->assertFalse($this->_layout->getBlock('nonexisting'));
}
public function testGetElementProperty()
{
$name = 'test';
$this->_layout->addContainer($name, 'Test', ['option1' => 1, 'option2' => 2]);
$this->assertEquals(
'Test',
$this->_layout->getElementProperty($name, \Magento\Framework\View\Layout\Element::CONTAINER_OPT_LABEL)
);
$this->assertEquals(
\Magento\Framework\View\Layout\Element::TYPE_CONTAINER,
$this->_layout->getElementProperty($name, 'type')
);
$this->assertSame(2, $this->_layout->getElementProperty($name, 'option2'));
$this->_layout->addBlock('Magento\Framework\View\Element\Text', 'text', $name);
$this->assertEquals(
\Magento\Framework\View\Layout\Element::TYPE_BLOCK,
$this->_layout->getElementProperty('text', 'type')
);
$this->assertSame(
['text' => 'text'],
$this->_layout->getElementProperty($name, \Magento\Framework\Data\Structure::CHILDREN)
);
}
/**
* @magentoAppIsolation enabled
*/
public function testIsBlock()
{
$this->assertFalse($this->_layout->isBlock('container'));
$this->assertFalse($this->_layout->isBlock('block'));
$this->_layout->addContainer('container', 'Container');
$this->_layout->addBlock('Magento\Framework\View\Element\Text', 'block');
$this->assertFalse($this->_layout->isBlock('container'));
$this->assertTrue($this->_layout->isBlock('block'));
}
public function testSetUnsetBlock()
{
$expectedBlockName = 'block_' . __METHOD__;
$expectedBlock = $this->_layout->createBlock('Magento\Framework\View\Element\Text');
$this->_layout->setBlock($expectedBlockName, $expectedBlock);
$this->assertSame($expectedBlock, $this->_layout->getBlock($expectedBlockName));
$this->_layout->unsetElement($expectedBlockName);
$this->assertFalse($this->_layout->getBlock($expectedBlockName));
$this->assertFalse($this->_layout->hasElement($expectedBlockName));
}
/**
* @dataProvider createBlockDataProvider
*/
public function testCreateBlock($blockType, $blockName, array $blockData, $expectedName)
{
$expectedData = $blockData + ['type' => $blockType];
$block = $this->_layout->createBlock($blockType, $blockName, ['data' => $blockData]);
$this->assertRegExp($expectedName, $block->getNameInLayout());
$this->assertEquals($expectedData, $block->getData());
}
public function createBlockDataProvider()
{
return [
'named block' => [
'Magento\Framework\View\Element\Template',
'some_block_name_full_class',
['type' => 'Magento\Framework\View\Element\Template', 'is_anonymous' => false],
'/^some_block_name_full_class$/',
],
'no name block' => [
'Magento\Framework\View\Element\Text\ListText',
'',
['type' => 'Magento\Framework\View\Element\Text\ListText', 'key1' => 'value1'],
'/text\\\\list/',
]
];
}
/**
* @dataProvider blockNotExistsDataProvider
* @expectedException \Magento\Framework\Exception\LocalizedException
*/
public function testCreateBlockNotExists($name)
{
$this->_layout->createBlock($name);
}
public function blockNotExistsDataProvider()
{
return [[''], ['block_not_exists']];
}
public function testAddBlock()
{
$this->assertInstanceOf(
'Magento\Framework\View\Element\Text',
$this->_layout->addBlock('Magento\Framework\View\Element\Text', 'block1')
);
$block2 = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
'Magento\Framework\View\Element\Text'
);
$block2->setNameInLayout('block2');
$this->_layout->addBlock($block2, '', 'block1');
$this->assertTrue($this->_layout->hasElement('block1'));
$this->assertTrue($this->_layout->hasElement('block2'));
$this->assertEquals('block1', $this->_layout->getParentName('block2'));
}
/**
* @magentoAppIsolation enabled
* @dataProvider addContainerDataProvider()
*/
public function testAddContainer($htmlTag)
{
$this->assertFalse($this->_layout->hasElement('container'));
$this->_layout->addContainer('container', 'Container', ['htmlTag' => $htmlTag]);
$this->assertTrue($this->_layout->hasElement('container'));
$this->assertTrue($this->_layout->isContainer('container'));
$this->assertEquals($htmlTag, $this->_layout->getElementProperty('container', 'htmlTag'));
$this->_layout->addContainer('container1', 'Container 1', [], 'container', 'c1');
$this->assertEquals('container1', $this->_layout->getChildName('container', 'c1'));
}
public function addContainerDataProvider()
{
return [
['dd'],
['div'],
['dl'],
['fieldset'],
['header'],
['ol'],
['p'],
['section'],
['table'],
['tfoot'],
['ul']
];
}
/**
* @magentoAppIsolation enabled
*/
public function testAddContainerInvalidHtmlTag()
{
$msg = 'Html tag "span" is forbidden for usage in containers. ' .
'Consider to use one of the allowed: dd, div, dl, fieldset, main, header, ' .
'footer, ol, p, section, table, tfoot, ul, nav.';
$this->setExpectedException('Magento\Framework\Exception\LocalizedException', $msg);
$this->_layout->addContainer('container', 'Container', ['htmlTag' => 'span']);
}
/**
* @magentoAppIsolation enabled
*/
public function testGetChildBlock()
{
$this->_layout->addContainer('parent', 'Parent');
$block = $this->_layout->addBlock('Magento\Framework\View\Element\Text', 'block', 'parent', 'block_alias');
$this->_layout->addContainer('container', 'Container', [], 'parent', 'container_alias');
$this->assertSame($block, $this->_layout->getChildBlock('parent', 'block_alias'));
$this->assertFalse($this->_layout->getChildBlock('parent', 'container_alias'));
}
/**
* @return \Magento\Framework\View\Layout
*/
public function testSetChild()
{
$this->_layout->addContainer('one', 'One');
$this->_layout->addContainer('two', 'Two');
$this->_layout->addContainer('three', 'Three');
$this->assertSame($this->_layout, $this->_layout->setChild('one', 'two', ''));
$this->_layout->setChild('one', 'three', 'three_alias');
$this->assertSame(['two', 'three'], $this->_layout->getChildNames('one'));
return $this->_layout;
}
/**
* @param \Magento\Framework\View\LayoutInterface $layout
* @depends testSetChild
*/
public function testReorderChild(\Magento\Framework\View\LayoutInterface $layout)
{
$layout->addContainer('four', 'Four', [], 'one');
// offset +1
$layout->reorderChild('one', 'four', 1);
$this->assertSame(['two', 'four', 'three'], $layout->getChildNames('one'));
// offset -2
$layout->reorderChild('one', 'three', 2, false);
$this->assertSame(['two', 'three', 'four'], $layout->getChildNames('one'));
// after sibling
$layout->reorderChild('one', 'two', 'three');
$this->assertSame(['three', 'two', 'four'], $layout->getChildNames('one'));
// after everyone
$layout->reorderChild('one', 'three', '-');
$this->assertSame(['two', 'four', 'three'], $layout->getChildNames('one'));
// before sibling
$layout->reorderChild('one', 'four', 'two', false);
$this->assertSame(['four', 'two', 'three'], $layout->getChildNames('one'));
// before everyone
$layout->reorderChild('one', 'two', '-', false);
$this->assertSame(['two', 'four', 'three'], $layout->getChildNames('one'));
//reorder by sibling alias
$layout->reorderChild('one', 'two', 'three_alias', true);
$this->assertSame(['four', 'three', 'two'], $layout->getChildNames('one'));
}
/**
* @magentoAppIsolation enabled
*/
public function testGetChildBlocks()
{
$this->_layout->addContainer('parent', 'Parent');
$block1 = $this->_layout->addBlock('Magento\Framework\View\Element\Text', 'block1', 'parent');
$this->_layout->addContainer('container', 'Container', [], 'parent');
$block2 = $this->_layout->addBlock('Magento\Framework\View\Element\Template', 'block2', 'parent');
$this->assertSame(['block1' => $block1, 'block2' => $block2], $this->_layout->getChildBlocks('parent'));
}
/**
* @expectedException \Magento\Framework\Exception\LocalizedException
*/
public function testAddBlockInvalidType()
{
$this->_layout->addBlock('invalid_name', 'child');
}
/**
* @magentoAppIsolation enabled
*/
public function testIsContainer()
{
$block = 'block';
$container = 'container';
$this->_layout->addBlock('Magento\Framework\View\Element\Text', $block);
$this->_layout->addContainer($container, 'Container');
$this->assertFalse($this->_layout->isContainer($block));
$this->assertTrue($this->_layout->isContainer($container));
$this->assertFalse($this->_layout->isContainer('invalid_name'));
}
public function testIsManipulationAllowed()
{
$this->_layout->addBlock('Magento\Framework\View\Element\Text', 'block1');
$this->_layout->addBlock('Magento\Framework\View\Element\Text', 'block2', 'block1');
$this->assertFalse($this->_layout->isManipulationAllowed('block1'));
$this->assertFalse($this->_layout->isManipulationAllowed('block2'));
$this->_layout->addContainer('container1', 'Container 1');
$this->_layout->addBlock('Magento\Framework\View\Element\Text', 'block3', 'container1');
$this->_layout->addContainer('container2', 'Container 2', [], 'container1');
$this->assertFalse($this->_layout->isManipulationAllowed('container1'));
$this->assertTrue($this->_layout->isManipulationAllowed('block3'));
$this->assertTrue($this->_layout->isManipulationAllowed('container2'));
}
public function testRenameElement()
{
$blockName = 'block';
$expBlockName = 'block_renamed';
$containerName = 'container';
$expContainerName = 'container_renamed';
$block = $this->_layout->createBlock('Magento\Framework\View\Element\Text', $blockName);
$this->_layout->addContainer($containerName, 'Container');
$this->assertEquals($block, $this->_layout->getBlock($blockName));
$this->_layout->renameElement($blockName, $expBlockName);
$this->assertEquals($block, $this->_layout->getBlock($expBlockName));
$this->_layout->hasElement($containerName);
$this->_layout->renameElement($containerName, $expContainerName);
$this->_layout->hasElement($expContainerName);
}
public function testGetBlock()
{
$this->assertFalse($this->_layout->getBlock('test'));
$block = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
'Magento\Framework\View\Layout'
)->createBlock(
'Magento\Framework\View\Element\Text'
);
$this->_layout->setBlock('test', $block);
$this->assertSame($block, $this->_layout->getBlock('test'));
}
/**
* @magentoAppIsolation enabled
*/
public function testGetParentName()
{
$this->_layout->addContainer('one', 'One');
$this->_layout->addContainer('two', 'Two', [], 'one');
$this->assertFalse($this->_layout->getParentName('one'));
$this->assertEquals('one', $this->_layout->getParentName('two'));
}
public function testGetElementAlias()
{
$this->_layout->addContainer('one', 'One');
$this->_layout->addContainer('two', 'One', [], 'one', '1');
$this->assertFalse($this->_layout->getElementAlias('one'));
$this->assertEquals('1', $this->_layout->getElementAlias('two'));
}
/**
* @covers \Magento\Framework\View\Layout::addOutputElement
* @covers \Magento\Framework\View\Layout::getOutput
* @covers \Magento\Framework\View\Layout::removeOutputElement
*/
public function testGetOutput()
{
$blockName = 'block_' . __METHOD__;
$expectedText = "some_text_for_{$blockName}";
$block = $this->_layout->addBlock('Magento\Framework\View\Element\Text', $blockName);
$block->setText($expectedText);
$this->_layout->addOutputElement($blockName);
// add the same element twice should not produce output duplicate
$this->_layout->addOutputElement($blockName);
$this->assertEquals($expectedText, $this->_layout->getOutput());
$this->_layout->removeOutputElement($blockName);
$this->assertEmpty($this->_layout->getOutput());
}
public function testGetMessagesBlock()
{
$this->assertInstanceOf('Magento\Framework\View\Element\Messages', $this->_layout->getMessagesBlock());
}
public function testGetBlockSingleton()
{
$block = $this->_layout->getBlockSingleton('Magento\Framework\View\Element\Text');
$this->assertInstanceOf('Magento\Framework\View\Element\Text', $block);
$this->assertSame($block, $this->_layout->getBlockSingleton('Magento\Framework\View\Element\Text'));
}
public function testUpdateContainerAttributes()
{
$this->_layout->setXml(
simplexml_load_file(
__DIR__ . '/_files/layout/container_attributes.xml',
'Magento\Framework\View\Layout\Element'
)
);
$this->_layout->generateElements();
$result = $this->_layout->renderElement('container1', false);
$this->assertEquals('
Test11Test12
', $result);
$result = $this->_layout->renderElement('container2', false);
$this->assertEquals('Test21Test22
', $result);
}
public function testIsCacheable()
{
$this->_layout->setXml(
simplexml_load_file(__DIR__ . '/_files/layout/cacheable.xml', 'Magento\Framework\View\Layout\Element')
);
$this->_layout->generateElements();
$this->assertTrue($this->_layout->isCacheable());
}
public function testIsNonCacheable()
{
$this->_layout->setXml(
simplexml_load_file(__DIR__ . '/_files/layout/non_cacheable.xml', 'Magento\Framework\View\Layout\Element')
);
$this->_layout->generateElements();
$this->assertFalse($this->_layout->isCacheable());
}
}