Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\KernelTests\Config;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Core\Config\FileStorage;
|
Chris@0
|
6 use Drupal\Core\Config\InstallStorage;
|
Chris@0
|
7 use Drupal\Core\Config\StorageInterface;
|
Chris@0
|
8 use Drupal\KernelTests\AssertConfigTrait;
|
Chris@0
|
9 use Drupal\KernelTests\FileSystemModuleDiscoveryDataProviderTrait;
|
Chris@0
|
10 use Drupal\KernelTests\KernelTestBase;
|
Chris@0
|
11
|
Chris@0
|
12 /**
|
Chris@0
|
13 * Tests that the installed config matches the default config.
|
Chris@0
|
14 *
|
Chris@0
|
15 * @group Config
|
Chris@0
|
16 */
|
Chris@0
|
17 class DefaultConfigTest extends KernelTestBase {
|
Chris@0
|
18
|
Chris@0
|
19 use AssertConfigTrait;
|
Chris@0
|
20 use FileSystemModuleDiscoveryDataProviderTrait;
|
Chris@0
|
21
|
Chris@0
|
22 /**
|
Chris@0
|
23 * {@inheritdoc}
|
Chris@0
|
24 */
|
Chris@0
|
25 protected static $timeLimit = 500;
|
Chris@0
|
26
|
Chris@0
|
27 /**
|
Chris@0
|
28 * {@inheritdoc}
|
Chris@0
|
29 */
|
Chris@0
|
30 public static $modules = ['system', 'user'];
|
Chris@0
|
31
|
Chris@0
|
32 /**
|
Chris@0
|
33 * The following config entries are changed on module install.
|
Chris@0
|
34 *
|
Chris@0
|
35 * Comparing them does not make sense.
|
Chris@0
|
36 *
|
Chris@0
|
37 * @todo Figure out why simpletest.settings is not installed.
|
Chris@0
|
38 *
|
Chris@0
|
39 * @var array
|
Chris@0
|
40 */
|
Chris@0
|
41 public static $skippedConfig = [
|
Chris@0
|
42 'locale.settings' => ['path: '],
|
Chris@0
|
43 'syslog.settings' => ['facility: '],
|
Chris@0
|
44 'simpletest.settings' => TRUE,
|
Chris@0
|
45 ];
|
Chris@0
|
46
|
Chris@0
|
47 /**
|
Chris@0
|
48 * Tests if installed config is equal to the exported config.
|
Chris@0
|
49 *
|
Chris@0
|
50 * @dataProvider coreModuleListDataProvider
|
Chris@0
|
51 */
|
Chris@0
|
52 public function testModuleConfig($module) {
|
Chris@0
|
53 // System and user are required in order to be able to install some of the
|
Chris@0
|
54 // other modules. Therefore they are put into static::$modules, which though
|
Chris@0
|
55 // doesn't install config files, so import those config files explicitly.
|
Chris@0
|
56 switch ($module) {
|
Chris@0
|
57 case 'system':
|
Chris@0
|
58 case 'user':
|
Chris@0
|
59 $this->installConfig([$module]);
|
Chris@0
|
60 break;
|
Chris@0
|
61 }
|
Chris@0
|
62
|
Chris@0
|
63 $module_path = drupal_get_path('module', $module) . '/';
|
Chris@0
|
64
|
Chris@0
|
65 /** @var \Drupal\Core\Extension\ModuleInstallerInterface $module_installer */
|
Chris@0
|
66 $module_installer = $this->container->get('module_installer');
|
Chris@0
|
67
|
Chris@0
|
68 // Work out any additional modules and themes that need installing to create
|
Chris@0
|
69 // an optional config.
|
Chris@0
|
70 $optional_config_storage = new FileStorage($module_path . InstallStorage::CONFIG_OPTIONAL_DIRECTORY, StorageInterface::DEFAULT_COLLECTION);
|
Chris@0
|
71 $modules_to_install = [$module];
|
Chris@0
|
72 $themes_to_install = [];
|
Chris@0
|
73 foreach ($optional_config_storage->listAll() as $config_name) {
|
Chris@0
|
74 $data = $optional_config_storage->read($config_name);
|
Chris@0
|
75 if (isset($data['dependencies']['module'])) {
|
Chris@0
|
76 $modules_to_install = array_merge($modules_to_install, $data['dependencies']['module']);
|
Chris@0
|
77 }
|
Chris@0
|
78 if (isset($data['dependencies']['theme'])) {
|
Chris@0
|
79 $themes_to_install = array_merge($themes_to_install, $data['dependencies']['theme']);
|
Chris@0
|
80 }
|
Chris@0
|
81 }
|
Chris@0
|
82 $module_installer->install(array_unique($modules_to_install));
|
Chris@0
|
83 $this->container->get('theme_installer')->install($themes_to_install);
|
Chris@0
|
84
|
Chris@0
|
85 // Test configuration in the module's config/install directory.
|
Chris@0
|
86 $module_config_storage = new FileStorage($module_path . InstallStorage::CONFIG_INSTALL_DIRECTORY, StorageInterface::DEFAULT_COLLECTION);
|
Chris@0
|
87 $this->doTestsOnConfigStorage($module_config_storage);
|
Chris@0
|
88
|
Chris@0
|
89 // Test configuration in the module's config/optional directory.
|
Chris@0
|
90 $this->doTestsOnConfigStorage($optional_config_storage);
|
Chris@0
|
91 }
|
Chris@0
|
92
|
Chris@0
|
93 /**
|
Chris@0
|
94 * Tests that default config matches the installed config.
|
Chris@0
|
95 *
|
Chris@0
|
96 * @param \Drupal\Core\Config\StorageInterface $default_config_storage
|
Chris@0
|
97 * The default config storage to test.
|
Chris@0
|
98 */
|
Chris@0
|
99 protected function doTestsOnConfigStorage(StorageInterface $default_config_storage) {
|
Chris@0
|
100 /** @var \Drupal\Core\Config\ConfigManagerInterface $config_manager */
|
Chris@0
|
101 $config_manager = $this->container->get('config.manager');
|
Chris@0
|
102
|
Chris@0
|
103 // Just connect directly to the config table so we don't need to worry about
|
Chris@0
|
104 // the cache layer.
|
Chris@0
|
105 $active_config_storage = $this->container->get('config.storage');
|
Chris@0
|
106
|
Chris@0
|
107 foreach ($default_config_storage->listAll() as $config_name) {
|
Chris@0
|
108 if ($active_config_storage->exists($config_name)) {
|
Chris@0
|
109 // If it is a config entity re-save it. This ensures that any
|
Chris@0
|
110 // recalculation of dependencies does not cause config change.
|
Chris@0
|
111 if ($entity_type = $config_manager->getEntityTypeIdByName($config_name)) {
|
Chris@0
|
112 $entity_storage = $config_manager
|
Chris@18
|
113 ->getEntityTypeManager()
|
Chris@0
|
114 ->getStorage($entity_type);
|
Chris@0
|
115 $id = $entity_storage->getIDFromConfigName($config_name, $entity_storage->getEntityType()
|
Chris@0
|
116 ->getConfigPrefix());
|
Chris@0
|
117 $entity_storage->load($id)->calculateDependencies()->save();
|
Chris@0
|
118 }
|
Chris@0
|
119 $result = $config_manager->diff($default_config_storage, $active_config_storage, $config_name);
|
Chris@0
|
120 $this->assertConfigDiff($result, $config_name, static::$skippedConfig);
|
Chris@0
|
121 }
|
Chris@0
|
122 }
|
Chris@0
|
123 }
|
Chris@0
|
124
|
Chris@0
|
125 }
|