109 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Test layout declaration and usage of block elements
 | 
						|
 *
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
namespace Magento\Test\Integrity\Layout;
 | 
						|
 | 
						|
use Magento\Framework\App\Utility\Files;
 | 
						|
 | 
						|
class TemplatesTest extends \PHPUnit\Framework\TestCase
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @var array
 | 
						|
     */
 | 
						|
    protected static $templates = [];
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var array
 | 
						|
     */
 | 
						|
    protected static $blockVirtualTypes = [];
 | 
						|
 | 
						|
    /**
 | 
						|
     * Collect declarations of containers per layout file that have aliases
 | 
						|
     */
 | 
						|
    public static function setUpBeforeClass(): void
 | 
						|
    {
 | 
						|
        $count = 0;
 | 
						|
        self::getBlockVirtualTypesWithDifferentModule();
 | 
						|
        foreach (Files::init()->getLayoutFiles([], false) as $file) {
 | 
						|
            $xml = simplexml_load_file($file);
 | 
						|
            $blocks = $xml->xpath('//block[@template]') ?: [];
 | 
						|
            $fileTemplates = [];
 | 
						|
            foreach ($blocks as $block) {
 | 
						|
                $fileTemplates[] = ['class' => (string)$block['class'], 'file' => (string)$block['template']];
 | 
						|
            }
 | 
						|
            if (!empty($fileTemplates)) {
 | 
						|
                self::$templates[$file] = $fileTemplates;
 | 
						|
                $count += count($fileTemplates);
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test that references to template files follows canonical format.
 | 
						|
     *
 | 
						|
     * path/to/template.phtml Format is prohibited.
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function testTemplateFollowsCanonicalName()
 | 
						|
    {
 | 
						|
        $errors = [];
 | 
						|
        $warnings = [];
 | 
						|
        foreach (self::$templates as $file => $templates) {
 | 
						|
            foreach ($templates as $templatePair) {
 | 
						|
                if (!preg_match('/[A-Za-z0-9]_[A-Za-z0-9]+\:\:[A-Za-z0-9\\_\-\.]+/', $templatePair['file'])) {
 | 
						|
                    if (!isset($errors[$file])) {
 | 
						|
                        $errors[$file] = [];
 | 
						|
                    }
 | 
						|
                    $errors[$file][] = $templatePair['file'];
 | 
						|
                } else {
 | 
						|
                    if (isset(self::$blockVirtualTypes[$templatePair['class']])) {
 | 
						|
                        $warnings[$file][] = $templatePair;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        if (count($errors) > 0) {
 | 
						|
            $message = 'Failed to assert that the template reference follows the canonical format '
 | 
						|
                     . 'Vendor' . '_' . 'Module::path/to/template.phtml. Following files haven\'t pass verification:'
 | 
						|
                     . PHP_EOL;
 | 
						|
            foreach ($errors as $file => $wrongTemplates) {
 | 
						|
                $message .= $file . ':' . PHP_EOL;
 | 
						|
                $message .= '- ' . implode(PHP_EOL . '- ', $wrongTemplates) . PHP_EOL;
 | 
						|
            }
 | 
						|
            $this->fail($message);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Initialize array with the Virtual types for blocks
 | 
						|
     *
 | 
						|
     * Contains just those occurrences where base type and virtual type are located in different modules
 | 
						|
     */
 | 
						|
    private static function getBlockVirtualTypesWithDifferentModule()
 | 
						|
    {
 | 
						|
        $virtual = \Magento\Framework\App\Utility\Classes::getVirtualClasses();
 | 
						|
        foreach ($virtual as $className => $resolvedName) {
 | 
						|
            if (strpos($resolvedName, 'Block') !== false) {
 | 
						|
                $matches = [];
 | 
						|
                preg_match('/([A-Za-z0-9]+\\\\[A-Za-z0-9]+).*/', $className, $matches);
 | 
						|
                if (count($matches) > 1) {
 | 
						|
                    $oldModule = $matches[1];
 | 
						|
                } else {
 | 
						|
                    $oldModule = $className;
 | 
						|
                }
 | 
						|
 | 
						|
                $matches = [];
 | 
						|
                preg_match('/([A-Za-z0-9]+\\\\[A-Za-z0-9]+).*/', $resolvedName, $matches);
 | 
						|
                $newModule = $matches[1];
 | 
						|
                if ($oldModule != $newModule) {
 | 
						|
                    self::$blockVirtualTypes[$className] = $resolvedName;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |