diff --git a/core/modules/config/tests/config_test/config/schema/config_test.schema.yml b/core/modules/config/tests/config_test/config/schema/config_test.schema.yml index 65787afd7a..2cd68a4361 100644 --- a/core/modules/config/tests/config_test/config/schema/config_test.schema.yml +++ b/core/modules/config/tests/config_test/config/schema/config_test.schema.yml @@ -162,6 +162,9 @@ config_test.bar: config_test.validation: type: config_object label: 'Configuration type' + constraints: + Callback: + callback: [\Drupal\config_test\ConfigValidation, validateMapping] mapping: llama: type: string @@ -183,6 +186,9 @@ config_test.validation: callback: [\Drupal\config_test\ConfigValidation, validateCatCount] giraffe: type: sequence + constraints: + Callback: + callback: [\Drupal\config_test\ConfigValidation, validateSequence] sequence: type: string constraints: diff --git a/core/modules/config/tests/config_test/src/ConfigValidation.php b/core/modules/config/tests/config_test/src/ConfigValidation.php index e11bfed3e8..d076dbf747 100644 --- a/core/modules/config/tests/config_test/src/ConfigValidation.php +++ b/core/modules/config/tests/config_test/src/ConfigValidation.php @@ -64,5 +64,33 @@ public static function validateGiraffes($string, ExecutionContextInterface $cont $context->addViolation('Giraffes just hum'); } } + + /** + * Validates a mapping. + * + * @param array $mapping + * The data to validate. + * @param \Symfony\Component\Validator\Context\ExecutionContextInterface $context + * The validation execution context. + */ + public static function validateMapping($mapping, ExecutionContextInterface $context) { + if ($diff = array_diff(array_keys($mapping), ['llama', 'cat', 'giraffe', '_core'])) { + $context->addViolation('Missing giraffe.'); + } + } + + /** + * Validates a sequence. + * + * @param array $sequence + * The data to validate. + * @param \Symfony\Component\Validator\Context\ExecutionContextInterface $context + * The validation execution context. + */ + public static function validateSequence($sequence, ExecutionContextInterface $context) { + if (isset($sequence['invalid-key'])) { + $context->addViolation('Invalid giraffe key.'); + } + } } diff --git a/core/tests/Drupal/KernelTests/Config/TypedConfigTest.php b/core/tests/Drupal/KernelTests/Config/TypedConfigTest.php index 6e9b7f9c91..5881a14412 100644 --- a/core/tests/Drupal/KernelTests/Config/TypedConfigTest.php +++ b/core/tests/Drupal/KernelTests/Config/TypedConfigTest.php @@ -112,15 +112,35 @@ public function testSimpleConfigValidation() { $this->assertCount(1, $result); $this->assertEquals('no valid cat', $result->get(0)->getMessage()); - // Test constrains on sequences. + // Test constrains on sequences elements. $config->set('cat.type', 'nyans'); $config->set('giraffe', ['muh', 'hum2']); $config->save(); - $typed_config = $typed_config_manager->get('config_test.validation'); $result = $typed_config->validate(); $this->assertCount(1, $result); $this->assertEquals('Giraffes just hum', $result->get(0)->getMessage()); + + // Test constrains on the sequence itself. + $config->set('giraffe', ['hum', 'hum2', 'invalid-key' => 'hum']); + $config->save(); + + $typed_config = $typed_config_manager->get('config_test.validation'); + $result = $typed_config->validate(); + $this->assertCount(1, $result); + $this->assertEquals('giraffe', $result->get(0)->getPropertyPath()); + $this->assertEquals('Invalid giraffe key.', $result->get(0)->getMessage()); + + // Validates mapping. + $typed_config = $typed_config_manager->get('config_test.validation'); + $value = $typed_config->getValue(); + unset($value['giraffe']); + $value['elephant'] = 'foo'; + $typed_config->setValue($value); + $result = $typed_config->validate(); + $this->assertCount(1, $result); + $this->assertEquals('', $result->get(0)->getPropertyPath()); + $this->assertEquals('Missing giraffe.', $result->get(0)->getMessage()); } }