DiConfigFilesTest.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Test\Integrity\Modular;
  7. use Magento\Framework\App\Filesystem\DirectoryList;
  8. /**
  9. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  10. */
  11. class DiConfigFilesTest extends \PHPUnit\Framework\TestCase
  12. {
  13. /**
  14. * Primary DI configs from app/etc
  15. * @var array
  16. */
  17. protected static $_primaryFiles = [];
  18. /**
  19. * Global DI configs from all modules
  20. * @var array
  21. */
  22. protected static $_moduleGlobalFiles = [];
  23. /**
  24. * Area DI configs from all modules
  25. * @var array
  26. */
  27. protected static $_moduleAreaFiles = [];
  28. protected function _prepareFiles()
  29. {
  30. //init primary configs
  31. $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
  32. /** @var $filesystem \Magento\Framework\Filesystem */
  33. $filesystem = $objectManager->get(\Magento\Framework\Filesystem::class);
  34. $configDirectory = $filesystem->getDirectoryRead(DirectoryList::CONFIG);
  35. $fileIteratorFactory = $objectManager->get(\Magento\Framework\Config\FileIteratorFactory::class);
  36. $search = [];
  37. foreach ($configDirectory->search('{*/di.xml,di.xml}') as $path) {
  38. $search[] = $configDirectory->getAbsolutePath($path);
  39. }
  40. self::$_primaryFiles = $fileIteratorFactory->create($search);
  41. //init module global configs
  42. /** @var $modulesReader \Magento\Framework\Module\Dir\Reader */
  43. $modulesReader = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
  44. ->get(\Magento\Framework\Module\Dir\Reader::class);
  45. self::$_moduleGlobalFiles = $modulesReader->getConfigurationFiles('di.xml');
  46. //init module area configs
  47. $areas = ['adminhtml', 'frontend'];
  48. foreach ($areas as $area) {
  49. $moduleAreaFiles = $modulesReader->getConfigurationFiles($area . '/di.xml');
  50. self::$_moduleAreaFiles[$area] = $moduleAreaFiles;
  51. }
  52. }
  53. /**
  54. * @param string $filePath
  55. * @param string $xml
  56. * @throws \Exception
  57. * @dataProvider linearFilesProvider
  58. */
  59. public function testDiConfigFileWithoutMerging($filePath, $xml)
  60. {
  61. /** @var \Magento\Framework\ObjectManager\Config\SchemaLocator $schemaLocator */
  62. $schemaLocator = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
  63. \Magento\Framework\ObjectManager\Config\SchemaLocator::class
  64. );
  65. $dom = new \DOMDocument();
  66. $dom->loadXML($xml);
  67. libxml_use_internal_errors(true);
  68. $result = \Magento\Framework\Config\Dom::validateDomDocument($dom, $schemaLocator->getSchema());
  69. libxml_use_internal_errors(false);
  70. if (!empty($result)) {
  71. $this->fail(
  72. 'File ' . $filePath . ' has invalid xml structure. '
  73. . implode("\n", $result)
  74. );
  75. }
  76. }
  77. public function linearFilesProvider()
  78. {
  79. if (empty(self::$_primaryFiles)) {
  80. $this->_prepareFiles();
  81. }
  82. $common = array_merge(self::$_primaryFiles->toArray(), self::$_moduleGlobalFiles->toArray());
  83. foreach (self::$_moduleAreaFiles as $files) {
  84. $common = array_merge($common, $files->toArray());
  85. }
  86. $output = [];
  87. foreach ($common as $path => $content) {
  88. $output[] = [substr($path, strlen(BP)), $content];
  89. }
  90. return $output;
  91. }
  92. /**
  93. * @param array $files
  94. * @dataProvider mixedFilesProvider
  95. */
  96. public function testMergedDiConfig(array $files)
  97. {
  98. $mapperMock = $this->createMock(\Magento\Framework\ObjectManager\Config\Mapper\Dom::class);
  99. $fileResolverMock = $this->getMockBuilder(\Magento\Framework\Config\FileResolverInterface::class)
  100. ->setMethods(['read'])
  101. ->getMockForAbstractClass();
  102. $fileResolverMock->expects($this->any())->method('read')->will($this->returnValue($files));
  103. $validationStateMock = $this->createPartialMock(
  104. \Magento\Framework\Config\ValidationStateInterface::class,
  105. ['isValidationRequired']
  106. );
  107. $validationStateMock->expects($this->any())->method('isValidationRequired')->will($this->returnValue(true));
  108. /** @var \Magento\Framework\ObjectManager\Config\SchemaLocator $schemaLocator */
  109. $schemaLocator = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
  110. \Magento\Framework\ObjectManager\Config\SchemaLocator::class
  111. );
  112. new \Magento\Framework\ObjectManager\Config\Reader\Dom(
  113. $fileResolverMock,
  114. $mapperMock,
  115. $schemaLocator,
  116. $validationStateMock
  117. );
  118. }
  119. public function mixedFilesProvider()
  120. {
  121. if (empty(self::$_primaryFiles)) {
  122. $this->_prepareFiles();
  123. }
  124. foreach (self::$_primaryFiles->toArray() as $file) {
  125. $primaryFiles[] = [[$file]];
  126. }
  127. $primaryFiles['all primary config files'] = [self::$_primaryFiles->toArray()];
  128. foreach (self::$_moduleGlobalFiles->toArray() as $file) {
  129. $moduleFiles[] = [[$file]];
  130. }
  131. $moduleFiles['all module global config files'] = [self::$_moduleGlobalFiles->toArray()];
  132. $areaFiles = [];
  133. foreach (self::$_moduleAreaFiles as $area => $files) {
  134. foreach ($files->toArray() as $file) {
  135. $areaFiles[] = [[$file]];
  136. }
  137. $areaFiles["all {$area} config files"] = [self::$_moduleAreaFiles[$area]->toArray()];
  138. }
  139. return $primaryFiles + $moduleFiles + $areaFiles;
  140. }
  141. }