diff --git a/core/modules/config/src/ConfigSubscriber.php b/core/modules/config/src/ConfigSubscriber.php index 7e4c51ddac37..779bab67ddcb 100644 --- a/core/modules/config/src/ConfigSubscriber.php +++ b/core/modules/config/src/ConfigSubscriber.php @@ -18,6 +18,11 @@ class ConfigSubscriber extends ConfigImportValidateEventSubscriberBase { * The config import event. */ public function onConfigImporterValidate(ConfigImporterEvent $event) { + // Make sure config syncs performed via the Config UI don't break, but + // don't worry about syncs initiated via the command line. + if (PHP_SAPI === 'cli') { + return; + } $importer = $event->getConfigImporter(); $core_extension = $importer->getStorageComparer()->getSourceStorage()->read('core.extension'); if (!isset($core_extension['module']['config'])) { diff --git a/core/modules/config/tests/src/Kernel/ConfigUninstallViaCliImportTest.php b/core/modules/config/tests/src/Kernel/ConfigUninstallViaCliImportTest.php new file mode 100644 index 000000000000..5f77447f316f --- /dev/null +++ b/core/modules/config/tests/src/Kernel/ConfigUninstallViaCliImportTest.php @@ -0,0 +1,71 @@ +markTestSkipped('This test has to be run from the CLI'); + } + + $this->copyConfig($this->container->get('config.storage'), $this->container->get('config.storage.sync')); + + // Set up the ConfigImporter object for testing. + $storage_comparer = new StorageComparer( + $this->container->get('config.storage.sync'), + $this->container->get('config.storage'), + $this->container->get('config.manager') + ); + $this->configImporter = new ConfigImporter( + $storage_comparer->createChangelist(), + $this->container->get('event_dispatcher'), + $this->container->get('config.manager'), + $this->container->get('lock'), + $this->container->get('config.typed'), + $this->container->get('module_handler'), + $this->container->get('module_installer'), + $this->container->get('theme_handler'), + $this->container->get('string_translation') + ); + } + + /** + * Tests that the config mopdule can be uninstalled via CLI config import. + * + * @see \Drupal\config\ConfigSubscriber + */ + public function testConfigUninstallViaCli() { + $this->assertTrue($this->container->get('module_handler')->moduleExists('config')); + $sync = $this->container->get('config.storage.sync'); + $extensions = $sync->read('core.extension'); + unset($extensions['module']['config']); + $sync->write('core.extension', $extensions); + $this->configImporter->reset()->import(); + $this->assertFalse($this->container->get('module_handler')->moduleExists('config')); + } + +}