Upgraded drupal core with security updates
[yaffs-website] / web / core / tests / Drupal / Tests / Core / Extension / ExtensionDiscoveryTest.php
1 <?php
2
3 namespace Drupal\Tests\Core\Extension;
4
5 use Drupal\Core\Extension\Extension;
6 use Drupal\Core\Extension\ExtensionDiscovery;
7 use Drupal\Tests\UnitTestCase;
8 use org\bovigo\vfs\vfsStream;
9 use Symfony\Component\Yaml\Yaml;
10
11 /**
12  * Tests discovery of extensions.
13  *
14  * @coversDefaultClass \Drupal\Core\Extension\ExtensionDiscovery
15  * @group Extension
16  */
17 class ExtensionDiscoveryTest extends UnitTestCase {
18
19   /**
20    * Tests extension discovery in a virtual filesystem with vfsStream.
21    *
22    * @covers ::scan
23    */
24   public function testExtensionDiscoveryVfs() {
25
26     // Set up the file system.
27     $filesystem = [];
28     $files_by_type_and_name_expected = $this->populateFilesystemStructure($filesystem);
29
30     $vfs = vfsStream::setup('root', NULL, $filesystem);
31     $root = $vfs->url();
32
33     $this->assertFileExists($root . '/core/modules/system/system.module');
34     $this->assertFileExists($root . '/core/modules/system/system.info.yml');
35
36     // Create an ExtensionDiscovery with $root.
37     $extension_discovery = new ExtensionDiscovery($root, FALSE, NULL, 'sites/default');
38
39     /** @var \Drupal\Core\Extension\Extension[][] $extensions_by_type */
40     $extensions_by_type = [];
41     $files_by_type_and_name = [];
42     foreach (['profile', 'module', 'theme', 'theme_engine'] as $type) {
43       $extensions_by_type[$type] = $extension_discovery->scan($type, FALSE);
44       foreach ($extensions_by_type[$type] as $name => $extension) {
45         $files_by_type_and_name[$type][$name] = $extension->getPathname();
46       }
47       if ($type === 'profile') {
48         // Set profile directories for discovery of the other extension types.
49         $extension_discovery->setProfileDirectories(['myprofile' => 'profiles/myprofile']);
50       }
51     }
52
53     $this->assertEquals($files_by_type_and_name_expected, $files_by_type_and_name);
54
55     $extension_expected = new Extension($root, 'module', 'core/modules/system/system.info.yml', 'system.module');
56     $extension_expected->subpath = 'modules/system';
57     $extension_expected->origin = 'core';
58     $this->assertEquals($extension_expected, $extensions_by_type['module']['system'], 'system');
59
60     $extension_expected = new Extension($root, 'theme_engine', 'core/themes/engines/twig/twig.info.yml', 'twig.engine');
61     $extension_expected->subpath = 'themes/engines/twig';
62     $extension_expected->origin = 'core';
63     $this->assertEquals($extension_expected, $extensions_by_type['theme_engine']['twig'], 'twig');
64   }
65
66   /**
67    * Adds example files to the filesystem structure.
68    *
69    * @param array $filesystem_structure
70    *
71    * @return string[][]
72    *   Format: $[$type][$name] = $yml_file
73    *   E.g. $['module']['system'] = 'system.info.yml'
74    */
75   protected function populateFilesystemStructure(array &$filesystem_structure) {
76     $info_by_file = [
77       'core/profiles/standard/standard.info.yml' => [
78         'type' => 'profile',
79       ],
80       'core/profiles/minimal/minimal.info.yml' => [
81         'type' => 'profile',
82       ],
83       // Override the core instance of the 'minimal' profile.
84       'sites/default/profiles/minimal/minimal.info.yml' => [
85         'type' => 'profile',
86       ],
87       'profiles/myprofile/myprofile.info.yml' => [
88         'type' => 'profile',
89       ],
90       'profiles/myprofile/modules/myprofile_nested_module/myprofile_nested_module.info.yml' => [],
91       'profiles/otherprofile/otherprofile.info.yml' => [
92         'type' => 'profile',
93       ],
94       'core/modules/user/user.info.yml' => [],
95       'profiles/otherprofile/modules/otherprofile_nested_module/otherprofile_nested_module.info.yml' => [],
96       'core/modules/system/system.info.yml' => [],
97       'core/themes/seven/seven.info.yml' => [
98         'type' => 'theme',
99       ],
100       // Override the core instance of the 'seven' theme.
101       'sites/default/themes/seven/seven.info.yml' => [
102         'type' => 'theme',
103       ],
104       'modules/devel/devel.info.yml' => [],
105       'modules/poorly_placed_theme/poorly_placed_theme.info.yml' => [
106         'type' => 'theme',
107       ],
108       'core/themes/engines/twig/twig.info.yml' => [
109         'type' => 'theme_engine',
110       ],
111     ];
112
113     $files_by_type_and_name_expected = [];
114     $content_by_file = [];
115     foreach ($info_by_file as $file => $info) {
116       $name = basename($file, '.info.yml');
117       $info += [
118         'type' => 'module',
119         'name' => "Name of ($name)",
120         'core' => '8.x',
121       ];
122       $type = $info['type'];
123       $content_by_file[$file] = Yaml::dump($info);
124       $files_by_type_and_name_expected[$type][$name] = $file;
125     }
126
127     $content_by_file['core/modules/system/system.module'] = '<?php';
128     $content_by_file['core/themes/engines/twig/twig.engine'] = '<?php';
129
130     foreach ($content_by_file as $file => $content) {
131       $pieces = explode('/', $file);
132       $this->addFileToFilesystemStructure($filesystem_structure, $pieces, $content);
133     }
134
135     unset($files_by_type_and_name_expected['module']['otherprofile_nested_module']);
136
137     return $files_by_type_and_name_expected;
138   }
139
140   /**
141    * @param array $filesystem_structure
142    * @param string[] $pieces
143    *   Fragments of the file path.
144    * @param string $content
145    */
146   protected function addFileToFilesystemStructure(array &$filesystem_structure, array $pieces, $content) {
147     $piece = array_shift($pieces);
148     if ($pieces !== []) {
149       $filesystem_structure += [$piece => []];
150       $this->addFileToFilesystemStructure($filesystem_structure[$piece], $pieces, $content);
151     }
152     else {
153       $filesystem_structure[$piece] = $content;
154     }
155   }
156
157 }