Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
AutogeneratedClassNotInConstructorTest.php
Go to the documentation of this file.
1 <?php
7 
12 
13 class AutogeneratedClassNotInConstructorTest extends \PHPUnit\Framework\TestCase
14 {
18  private $autogeneratedClassesWhitelist;
19 
23  private $classNameExtractor;
24 
28  private $autogeneratedClassNotInConstructorFinder;
29 
33  private $fileUtilities;
34 
35  protected function setUp()
36  {
37  $this->classNameExtractor = new ClassNameExtractor();
38  $this->autogeneratedClassNotInConstructorFinder = new AutogeneratedClassNotInConstructorFinder(
39  $this->classNameExtractor
40  );
41  $this->fileUtilities = Files::init();
42  }
43 
45  {
47  $changedFiles = ChangedFiles::getPhpFiles(__DIR__ . '/_files/changed_files*', $fileTypes);
48  $phpFiles = $this->fileUtilities->getPhpFiles($fileTypes);
49 
50  $existingClasses = [];
51  $classesCreatedByObjectManager = [];
52  foreach ($phpFiles as $file) {
53  $filePath = $file[0];
54  $fileContent = file_get_contents($filePath);
55  $className = $this->classNameExtractor->getNameWithNamespace($fileContent);
56  if ($className) {
57  $existingClasses = array_merge(
58  $existingClasses,
59  [$filePath => $className]
60  );
61  }
62  }
63  foreach ($changedFiles as $file) {
64  $filePath = $file[0];
65  $fileContent = file_get_contents($filePath);
66  $className = $this->classNameExtractor->getNameWithNamespace($fileContent);
67  if ($className) {
68  $tmpClassesCreatedByObjectManager = array_diff(
69  $this->autogeneratedClassNotInConstructorFinder->find($fileContent),
70  $this->getWhitelistedClasses()
71  );
72 
73  if (!empty($tmpClassesCreatedByObjectManager)) {
74  $classesCreatedByObjectManager = array_merge(
75  $classesCreatedByObjectManager,
76  [$filePath => $tmpClassesCreatedByObjectManager]
77  );
78  }
79  }
80  }
81 
82  $existingClasses = array_unique($existingClasses);
83 
84  $generatedDependenciesNotInConstructor = [];
85  foreach ($classesCreatedByObjectManager as $key => $classes) {
86  $autogeneratedClasses = array_diff($classes, $existingClasses);
87  if (!empty($autogeneratedClasses)) {
88  $generatedDependenciesNotInConstructor[$key] = $autogeneratedClasses;
89  }
90  }
91 
92  $this->assertEmpty(
93  $generatedDependenciesNotInConstructor,
94  "The following autogenerated classes need to be requested in constructor, otherwise compiler "
95  . "will not be able to find and generate these classes \r\n"
96  . print_r($generatedDependenciesNotInConstructor, true)
97  );
98  }
99 
105  private function getWhitelistedClasses()
106  {
107  if (!$this->autogeneratedClassesWhitelist) {
108  $this->autogeneratedClassesWhitelist = require_once __DIR__
109  . '/_files/autogenerated_class_not_in_constructor_whitelist.php';
110  }
111  return $this->autogeneratedClassesWhitelist;
112  }
113 }
static getPhpFiles($changedFilesList, $fileTypes=0)
defined('TESTS_BP')||define('TESTS_BP' __DIR__
Definition: _bootstrap.php:60
if($currentSelectedMethod==$_code) $className
Definition: form.phtml:31