Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
CircularDependencyTest.php
Go to the documentation of this file.
1 <?php
8 
11 
12 class CircularDependencyTest extends \PHPUnit\Framework\TestCase
13 {
17  private $packs;
18 
22  public function testCircularDependencies()
23  {
24  $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
26  $declaredLanguages = $componentRegistrar->getPaths(ComponentRegistrar::LANGUAGE);
27  $validationStateMock = $this->createMock(\Magento\Framework\Config\ValidationStateInterface::class);
28  $validationStateMock->method('isValidationRequired')
29  ->willReturn(true);
30  $domFactoryMock = $this->createMock(\Magento\Framework\Config\DomFactory::class);
31  $domFactoryMock->expects($this->any())
32  ->method('createDom')
33  ->willReturnCallback(
34  function ($arguments) use ($validationStateMock) {
35  return new \Magento\Framework\Config\Dom(
36  $arguments['xml'],
37  $validationStateMock,
38  [],
39  null,
40  $arguments['schemaFile']
41  );
42  }
43  );
44 
45  $packs = [];
46  foreach ($declaredLanguages as $language) {
47  $languageConfig = $objectManager->getObject(
48  \Magento\Framework\App\Language\Config::class,
49  [
50  'source' => file_get_contents($language . '/language.xml'),
51  'domFactory' => $domFactoryMock
52  ]
53  );
54  $this->packs[$languageConfig->getVendor()][$languageConfig->getPackage()] = $languageConfig;
55  $packs[] = $languageConfig;
56  }
57 
59  foreach ($packs as $languageConfig) {
60  $languages = [];
62  foreach ($this->collectCircularInheritance($languageConfig) as $config) {
63  $languages[] = $config->getVendor() . '/' . $config->getPackage();
64  }
65  if (!empty($languages)) {
66  $this->fail("Circular dependency detected:\n" . implode(' -> ', $languages));
67  }
68  }
69  }
70 
77  private function collectCircularInheritance(Config $languageConfig, &$languageList = [], &$isCircular = false)
78  {
79  $packKey = implode('|', [$languageConfig->getVendor(), $languageConfig->getPackage()]);
80  if (isset($languageList[$packKey])) {
81  $isCircular = true;
82  } else {
83  $languageList[$packKey] = $languageConfig;
84  foreach ($languageConfig->getUses() as $reuse) {
85  if (isset($this->packs[$reuse['vendor']][$reuse['package']])) {
86  $this->collectCircularInheritance(
87  $this->packs[$reuse['vendor']][$reuse['package']],
88  $languageList,
89  $isCircular
90  );
91  }
92  }
93  }
94  return $isCircular ? $languageList : [];
95  }
96 }
$componentRegistrar
Definition: bootstrap.php:23
$objectManager
Definition: bootstrap.php:17
$config
Definition: fraud_order.php:17
$arguments