123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- <?php
- namespace Drupal\KernelTests\Config;
- use Drupal\Core\Config\Schema\SequenceDataDefinition;
- use Drupal\Core\Config\Schema\TypedConfigInterface;
- use Drupal\Core\TypedData\ComplexDataDefinitionInterface;
- use Drupal\Core\TypedData\ComplexDataInterface;
- use Drupal\Core\TypedData\Type\IntegerInterface;
- use Drupal\Core\TypedData\Type\StringInterface;
- use Drupal\KernelTests\KernelTestBase;
- use Symfony\Component\Validator\ConstraintViolationListInterface;
- /**
- * Tests config validation mechanism.
- *
- * @group Config
- */
- class TypedConfigTest extends KernelTestBase {
- /**
- * {@inheritdoc}
- */
- public static $modules = ['config_test'];
- /**
- * {@inheritdoc}
- */
- protected function setUp() {
- parent::setUp();
- $this->installConfig('config_test');
- }
- /**
- * Verifies that the Typed Data API is implemented correctly.
- */
- public function testTypedDataAPI() {
- /** @var \Drupal\Core\Config\TypedConfigManagerInterface $typed_config_manager */
- $typed_config_manager = \Drupal::service('config.typed');
- /** @var \Drupal\Core\Config\Schema\TypedConfigInterface $typed_config */
- $typed_config = $typed_config_manager->get('config_test.validation');
- // Test a primitive.
- $string_data = $typed_config->get('llama');
- $this->assertInstanceOf(StringInterface::class, $string_data);
- $this->assertEquals('llama', $string_data->getValue());
- // Test complex data.
- $mapping = $typed_config->get('cat');
- /** @var \Drupal\Core\TypedData\ComplexDataInterface $mapping */
- $this->assertInstanceOf(ComplexDataInterface::class, $mapping);
- $this->assertInstanceOf(StringInterface::class, $mapping->get('type'));
- $this->assertEquals('kitten', $mapping->get('type')->getValue());
- $this->assertInstanceOf(IntegerInterface::class, $mapping->get('count'));
- $this->assertEquals(2, $mapping->get('count')->getValue());
- // Verify the item metadata is available.
- $this->assertInstanceOf(ComplexDataDefinitionInterface::class, $mapping->getDataDefinition());
- $this->assertArrayHasKey('type', $mapping->getProperties());
- $this->assertArrayHasKey('count', $mapping->getProperties());
- // Test accessing sequences.
- $sequence = $typed_config->get('giraffe');
- /** @var \Drupal\Core\TypedData\ListInterface $sequence */
- $this->assertInstanceOf(ComplexDataInterface::class, $sequence);
- $this->assertInstanceOf(StringInterface::class, $sequence->get('hum1'));
- $this->assertEquals('hum1', $sequence->get('hum1')->getValue());
- $this->assertEquals('hum2', $sequence->get('hum2')->getValue());
- $this->assertCount(2, $sequence->getIterator());
- // Verify the item metadata is available.
- $this->assertInstanceOf(SequenceDataDefinition::class, $sequence->getDataDefinition());
- // Test accessing typed config objects for simple config and config
- // entities.
- $typed_config_manager = \Drupal::service('config.typed');
- $typed_config = $typed_config_manager->createFromNameAndData('config_test.validation', \Drupal::configFactory()->get('config_test.validation')->get());
- $this->assertInstanceOf(TypedConfigInterface::class, $typed_config);
- $this->assertEquals(['llama', 'cat', 'giraffe', 'uuid', '_core'], array_keys($typed_config->getElements()));
- $config_test_entity = \Drupal::entityTypeManager()->getStorage('config_test')->create([
- 'id' => 'asterix',
- 'label' => 'Asterix',
- 'weight' => 11,
- 'style' => 'test_style',
- ]);
- $typed_config = $typed_config_manager->createFromNameAndData($config_test_entity->getConfigDependencyName(), $config_test_entity->toArray());
- $this->assertInstanceOf(TypedConfigInterface::class, $typed_config);
- $this->assertEquals(['uuid', 'langcode', 'status', 'dependencies', 'id', 'label', 'weight', 'style', 'size', 'size_value', 'protected_property'], array_keys($typed_config->getElements()));
- }
- /**
- * Tests config validation via the Typed Data API.
- */
- public function testSimpleConfigValidation() {
- $config = \Drupal::configFactory()->getEditable('config_test.validation');
- /** @var \Drupal\Core\Config\TypedConfigManagerInterface $typed_config_manager */
- $typed_config_manager = \Drupal::service('config.typed');
- /** @var \Drupal\Core\Config\Schema\TypedConfigInterface $typed_config */
- $typed_config = $typed_config_manager->get('config_test.validation');
- $result = $typed_config->validate();
- $this->assertInstanceOf(ConstraintViolationListInterface::class, $result);
- $this->assertEmpty($result);
- // Test constraints on primitive types.
- $config->set('llama', 'elephant');
- $config->save();
- $typed_config = $typed_config_manager->get('config_test.validation');
- $result = $typed_config->validate();
- // Its not a valid llama anymore.
- $this->assertCount(1, $result);
- $this->assertEquals('no valid llama', $result->get(0)->getMessage());
- // Test constraints on mapping.
- $config->set('llama', 'llama');
- $config->set('cat.type', 'nyans');
- $config->save();
- $typed_config = $typed_config_manager->get('config_test.validation');
- $result = $typed_config->validate();
- $this->assertEmpty($result);
- // Test constrains on nested mapping.
- $config->set('cat.type', 'miaus');
- $config->save();
- $typed_config = $typed_config_manager->get('config_test.validation');
- $result = $typed_config->validate();
- $this->assertCount(1, $result);
- $this->assertEquals('no valid cat', $result->get(0)->getMessage());
- // 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';
- $value['zebra'] = 'foo';
- $typed_config->setValue($value);
- $result = $typed_config->validate();
- $this->assertCount(1, $result);
- $this->assertEquals('', $result->get(0)->getPropertyPath());
- $this->assertEquals('Unexpected keys: elephant, zebra', $result->get(0)->getMessage());
- }
- }
|