diff --git a/core/modules/rest/config/optional/rest.resource.entity.node.yml b/core/modules/rest/config/optional/rest.resource.entity.node.yml index 0cf4d789894870110d5694377eb09f6b4f2c0aac..caeed781a0a7a6d10f12b09bba093a12ea970015 100644 --- a/core/modules/rest/config/optional/rest.resource.entity.node.yml +++ b/core/modules/rest/config/optional/rest.resource.entity.node.yml @@ -1,3 +1,10 @@ +langcode: en +status: true +dependencies: + module: + - basic_auth + - hal + - node id: entity.node plugin_id: 'entity:node' granularity: method @@ -22,8 +29,3 @@ configuration: - hal_json supported_auth: - basic_auth -dependencies: - module: - - node - - basic_auth - - hal diff --git a/core/tests/Drupal/KernelTests/Config/DefaultConfigTest.php b/core/tests/Drupal/KernelTests/Config/DefaultConfigTest.php index e3c2aeb087eb9af18605c4d05d4fbcf93fa57b64..7b84b59790288108e12c26667ee0d5aea6c73975 100644 --- a/core/tests/Drupal/KernelTests/Config/DefaultConfigTest.php +++ b/core/tests/Drupal/KernelTests/Config/DefaultConfigTest.php @@ -27,6 +27,21 @@ class DefaultConfigTest extends KernelTestBase { */ public static $modules = ['system', 'user']; + /** + * The following config entries are changed on module install. + * + * Compare them does not make sense. + * + * @todo Figure out why simpletest.settings is not installed. + * + * @var array + */ + public static $skippedConfig = [ + 'locale.settings' => ['path: '], + 'syslog.settings' => ['facility: '], + 'simpletest.settings' => TRUE, + ]; + /** * {@inheritdoc} */ @@ -49,45 +64,81 @@ protected function setUp() { * @dataProvider providerTestModuleConfig */ public function testModuleConfig($module) { + // System and user are required in order to be able to install some of the + // other modules. Therefore they are put into static::$modules, which though + // doesn't install config files, so import those config files explicitly. + switch ($module) { + case 'system': + case 'user': + $this->installConfig([$module]); + break; + } + + $module_path = drupal_get_path('module', $module) . '/'; + /** @var \Drupal\Core\Extension\ModuleInstallerInterface $module_installer */ $module_installer = $this->container->get('module_installer'); - /** @var \Drupal\Core\Config\StorageInterface $active_config_storage */ - $active_config_storage = $this->container->get('config.storage'); - /** @var \Drupal\Core\Config\ConfigManagerInterface $config_manager */ - $config_manager = $this->container->get('config.manager'); // @todo https://www.drupal.org/node/2308745 Rest has an implicit dependency // on the Node module remove once solved. if (in_array($module, ['rest', 'hal'])) { $module_installer->install(['node']); } - $module_installer->install([$module]); - // System and user are required in order to be able to install some of the - // other modules. Therefore they are put into static::$modules, which though - // doesn't install config files, so import those config files explicitly. - switch ($module) { - case 'system': - case 'user': - $this->installConfig([$module]); - break; + // Work out any additional modules and themes that need installing to create + // and optional config. + $optional_config_storage = new FileStorage($module_path . InstallStorage::CONFIG_OPTIONAL_DIRECTORY, StorageInterface::DEFAULT_COLLECTION); + $modules_to_install = [$module]; + $themes_to_install = []; + foreach ($optional_config_storage->listAll() as $config_name) { + $data = $optional_config_storage->read($config_name); + if (isset($data['dependencies']['module'])) { + $modules_to_install = array_merge($modules_to_install, $data['dependencies']['module']); + } + if (isset($data['dependencies']['theme'])) { + $themes_to_install = array_merge($themes_to_install, $data['dependencies']['theme']); + } } + $module_installer->install(array_unique($modules_to_install)); + $this->container->get('theme_installer')->install($themes_to_install); + + // Test configuration in the module's config/install directory. + $module_config_storage = new FileStorage($module_path . InstallStorage::CONFIG_INSTALL_DIRECTORY, StorageInterface::DEFAULT_COLLECTION); + $this->doTestsOnConfigStorage($module_config_storage); + + // Test configuration in the module's config/optional directory. + $this->doTestsOnConfigStorage($optional_config_storage); + } + + /** + * Tests that default config matches the installed config. + * + * @param \Drupal\Core\Config\StorageInterface $default_config_storage + * The default config storage to test. + */ + protected function doTestsOnConfigStorage(StorageInterface $default_config_storage) { + /** @var \Drupal\Core\Config\ConfigManagerInterface $config_manager */ + $config_manager = $this->container->get('config.manager'); + + // Just connect directly to the config table so we don't need to worry about + // the cache layer. + $active_config_storage = $this->container->get('config.storage'); - $default_install_path = drupal_get_path('module', $module) . '/' . InstallStorage::CONFIG_INSTALL_DIRECTORY; - $module_config_storage = new FileStorage($default_install_path, StorageInterface::DEFAULT_COLLECTION); - - // The following config entries are changed on module install, so compare - // them doesn't make sense. - $skipped_config = []; - $skipped_config['locale.settings'][] = 'path: '; - $skipped_config['syslog.settings'][] = 'facility: '; - // @todo Figure out why simpletest.settings is not installed. - $skipped_config['simpletest.settings'] = TRUE; - - // Compare the installed config with the one in the module directory. - foreach ($module_config_storage->listAll() as $config_name) { - $result = $config_manager->diff($module_config_storage, $active_config_storage, $config_name); - $this->assertConfigDiff($result, $config_name, $skipped_config); + foreach ($default_config_storage->listAll() as $config_name) { + if ($active_config_storage->exists($config_name)) { + // If it is a config entity re-save it. This ensures that any + // recalculation of dependencies does not cause config change. + if ($entity_type = $config_manager->getEntityTypeIdByName($config_name)) { + $entity_storage = $config_manager + ->getEntityManager() + ->getStorage($entity_type); + $id = $entity_storage->getIDFromConfigName($config_name, $entity_storage->getEntityType() + ->getConfigPrefix()); + $entity_storage->load($id)->calculateDependencies()->save(); + } + $result = $config_manager->diff($default_config_storage, $active_config_storage, $config_name); + $this->assertConfigDiff($result, $config_name, static::$skippedConfig); + } } }