149 lines
5.5 KiB
PHP
Executable File
149 lines
5.5 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
namespace Magento\Test\Integrity\Theme;
|
|
|
|
class TemplateFilesTest extends \Magento\TestFramework\TestCase\AbstractIntegrity
|
|
{
|
|
/**
|
|
* Note that data provider is not used in conventional way in order to not overwhelm test statistics
|
|
*/
|
|
public function testTemplates()
|
|
{
|
|
$invalidTemplates = [];
|
|
foreach ($this->templatesDataProvider() as $template) {
|
|
list($area, $themeId, $module, $file, $xml) = $template;
|
|
$params = ['area' => $area, 'themeId' => $themeId, 'module' => $module];
|
|
try {
|
|
$templateFilename = \Magento\TestFramework\Helper\Bootstrap::getObjectmanager()
|
|
->get(\Magento\Framework\View\FileSystem::class)
|
|
->getTemplateFileName($file, $params);
|
|
$this->assertFileExists($templateFilename);
|
|
} catch (\PHPUnit\Framework\ExpectationFailedException $e) {
|
|
$invalidTemplates[] = "File \"{$templateFilename}\" does not exist." .
|
|
PHP_EOL .
|
|
"Parameters: {$area}/{$themeId} {$module}::{$file}" .
|
|
PHP_EOL .
|
|
'Layout update: ' .
|
|
$xml;
|
|
}
|
|
}
|
|
|
|
$this->assertEmpty(
|
|
$invalidTemplates,
|
|
"Invalid templates found:\n\n" . implode("\n-----\n", $invalidTemplates)
|
|
);
|
|
}
|
|
|
|
public function templatesDataProvider()
|
|
{
|
|
$templates = [];
|
|
|
|
$themes = $this->_getDesignThemes();
|
|
foreach ($themes as $theme) {
|
|
/** @var \Magento\Framework\View\Layout\ProcessorInterface $layoutUpdate */
|
|
$layoutUpdate = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
|
|
\Magento\Framework\View\Layout\ProcessorInterface::class,
|
|
['theme' => $theme]
|
|
);
|
|
$layoutTemplates = $this->_getLayoutTemplates($layoutUpdate->getFileLayoutUpdatesXml());
|
|
foreach ($layoutTemplates as $templateData) {
|
|
$templates[] = array_merge([$theme->getArea(), $theme->getId()], $templateData);
|
|
}
|
|
}
|
|
|
|
return $templates;
|
|
}
|
|
|
|
/**
|
|
* Get templates list that are defined in layout
|
|
*
|
|
* @param \SimpleXMLElement $layoutXml
|
|
* @return array
|
|
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
|
|
*/
|
|
protected function _getLayoutTemplates($layoutXml)
|
|
{
|
|
$templates = [];
|
|
|
|
$blocks = $layoutXml->xpath('//block');
|
|
foreach ($blocks as $block) {
|
|
$attributes = $block->attributes();
|
|
if (isset($attributes['template'])) {
|
|
$module = $this->_getBlockModule($block);
|
|
if (!$this->_isTemplateForDisabledModule($module, (string)$attributes['template'])) {
|
|
$templates[] = [$module, (string)$attributes['template'], $block->asXML()];
|
|
}
|
|
}
|
|
}
|
|
|
|
$layoutTemplates = $layoutXml->xpath('//template');
|
|
foreach ($layoutTemplates as $template) {
|
|
$action = $template->xpath("parent::*");
|
|
$attributes = $action[0]->attributes();
|
|
switch ($attributes['method']) {
|
|
case 'setTemplate':
|
|
$parent = $action[0]->xpath("parent::*");
|
|
$attributes = $parent[0]->attributes();
|
|
$referenceName = (string)$attributes['name'];
|
|
$block = $layoutXml->xpath(
|
|
"//block[@name='{$referenceName}'] | //referenceBlock[@name='{$referenceName}']"
|
|
);
|
|
$module = $this->_getBlockModule($block[0]);
|
|
if (!$template->attributes() && !$this->_isTemplateForDisabledModule($module, (string)$template)) {
|
|
$templates[] = [$module, (string)$template, $parent[0]->asXml()];
|
|
}
|
|
break;
|
|
case 'addInformationRenderer':
|
|
case 'addMergeSettingsBlockType':
|
|
$blockType = $action[0]->xpath('block');
|
|
$module = $this->_getBlockModule($blockType[0]);
|
|
if (!$this->_isTemplateForDisabledModule($module, (string)$template)) {
|
|
$templates[] = [$module, (string)$template, $action[0]->asXml()];
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
return $templates;
|
|
}
|
|
|
|
/**
|
|
* Get module name based on block definition in xml layout
|
|
*
|
|
* @param \SimpleXMLElement $xmlNode
|
|
* @return string
|
|
*/
|
|
protected function _getBlockModule($xmlNode)
|
|
{
|
|
$attributes = $xmlNode->attributes();
|
|
if (isset($attributes['type'])) {
|
|
$class = (string)$attributes['type'];
|
|
} else {
|
|
$class = (string)$xmlNode;
|
|
}
|
|
$blockModule = substr($class, 0, strpos($class, '_Block'));
|
|
return $blockModule;
|
|
}
|
|
|
|
/**
|
|
* Returns whether template belongs to a disabled module
|
|
*
|
|
* @param string $blockModule Module of a block that will render this template
|
|
* @param string $template
|
|
* @return bool
|
|
*/
|
|
protected function _isTemplateForDisabledModule($blockModule, $template)
|
|
{
|
|
$enabledModules = $this->_getEnabledModules();
|
|
|
|
if (!isset($enabledModules[$blockModule])) {
|
|
return true;
|
|
}
|
|
return $this->_isFileForDisabledModule($template);
|
|
}
|
|
}
|