Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Tests\config\Functional;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Core\Config\PreExistingConfigException;
|
Chris@0
|
6 use Drupal\Core\Config\StorageInterface;
|
Chris@18
|
7 use Drupal\Core\File\Exception\FileException;
|
Chris@0
|
8 use Drupal\language\Entity\ConfigurableLanguage;
|
Chris@0
|
9 use Drupal\Tests\BrowserTestBase;
|
Chris@0
|
10
|
Chris@0
|
11 /**
|
Chris@0
|
12 * Tests installation and removal of configuration objects in install, disable
|
Chris@0
|
13 * and uninstall functionality.
|
Chris@0
|
14 *
|
Chris@0
|
15 * @group config
|
Chris@0
|
16 */
|
Chris@0
|
17 class ConfigInstallWebTest extends BrowserTestBase {
|
Chris@0
|
18
|
Chris@0
|
19 /**
|
Chris@0
|
20 * The admin user used in this test.
|
Chris@0
|
21 */
|
Chris@0
|
22 protected $adminUser;
|
Chris@0
|
23
|
Chris@0
|
24 /**
|
Chris@0
|
25 * {@inheritdoc}
|
Chris@0
|
26 */
|
Chris@0
|
27 protected function setUp() {
|
Chris@0
|
28 parent::setUp();
|
Chris@0
|
29
|
Chris@0
|
30 $this->adminUser = $this->drupalCreateUser(['administer modules', 'administer themes', 'administer site configuration']);
|
Chris@0
|
31
|
Chris@0
|
32 // Ensure the global variable being asserted by this test does not exist;
|
Chris@0
|
33 // a previous test executed in this request/process might have set it.
|
Chris@0
|
34 unset($GLOBALS['hook_config_test']);
|
Chris@0
|
35 }
|
Chris@0
|
36
|
Chris@0
|
37 /**
|
Chris@0
|
38 * Tests module re-installation.
|
Chris@0
|
39 */
|
Chris@0
|
40 public function testIntegrationModuleReinstallation() {
|
Chris@0
|
41 $default_config = 'config_integration_test.settings';
|
Chris@0
|
42 $default_configuration_entity = 'config_test.dynamic.config_integration_test';
|
Chris@0
|
43
|
Chris@0
|
44 // Install the config_test module we're integrating with.
|
Chris@0
|
45 \Drupal::service('module_installer')->install(['config_test']);
|
Chris@0
|
46
|
Chris@0
|
47 // Verify the configuration does not exist prior to installation.
|
Chris@0
|
48 $config_static = $this->config($default_config);
|
Chris@0
|
49 $this->assertIdentical($config_static->isNew(), TRUE);
|
Chris@0
|
50 $config_entity = $this->config($default_configuration_entity);
|
Chris@0
|
51 $this->assertIdentical($config_entity->isNew(), TRUE);
|
Chris@0
|
52
|
Chris@0
|
53 // Install the integration module.
|
Chris@0
|
54 \Drupal::service('module_installer')->install(['config_integration_test']);
|
Chris@0
|
55 $this->resetAll();
|
Chris@0
|
56
|
Chris@0
|
57 // Verify that default module config exists.
|
Chris@0
|
58 \Drupal::configFactory()->reset($default_config);
|
Chris@0
|
59 \Drupal::configFactory()->reset($default_configuration_entity);
|
Chris@0
|
60 $config_static = $this->config($default_config);
|
Chris@0
|
61 $this->assertIdentical($config_static->isNew(), FALSE);
|
Chris@0
|
62 $this->assertIdentical($config_static->get('foo'), 'default setting');
|
Chris@0
|
63 $config_entity = $this->config($default_configuration_entity);
|
Chris@0
|
64 $this->assertIdentical($config_entity->isNew(), FALSE);
|
Chris@0
|
65 $this->assertIdentical($config_entity->get('label'), 'Default integration config label');
|
Chris@0
|
66
|
Chris@0
|
67 // Customize both configuration objects.
|
Chris@0
|
68 $config_static->set('foo', 'customized setting')->save();
|
Chris@0
|
69 $config_entity->set('label', 'Customized integration config label')->save();
|
Chris@0
|
70
|
Chris@0
|
71 // @todo FIXME: Setting config keys WITHOUT SAVING retains the changed config
|
Chris@0
|
72 // object in memory. Every new call to $this->config() MUST revert in-memory changes
|
Chris@0
|
73 // that haven't been saved!
|
Chris@0
|
74 // In other words: This test passes even without this reset, but it shouldn't.
|
Chris@0
|
75 $this->container->get('config.factory')->reset();
|
Chris@0
|
76
|
Chris@0
|
77 // Disable and uninstall the integration module.
|
Chris@0
|
78 $this->container->get('module_installer')->uninstall(['config_integration_test']);
|
Chris@0
|
79
|
Chris@0
|
80 // Verify the integration module's config was uninstalled.
|
Chris@0
|
81 $config_static = $this->config($default_config);
|
Chris@0
|
82 $this->assertIdentical($config_static->isNew(), TRUE);
|
Chris@0
|
83
|
Chris@0
|
84 // Verify the integration config still exists.
|
Chris@0
|
85 $config_entity = $this->config($default_configuration_entity);
|
Chris@0
|
86 $this->assertIdentical($config_entity->isNew(), FALSE);
|
Chris@0
|
87 $this->assertIdentical($config_entity->get('label'), 'Customized integration config label');
|
Chris@0
|
88
|
Chris@0
|
89 // Reinstall the integration module.
|
Chris@0
|
90 try {
|
Chris@0
|
91 \Drupal::service('module_installer')->install(['config_integration_test']);
|
Chris@0
|
92 $this->fail('Expected PreExistingConfigException not thrown.');
|
Chris@0
|
93 }
|
Chris@0
|
94 catch (PreExistingConfigException $e) {
|
Chris@0
|
95 $this->assertEqual($e->getExtension(), 'config_integration_test');
|
Chris@0
|
96 $this->assertEqual($e->getConfigObjects(), [StorageInterface::DEFAULT_COLLECTION => ['config_test.dynamic.config_integration_test']]);
|
Chris@0
|
97 $this->assertEqual($e->getMessage(), 'Configuration objects (config_test.dynamic.config_integration_test) provided by config_integration_test already exist in active configuration');
|
Chris@0
|
98 }
|
Chris@0
|
99
|
Chris@0
|
100 // Delete the configuration entity so that the install will work.
|
Chris@0
|
101 $config_entity->delete();
|
Chris@0
|
102 \Drupal::service('module_installer')->install(['config_integration_test']);
|
Chris@0
|
103
|
Chris@0
|
104 // Verify the integration module's config was re-installed.
|
Chris@0
|
105 \Drupal::configFactory()->reset($default_config);
|
Chris@0
|
106 \Drupal::configFactory()->reset($default_configuration_entity);
|
Chris@0
|
107 $config_static = $this->config($default_config);
|
Chris@0
|
108 $this->assertIdentical($config_static->isNew(), FALSE);
|
Chris@0
|
109 $this->assertIdentical($config_static->get('foo'), 'default setting');
|
Chris@0
|
110
|
Chris@0
|
111 // Verify the integration config is using the default.
|
Chris@0
|
112 $config_entity = \Drupal::config($default_configuration_entity);
|
Chris@0
|
113 $this->assertIdentical($config_entity->isNew(), FALSE);
|
Chris@0
|
114 $this->assertIdentical($config_entity->get('label'), 'Default integration config label');
|
Chris@0
|
115 }
|
Chris@0
|
116
|
Chris@0
|
117 /**
|
Chris@0
|
118 * Tests pre-existing configuration detection.
|
Chris@0
|
119 */
|
Chris@0
|
120 public function testPreExistingConfigInstall() {
|
Chris@0
|
121 $this->drupalLogin($this->adminUser);
|
Chris@0
|
122
|
Chris@0
|
123 // Try to install config_install_fail_test and config_test. Doing this
|
Chris@0
|
124 // will install the config_test module first because it is a dependency of
|
Chris@0
|
125 // config_install_fail_test.
|
Chris@0
|
126 // @see \Drupal\system\Form\ModulesListForm::submitForm()
|
Chris@0
|
127 $this->drupalPostForm('admin/modules', ['modules[config_test][enable]' => TRUE, 'modules[config_install_fail_test][enable]' => TRUE], t('Install'));
|
Chris@0
|
128 $this->assertRaw('Unable to install Configuration install fail test, <em class="placeholder">config_test.dynamic.dotted.default</em> already exists in active configuration.');
|
Chris@0
|
129
|
Chris@0
|
130 // Uninstall the config_test module to test the confirm form.
|
Chris@0
|
131 $this->drupalPostForm('admin/modules/uninstall', ['uninstall[config_test]' => TRUE], t('Uninstall'));
|
Chris@0
|
132 $this->drupalPostForm(NULL, [], t('Uninstall'));
|
Chris@0
|
133
|
Chris@0
|
134 // Try to install config_install_fail_test without selecting config_test.
|
Chris@0
|
135 // The user is shown a confirm form because the config_test module is a
|
Chris@0
|
136 // dependency.
|
Chris@0
|
137 // @see \Drupal\system\Form\ModulesListConfirmForm::submitForm()
|
Chris@0
|
138 $this->drupalPostForm('admin/modules', ['modules[config_install_fail_test][enable]' => TRUE], t('Install'));
|
Chris@0
|
139 $this->drupalPostForm(NULL, [], t('Continue'));
|
Chris@0
|
140 $this->assertRaw('Unable to install Configuration install fail test, <em class="placeholder">config_test.dynamic.dotted.default</em> already exists in active configuration.');
|
Chris@0
|
141
|
Chris@0
|
142 // Test that collection configuration clashes during a module install are
|
Chris@0
|
143 // reported correctly.
|
Chris@0
|
144 \Drupal::service('module_installer')->install(['language']);
|
Chris@0
|
145 $this->rebuildContainer();
|
Chris@0
|
146 ConfigurableLanguage::createFromLangcode('fr')->save();
|
Chris@0
|
147 \Drupal::languageManager()
|
Chris@0
|
148 ->getLanguageConfigOverride('fr', 'config_test.dynamic.dotted.default')
|
Chris@0
|
149 ->set('label', 'Je suis Charlie')
|
Chris@0
|
150 ->save();
|
Chris@0
|
151
|
Chris@0
|
152 $this->drupalPostForm('admin/modules', ['modules[config_install_fail_test][enable]' => TRUE], t('Install'));
|
Chris@0
|
153 $this->assertRaw('Unable to install Configuration install fail test, <em class="placeholder">config_test.dynamic.dotted.default, language/fr/config_test.dynamic.dotted.default</em> already exist in active configuration.');
|
Chris@0
|
154
|
Chris@0
|
155 // Test installing a theme through the UI that has existing configuration.
|
Chris@0
|
156 // This relies on the fact the config_test has been installed and created
|
Chris@0
|
157 // the config_test.dynamic.dotted.default configuration and the translation
|
Chris@0
|
158 // override created still exists.
|
Chris@0
|
159 $this->drupalGet('admin/appearance');
|
Chris@0
|
160 $url = $this->xpath("//a[contains(@href,'config_clash_test_theme') and contains(@href,'/install?')]/@href")[0];
|
Chris@0
|
161 $this->drupalGet($this->getAbsoluteUrl($url->getText()));
|
Chris@0
|
162 $this->assertRaw('Unable to install config_clash_test_theme, <em class="placeholder">config_test.dynamic.dotted.default, language/fr/config_test.dynamic.dotted.default</em> already exist in active configuration.');
|
Chris@0
|
163
|
Chris@0
|
164 // Test installing a theme through the API that has existing configuration.
|
Chris@0
|
165 try {
|
Chris@0
|
166 \Drupal::service('theme_handler')->install(['config_clash_test_theme']);
|
Chris@0
|
167 $this->fail('Expected PreExistingConfigException not thrown.');
|
Chris@0
|
168 }
|
Chris@0
|
169 catch (PreExistingConfigException $e) {
|
Chris@0
|
170 $this->assertEqual($e->getExtension(), 'config_clash_test_theme');
|
Chris@0
|
171 $this->assertEqual($e->getConfigObjects(), [StorageInterface::DEFAULT_COLLECTION => ['config_test.dynamic.dotted.default'], 'language.fr' => ['config_test.dynamic.dotted.default']]);
|
Chris@0
|
172 $this->assertEqual($e->getMessage(), 'Configuration objects (config_test.dynamic.dotted.default, language/fr/config_test.dynamic.dotted.default) provided by config_clash_test_theme already exist in active configuration');
|
Chris@0
|
173 }
|
Chris@0
|
174 }
|
Chris@0
|
175
|
Chris@0
|
176 /**
|
Chris@0
|
177 * Tests unmet dependencies detection.
|
Chris@0
|
178 */
|
Chris@0
|
179 public function testUnmetDependenciesInstall() {
|
Chris@0
|
180 $this->drupalLogin($this->adminUser);
|
Chris@0
|
181 // We need to install separately since config_install_dependency_test does
|
Chris@0
|
182 // not depend on config_test and order is important.
|
Chris@0
|
183 $this->drupalPostForm('admin/modules', ['modules[config_test][enable]' => TRUE], t('Install'));
|
Chris@0
|
184 $this->drupalPostForm('admin/modules', ['modules[config_install_dependency_test][enable]' => TRUE], t('Install'));
|
Chris@0
|
185 $this->assertRaw('Unable to install <em class="placeholder">Config install dependency test</em> due to unmet dependencies: <em class="placeholder">config_test.dynamic.other_module_test_with_dependency (config_other_module_config_test, config_test.dynamic.dotted.english)</em>');
|
Chris@0
|
186
|
Chris@0
|
187 $this->drupalPostForm('admin/modules', ['modules[config_test_language][enable]' => TRUE], t('Install'));
|
Chris@0
|
188 $this->drupalPostForm('admin/modules', ['modules[config_install_dependency_test][enable]' => TRUE], t('Install'));
|
Chris@0
|
189 $this->assertRaw('Unable to install <em class="placeholder">Config install dependency test</em> due to unmet dependencies: <em class="placeholder">config_test.dynamic.other_module_test_with_dependency (config_other_module_config_test)</em>');
|
Chris@0
|
190
|
Chris@0
|
191 $this->drupalPostForm('admin/modules', ['modules[config_other_module_config_test][enable]' => TRUE], t('Install'));
|
Chris@0
|
192 $this->drupalPostForm('admin/modules', ['modules[config_install_dependency_test][enable]' => TRUE], t('Install'));
|
Chris@0
|
193 $this->rebuildContainer();
|
Chris@18
|
194 $this->assertTrue(\Drupal::entityTypeManager()->getStorage('config_test')->load('other_module_test_with_dependency'), 'The config_test.dynamic.other_module_test_with_dependency configuration has been created during install.');
|
Chris@0
|
195 }
|
Chris@0
|
196
|
Chris@0
|
197 /**
|
Chris@0
|
198 * Tests config_requirements().
|
Chris@0
|
199 */
|
Chris@0
|
200 public function testConfigModuleRequirements() {
|
Chris@0
|
201 $this->drupalLogin($this->adminUser);
|
Chris@0
|
202 $this->drupalPostForm('admin/modules', ['modules[config][enable]' => TRUE], t('Install'));
|
Chris@0
|
203
|
Chris@0
|
204 $directory = config_get_config_directory(CONFIG_SYNC_DIRECTORY);
|
Chris@18
|
205 try {
|
Chris@18
|
206 \Drupal::service('file_system')->deleteRecursive($directory);
|
Chris@18
|
207 }
|
Chris@18
|
208 catch (FileException $e) {
|
Chris@18
|
209 // Ignore failed deletes.
|
Chris@18
|
210 }
|
Chris@0
|
211 $this->drupalGet('/admin/reports/status');
|
Chris@0
|
212 $this->assertRaw(t('The directory %directory does not exist.', ['%directory' => $directory]));
|
Chris@0
|
213 }
|
Chris@0
|
214
|
Chris@0
|
215 }
|