diff --git a/core/lib/Drupal/Core/Config/Config.php b/core/lib/Drupal/Core/Config/Config.php index 584feb7c53..b78a83b2be 100644 --- a/core/lib/Drupal/Core/Config/Config.php +++ b/core/lib/Drupal/Core/Config/Config.php @@ -303,4 +303,20 @@ public function getOriginal($key = '', $apply_overrides = TRUE) { } } + /** + * Determines if there are overrides applied to this configuration object. + * + * @param string $key + * A string that maps to a key within the configuration data. + * + * @return bool + * TRUE if there are any overrides for the key, otherwise FALSE. + */ + public function hasOverrides($key = '') { + if ($key) { + return isset($this->moduleOverrides[$key]) || isset($this->settingsOverrides[$key]); + } + return !empty($this->moduleOverrides) || !empty($this->settingsOverrides); + } + } diff --git a/core/tests/Drupal/Tests/Core/Config/ConfigTest.php b/core/tests/Drupal/Tests/Core/Config/ConfigTest.php index 41c3e93c99..2fc5380621 100644 --- a/core/tests/Drupal/Tests/Core/Config/ConfigTest.php +++ b/core/tests/Drupal/Tests/Core/Config/ConfigTest.php @@ -173,6 +173,7 @@ public function testSaveExisting($data) { * @covers ::setModuleOverride * @covers ::setSettingsOverride * @covers ::getOriginal + * @covers ::hasOverrides * @dataProvider overrideDataProvider */ public function testOverrideData($data, $module_data, $setting_data) { @@ -184,26 +185,40 @@ public function testOverrideData($data, $module_data, $setting_data) { // Save so that the original data is stored. $this->config->save(); + $this->assertFalse($this->config->hasOverrides()); + $this->assertOverriddenKeys($data); // Set module override data and check value before and after save. $this->config->setModuleOverride($module_data); $this->assertConfigDataEquals($module_data); + $this->assertOverriddenKeys($data, $module_data); + $this->config->save(); $this->assertConfigDataEquals($module_data); + $this->assertOverriddenKeys($data, $module_data); + + // Reset the module overrides. + $this->config->setModuleOverride([]); + $this->assertOverriddenKeys($data); // Set setting override data and check value before and after save. $this->config->setSettingsOverride($setting_data); $this->assertConfigDataEquals($setting_data); + $this->assertOverriddenKeys($data, $setting_data); $this->config->save(); $this->assertConfigDataEquals($setting_data); + $this->assertOverriddenKeys($data, $setting_data); // Set module overrides again to ensure override order is correct. $this->config->setModuleOverride($module_data); + $merged_overrides = array_merge($module_data, $setting_data); // Setting data should be overriding module data. $this->assertConfigDataEquals($setting_data); + $this->assertOverriddenKeys($data, $merged_overrides); $this->config->save(); $this->assertConfigDataEquals($setting_data); + $this->assertOverriddenKeys($data, $merged_overrides); // Check original data has not changed. $this->assertOriginalConfigDataEquals($data, FALSE); @@ -216,6 +231,15 @@ public function testOverrideData($data, $module_data, $setting_data) { $config_value = $this->config->getOriginal($key); $this->assertEquals($value, $config_value); } + + // Check that the overrides can be completely reset. + $this->config->setModuleOverride([]); + $this->config->setSettingsOverride([]); + $this->assertConfigDataEquals($data); + $this->assertOverriddenKeys($data); + $this->config->save(); + $this->assertConfigDataEquals($data); + $this->assertOverriddenKeys($data); } /** @@ -449,6 +473,37 @@ public function overrideDataProvider() { 'a' => 'settingValue', ], ], + [ + // Original data. + [ + 'a' => 'originalValue', + 'b' => 'originalValue', + 'c' => 'originalValue', + ], + // Module overrides. + [ + 'a' => 'moduleValue', + 'b' => 'moduleValue', + ], + // Setting overrides. + [ + 'a' => 'settingValue', + ], + ], + [ + // Original data. + [ + 'a' => 'allTheSameValue', + ], + // Module overrides. + [ + 'a' => 'allTheSameValue', + ], + // Setting overrides. + [ + 'a' => 'allTheSameValue', + ], + ], ]; } @@ -545,4 +600,29 @@ public function testSafeStringHandling() { $this->assertSame($safe_string, $this->config->get('bar')); } + /** + * Assert that the correct keys are overridden. + * + * @param array $data + * The original data. + * @param array $overridden_data + * The overridden data. + */ + protected function assertOverriddenKeys(array $data, array $overridden_data = []) { + if (empty($overridden_data)) { + $this->assertFalse($this->config->hasOverrides()); + } + else { + $this->assertTrue($this->config->hasOverrides()); + foreach (array_keys($overridden_data) as $overridden_key) { + $this->assertTrue($this->config->hasOverrides($overridden_key)); + } + } + + $non_overridden_keys = array_diff(array_keys($data), array_keys($overridden_data)); + foreach ($non_overridden_keys as $non_overridden_key) { + $this->assertFalse($this->config->hasOverrides($non_overridden_key)); + } + } + }