Issue #1889620 by vijaycs85, sun, heyrocker: Fixed config_install_default_config() overwrites existing configuration.
parent
8d029e84b4
commit
8afbc081dd
|
@ -35,15 +35,15 @@ function config_install_default_config($type, $name) {
|
||||||
$source_storage = new FileStorage($config_dir);
|
$source_storage = new FileStorage($config_dir);
|
||||||
$target_storage = drupal_container()->get('config.storage');
|
$target_storage = drupal_container()->get('config.storage');
|
||||||
|
|
||||||
$config_changes = array(
|
// Ignore manifest files.
|
||||||
'delete' => array(),
|
$config_changes = config_sync_get_changes($source_storage, $target_storage, FALSE);
|
||||||
'create' => array(),
|
|
||||||
'change' => array(),
|
|
||||||
);
|
|
||||||
$config_changes['create'] = $source_storage->listAll();
|
|
||||||
if (empty($config_changes['create'])) {
|
if (empty($config_changes['create'])) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Do not overwrite or delete pre-existing configuration.
|
||||||
|
$config_changes['change'] = array();
|
||||||
|
$config_changes['delete'] = array();
|
||||||
$remaining_changes = config_import_invoke_owner($config_changes, $source_storage, $target_storage);
|
$remaining_changes = config_import_invoke_owner($config_changes, $source_storage, $target_storage);
|
||||||
config_sync_changes($remaining_changes, $source_storage, $target_storage);
|
config_sync_changes($remaining_changes, $source_storage, $target_storage);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,108 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Definition of Drupal\config\Tests\ConfigInstallTest.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Drupal\config\Tests;
|
||||||
|
|
||||||
|
use Drupal\simpletest\WebTestBase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests installation of configuration objects in installation functionality.
|
||||||
|
*/
|
||||||
|
class ConfigInstallWebTest extends WebTestBase {
|
||||||
|
public static function getInfo() {
|
||||||
|
return array(
|
||||||
|
'name' => 'Installation functionality',
|
||||||
|
'description' => 'Tests installation of configuration objects in installation functionality.',
|
||||||
|
'group' => 'Configuration',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function setUp() {
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
// Ensure the global variable being asserted by this test does not exist;
|
||||||
|
// a previous test executed in this request/process might have set it.
|
||||||
|
unset($GLOBALS['hook_config_test']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests module re-installation.
|
||||||
|
*/
|
||||||
|
function testIntegrationModuleReinstallation() {
|
||||||
|
$default_config = 'config_integration_test.settings';
|
||||||
|
$default_configuration_entity = 'config_test.dynamic.config_integration_test';
|
||||||
|
|
||||||
|
// Install the config_test module we're integrating with.
|
||||||
|
module_enable(array('config_test'));
|
||||||
|
|
||||||
|
// Verify the configuration does not exist prior to installation.
|
||||||
|
$config_static = config($default_config);
|
||||||
|
$this->assertIdentical($config_static->isNew(), TRUE);
|
||||||
|
$config_entity = config($default_configuration_entity);
|
||||||
|
$this->assertIdentical($config_entity->isNew(), TRUE);
|
||||||
|
|
||||||
|
// Install the integration module.
|
||||||
|
module_enable(array('config_integration_test'));
|
||||||
|
|
||||||
|
// Verify that default module config exists.
|
||||||
|
$config_static = config($default_config);
|
||||||
|
$this->assertIdentical($config_static->isNew(), FALSE);
|
||||||
|
$this->assertIdentical($config_static->get('foo'), 'default setting');
|
||||||
|
$config_entity = config($default_configuration_entity);
|
||||||
|
$this->assertIdentical($config_entity->isNew(), FALSE);
|
||||||
|
$this->assertIdentical($config_entity->get('label'), 'Default integration config label');
|
||||||
|
|
||||||
|
// Customize both configuration objects.
|
||||||
|
$config_static->set('foo', 'customized setting')->save();
|
||||||
|
$config_entity->set('label', 'Customized integration config label')->save();
|
||||||
|
|
||||||
|
// @todo FIXME: Setting config keys WITHOUT SAVING retains the changed config
|
||||||
|
// object in memory. Every new call to config() MUST revert in-memory changes
|
||||||
|
// that haven't been saved!
|
||||||
|
// In other words: This test passes even without this reset, but it shouldn't.
|
||||||
|
$this->container->get('config.factory')->reset();
|
||||||
|
|
||||||
|
// Disable and enable the integration module.
|
||||||
|
module_disable(array('config_integration_test'));
|
||||||
|
module_enable(array('config_integration_test'));
|
||||||
|
|
||||||
|
// Verify that customized config exists.
|
||||||
|
$config_static = config($default_config);
|
||||||
|
$this->assertIdentical($config_static->isNew(), FALSE);
|
||||||
|
$this->assertIdentical($config_static->get('foo'), 'customized setting');
|
||||||
|
$config_entity = config($default_configuration_entity);
|
||||||
|
$this->assertIdentical($config_entity->isNew(), FALSE);
|
||||||
|
$this->assertIdentical($config_entity->get('label'), 'Customized integration config label');
|
||||||
|
|
||||||
|
// Disable and uninstall the integration module.
|
||||||
|
module_disable(array('config_integration_test'));
|
||||||
|
module_uninstall(array('config_integration_test'));
|
||||||
|
|
||||||
|
// Verify the integration module's config was uninstalled.
|
||||||
|
$config_static = config($default_config);
|
||||||
|
$this->assertIdentical($config_static->isNew(), TRUE);
|
||||||
|
|
||||||
|
// Verify the integration config still exists.
|
||||||
|
$config_entity = config($default_configuration_entity);
|
||||||
|
$this->assertIdentical($config_entity->isNew(), FALSE);
|
||||||
|
$this->assertIdentical($config_entity->get('label'), 'Customized integration config label');
|
||||||
|
|
||||||
|
// Reinstall the integration module.
|
||||||
|
module_enable(array('config_integration_test'));
|
||||||
|
|
||||||
|
// Verify the integration module's config was re-installed.
|
||||||
|
$config_static = config($default_config);
|
||||||
|
$this->assertIdentical($config_static->isNew(), FALSE);
|
||||||
|
$this->assertIdentical($config_static->get('foo'), 'default setting');
|
||||||
|
|
||||||
|
// Verify the customized integration config still exists.
|
||||||
|
$config_entity = config($default_configuration_entity);
|
||||||
|
$this->assertIdentical($config_entity->isNew(), FALSE);
|
||||||
|
$this->assertIdentical($config_entity->get('label'), 'Customized integration config label');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
foo: 'default setting'
|
|
@ -0,0 +1,2 @@
|
||||||
|
id: config_integration_test
|
||||||
|
label: 'Default integration config label'
|
|
@ -0,0 +1,6 @@
|
||||||
|
name = ConfigTest integration
|
||||||
|
package = Testing
|
||||||
|
version = VERSION
|
||||||
|
core = 8.x
|
||||||
|
hidden = TRUE
|
||||||
|
dependencies[] = config_test
|
|
@ -0,0 +1,6 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* ConfigTest entity integration test module.
|
||||||
|
*/
|
|
@ -1,5 +1,5 @@
|
||||||
name = Configuration test module
|
name = Configuration test
|
||||||
package = Core
|
package = Testing
|
||||||
version = VERSION
|
version = VERSION
|
||||||
core = 8.x
|
core = 8.x
|
||||||
hidden = TRUE
|
hidden = TRUE
|
||||||
|
|
Loading…
Reference in New Issue