164 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
namespace Magento\Test\Integrity\Modular;
 | 
						|
 | 
						|
use Magento\Framework\App\Filesystem\DirectoryList;
 | 
						|
 | 
						|
/**
 | 
						|
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 | 
						|
 */
 | 
						|
class DiConfigFilesTest extends \PHPUnit\Framework\TestCase
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * Primary DI configs from app/etc
 | 
						|
     * @var array
 | 
						|
     */
 | 
						|
    protected static $_primaryFiles = [];
 | 
						|
 | 
						|
    /**
 | 
						|
     * Global DI configs from all modules
 | 
						|
     * @var array
 | 
						|
     */
 | 
						|
    protected static $_moduleGlobalFiles = [];
 | 
						|
 | 
						|
    /**
 | 
						|
     * Area DI configs from all modules
 | 
						|
     * @var array
 | 
						|
     */
 | 
						|
    protected static $_moduleAreaFiles = [];
 | 
						|
 | 
						|
    protected function _prepareFiles()
 | 
						|
    {
 | 
						|
        //init primary configs
 | 
						|
        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
 | 
						|
        /** @var $filesystem \Magento\Framework\Filesystem */
 | 
						|
        $filesystem = $objectManager->get(\Magento\Framework\Filesystem::class);
 | 
						|
        $configDirectory = $filesystem->getDirectoryRead(DirectoryList::CONFIG);
 | 
						|
        $fileIteratorFactory = $objectManager->get(\Magento\Framework\Config\FileIteratorFactory::class);
 | 
						|
        $search = [];
 | 
						|
        foreach ($configDirectory->search('{*/di.xml,di.xml}') as $path) {
 | 
						|
            $search[] = $configDirectory->getAbsolutePath($path);
 | 
						|
        }
 | 
						|
        self::$_primaryFiles = $fileIteratorFactory->create($search);
 | 
						|
        //init module global configs
 | 
						|
        /** @var $modulesReader \Magento\Framework\Module\Dir\Reader */
 | 
						|
        $modulesReader = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
 | 
						|
            ->get(\Magento\Framework\Module\Dir\Reader::class);
 | 
						|
        self::$_moduleGlobalFiles = $modulesReader->getConfigurationFiles('di.xml');
 | 
						|
 | 
						|
        //init module area configs
 | 
						|
        $areas = ['adminhtml', 'frontend'];
 | 
						|
        foreach ($areas as $area) {
 | 
						|
            $moduleAreaFiles = $modulesReader->getConfigurationFiles($area . '/di.xml');
 | 
						|
            self::$_moduleAreaFiles[$area] = $moduleAreaFiles;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param string $filePath
 | 
						|
     * @param string $xml
 | 
						|
     * @throws \Exception
 | 
						|
     * @dataProvider linearFilesProvider
 | 
						|
     */
 | 
						|
    public function testDiConfigFileWithoutMerging($filePath, $xml)
 | 
						|
    {
 | 
						|
        /** @var \Magento\Framework\ObjectManager\Config\SchemaLocator $schemaLocator */
 | 
						|
        $schemaLocator = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
 | 
						|
            \Magento\Framework\ObjectManager\Config\SchemaLocator::class
 | 
						|
        );
 | 
						|
 | 
						|
        $dom = new \DOMDocument();
 | 
						|
        $dom->loadXML($xml);
 | 
						|
 | 
						|
        libxml_use_internal_errors(true);
 | 
						|
        $result = \Magento\Framework\Config\Dom::validateDomDocument($dom, $schemaLocator->getSchema());
 | 
						|
        libxml_use_internal_errors(false);
 | 
						|
 | 
						|
        if (!empty($result)) {
 | 
						|
            $this->fail(
 | 
						|
                'File ' . $filePath . ' has invalid xml structure. '
 | 
						|
                . implode("\n", $result)
 | 
						|
            );
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function linearFilesProvider()
 | 
						|
    {
 | 
						|
        if (empty(self::$_primaryFiles)) {
 | 
						|
            $this->_prepareFiles();
 | 
						|
        }
 | 
						|
 | 
						|
        $common = array_merge(self::$_primaryFiles->toArray(), self::$_moduleGlobalFiles->toArray());
 | 
						|
 | 
						|
        foreach (self::$_moduleAreaFiles as $files) {
 | 
						|
            $common = array_merge($common, $files->toArray());
 | 
						|
        }
 | 
						|
 | 
						|
        $output = [];
 | 
						|
        foreach ($common as $path => $content) {
 | 
						|
            $output[] = [substr($path, strlen(BP)), $content];
 | 
						|
        }
 | 
						|
 | 
						|
        return $output;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param array $files
 | 
						|
     * @dataProvider mixedFilesProvider
 | 
						|
     */
 | 
						|
    public function testMergedDiConfig(array $files)
 | 
						|
    {
 | 
						|
        $mapperMock = $this->createMock(\Magento\Framework\ObjectManager\Config\Mapper\Dom::class);
 | 
						|
        $fileResolverMock = $this->getMockBuilder(\Magento\Framework\Config\FileResolverInterface::class)
 | 
						|
            ->setMethods(['read'])
 | 
						|
            ->getMockForAbstractClass();
 | 
						|
        $fileResolverMock->expects($this->any())->method('read')->willReturn($files);
 | 
						|
        $validationStateMock = $this->createPartialMock(
 | 
						|
            \Magento\Framework\Config\ValidationStateInterface::class,
 | 
						|
            ['isValidationRequired']
 | 
						|
        );
 | 
						|
        $validationStateMock->expects($this->any())->method('isValidationRequired')->willReturn(true);
 | 
						|
 | 
						|
        /** @var \Magento\Framework\ObjectManager\Config\SchemaLocator $schemaLocator */
 | 
						|
        $schemaLocator = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
 | 
						|
            \Magento\Framework\ObjectManager\Config\SchemaLocator::class
 | 
						|
        );
 | 
						|
 | 
						|
        new \Magento\Framework\ObjectManager\Config\Reader\Dom(
 | 
						|
            $fileResolverMock,
 | 
						|
            $mapperMock,
 | 
						|
            $schemaLocator,
 | 
						|
            $validationStateMock
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function mixedFilesProvider()
 | 
						|
    {
 | 
						|
        if (empty(self::$_primaryFiles)) {
 | 
						|
            $this->_prepareFiles();
 | 
						|
        }
 | 
						|
        foreach (self::$_primaryFiles->toArray() as $file) {
 | 
						|
            $primaryFiles[] = [[$file]];
 | 
						|
        }
 | 
						|
        $primaryFiles['all primary config files'] = [self::$_primaryFiles->toArray()];
 | 
						|
 | 
						|
        foreach (self::$_moduleGlobalFiles->toArray() as $file) {
 | 
						|
            $moduleFiles[] = [[$file]];
 | 
						|
        }
 | 
						|
        $moduleFiles['all module global config files'] = [self::$_moduleGlobalFiles->toArray()];
 | 
						|
 | 
						|
        $areaFiles = [];
 | 
						|
        foreach (self::$_moduleAreaFiles as $area => $files) {
 | 
						|
            foreach ($files->toArray() as $file) {
 | 
						|
                $areaFiles[] = [[$file]];
 | 
						|
            }
 | 
						|
            $areaFiles["all {$area} config files"] = [self::$_moduleAreaFiles[$area]->toArray()];
 | 
						|
        }
 | 
						|
 | 
						|
        return $primaryFiles + $moduleFiles + $areaFiles;
 | 
						|
    }
 | 
						|
}
 |