diff --git a/core/modules/system/src/Form/ModulesUninstallForm.php b/core/modules/system/src/Form/ModulesUninstallForm.php index f72fa4330250a8f72f525f496695bc7d96b61f88..c74439e7e24c8e74e243d47579ed031e80b0d94b 100644 --- a/core/modules/system/src/Form/ModulesUninstallForm.php +++ b/core/modules/system/src/Form/ModulesUninstallForm.php @@ -84,7 +84,7 @@ public function buildForm(array $form, FormStateInterface $form_state) { // Get a list of all available modules. $modules = system_rebuild_module_data(); $uninstallable = array_filter($modules, function ($module) use ($modules) { - return empty($modules[$module->getName()]->info['required']) && drupal_get_installed_schema_version($module->getName()) > SCHEMA_UNINSTALLED; + return empty($modules[$module->getName()]->info['required']) && $module->status; }); // Include system.admin.inc so we can use the sort callbacks. diff --git a/core/modules/system/src/Tests/Module/UninstallTest.php b/core/modules/system/src/Tests/Module/UninstallTest.php index f060986fd7ebe6018b89309514de2e1195db28c4..8730522af3b3116771eb7c6bf821416ef997aaa9 100644 --- a/core/modules/system/src/Tests/Module/UninstallTest.php +++ b/core/modules/system/src/Tests/Module/UninstallTest.php @@ -9,6 +9,7 @@ use Drupal\Core\Cache\Cache; use Drupal\Component\Utility\SafeMarkup; +use Drupal\Core\Entity\EntityMalformedException; use Drupal\simpletest\WebTestBase; /** @@ -117,4 +118,31 @@ function testUninstallPage() { $this->assertUrl('admin/modules/uninstall'); $this->assertTitle(t('Uninstall') . ' | Drupal'); } + + /** + * Tests that a module which fails to install can still be uninstalled. + */ + public function testFailedInstallStatus() { + $account = $this->drupalCreateUser(array('administer modules')); + $this->drupalLogin($account); + + $message = 'Exception thrown when installing module_installer_config_test with an invalid configuration file.'; + try { + $this->container->get('module_installer')->install(array('module_installer_config_test')); + $this->fail($message); + } catch (EntityMalformedException $e) { + $this->pass($message); + } + + // Even though the module failed to install properly, its configuration + // status is "enabled" and should still be available to uninstall. + $this->drupalGet('admin/modules/uninstall'); + $this->assertText('Module installer config test'); + $edit['uninstall[module_installer_config_test]'] = TRUE; + $this->drupalPostForm('admin/modules/uninstall', $edit, t('Uninstall')); + $this->drupalPostForm(NULL, NULL, t('Uninstall')); + $this->assertText(t('The selected modules have been uninstalled.')); + $this->assertNoText('Module installer config test'); + } + } diff --git a/core/modules/system/tests/modules/module_installer_config_test/config/install/module_installer_config_test.type.missing_id.yml b/core/modules/system/tests/modules/module_installer_config_test/config/install/module_installer_config_test.type.missing_id.yml new file mode 100644 index 0000000000000000000000000000000000000000..4628b97d0613cfc68e8cd9fdcf9c7438207a3428 --- /dev/null +++ b/core/modules/system/tests/modules/module_installer_config_test/config/install/module_installer_config_test.type.missing_id.yml @@ -0,0 +1,3 @@ +# This entity is intentionally missing an 'id' key. During installation, an +# EntityMalformedException should be thrown about the missing key. +name: 'This entity does not have an ID' diff --git a/core/modules/system/tests/modules/module_installer_config_test/config/schema/module_installer_config_test.schema.yml b/core/modules/system/tests/modules/module_installer_config_test/config/schema/module_installer_config_test.schema.yml new file mode 100644 index 0000000000000000000000000000000000000000..cb39936d75bc8c3a61f30c797f890874312d4729 --- /dev/null +++ b/core/modules/system/tests/modules/module_installer_config_test/config/schema/module_installer_config_test.schema.yml @@ -0,0 +1,10 @@ +module_installer_config_test.type.*: + type: config_entity + label: 'Test entity type' + mapping: + id: + type: string + name: + type: label + label: 'Name' + diff --git a/core/modules/system/tests/modules/module_installer_config_test/module_installer_config_test.info.yml b/core/modules/system/tests/modules/module_installer_config_test/module_installer_config_test.info.yml new file mode 100644 index 0000000000000000000000000000000000000000..78f3d88e0e5ce5fc8faab5ffa784f61bafe2fc7d --- /dev/null +++ b/core/modules/system/tests/modules/module_installer_config_test/module_installer_config_test.info.yml @@ -0,0 +1,7 @@ +name: 'Module installer config test' +description: 'Support module for tests that require a failed module install.' +type: module +package: Testing +core: 8.x +version: VERSION + diff --git a/core/modules/system/tests/modules/module_installer_config_test/src/Entity/TestConfigType.php b/core/modules/system/tests/modules/module_installer_config_test/src/Entity/TestConfigType.php new file mode 100644 index 0000000000000000000000000000000000000000..cddb92eda161c9b9942f61894b55576207f41957 --- /dev/null +++ b/core/modules/system/tests/modules/module_installer_config_test/src/Entity/TestConfigType.php @@ -0,0 +1,30 @@ +