diff --git a/core/modules/migrate_drupal/src/Tests/d6/MigrateActionConfigSchemaTest.php b/core/modules/migrate_drupal/src/Tests/d6/MigrateActionConfigSchemaTest.php new file mode 100644 index 0000000..a0d2792 --- /dev/null +++ b/core/modules/migrate_drupal/src/Tests/d6/MigrateActionConfigSchemaTest.php @@ -0,0 +1,56 @@ + 'Migrate action configuration schema', + 'description' => 'Tests the configuration schema of action module', + 'group' => 'Migrate Drupal', + ); + } + + /** + * {@inheritdoc} + */ + public function setUp() { + parent::setUp(); + $migration = entity_load('migration', 'd6_action_settings'); + $dumps = array( + $this->getDumpDirectory() . '/Drupal6ActionSettings.php', + ); + $this->prepare($migration, $dumps); + $executable = new MigrateExecutable($migration, $this); + $executable->import(); + } + + /** + * Tests migration of action variables to action.settings.yml. + */ + public function testActionConfigSchema() { + $config_data = \Drupal::config('action.settings')->get(); + $this->assertConfigSchema(\Drupal::service('config.typed'), 'action.settings', $config_data); + } + +} diff --git a/core/modules/migrate_drupal/src/Tests/d6/MigrateConfigSchemaBase.php b/core/modules/migrate_drupal/src/Tests/d6/MigrateConfigSchemaBase.php new file mode 100644 index 0000000..b8f31aa --- /dev/null +++ b/core/modules/migrate_drupal/src/Tests/d6/MigrateConfigSchemaBase.php @@ -0,0 +1,144 @@ +configName = $config_name; + if (!$typed_config->hasConfigSchema($config_name)) { + $this->fail(String::format('No schema for !config_name', array('!config_name' => $config_name))); + return; + } + $definition = $typed_config->getDefinition($config_name); + $this->schema = $typed_config->create($definition, $config_data); + $this->configPass = TRUE; + foreach ($config_data as $key => $value) { + $this->checkValue($key, $value); + } + if ($this->configPass) { + $this->pass(String::format('Schema found for !config_name and values comply with schema.', array('!config_name' => $config_name))); + } + } + + /** + * Helper method to check data type. + * + * @param string $key + * A string of configuration key. + * @param mixed $value + * Value of given key. + * + * @return mixed + * Returns mixed value. + */ + protected function checkValue($key, $value) { + $element = FALSE; + try { + $element = $this->schema->get($key); + } + catch (SchemaIncompleteException $e) { + if (is_scalar($value) || $value === NULL) { + $this->fail("{$this->configName}:$key has no schema."); + } + } + // Do not check value if it is defined to be ignored. + if ($element && $element instanceof Ignore) { + return $value; + } + + if (is_scalar($value) || $value === NULL) { + $success = FALSE; + $type = gettype($value); + if ($element instanceof PrimitiveInterface) { + $success = + ($type == 'integer' && $element instanceof IntegerInterface) || + ($type == 'double' && $element instanceof FloatInterface) || + ($type == 'boolean' && $element instanceof BooleanInterface) || + ($type == 'string' && $element instanceof StringInterface) || + // Null values are allowed for all types. + ($value === NULL); + } + $class = get_class($element); + if (!$success) { + $this->fail("{$this->configName}:$key has the wrong schema. Variable type is $type and schema class is $class."); + } + } + else { + if (!$element instanceof ArrayElement) { + $this->fail("Non-scalar {$this->configName}:$key is not defined as an array type (such as mapping or sequence)."); + } + + // Go on processing so we can get errors on all levels. Any non-scalar + // value must be an array so cast to an array. + if (!is_array($value)) { + $value = (array) $value; + } + // Recurse into any nested keys. + foreach ($value as $nested_value_key => $nested_value) { + $value[$nested_value_key] = $this->checkValue($key . '.' . $nested_value_key, $nested_value); + } + } + return $value; + } + + /** + * {@inheritdoc} + */ + protected function fail($message = NULL, $group = 'Other') { + $this->configPass = FALSE; + return parent::fail($message, $group); + } + +}