annotate core/modules/config/tests/src/Functional/ConfigInstallWebTest.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents af1871eacc83
children
rev   line source
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 }