164 lines
5.6 KiB
PHP
164 lines
5.6 KiB
PHP
<?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;
|
|
}
|
|
}
|