annotate core/modules/config/tests/src/Functional/ConfigInstallWebTest.php @ 15:e200cb7efeb3

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