Skip to content
Snippets Groups Projects
Commit 88b0d143 authored by Edouard Cunibil's avatar Edouard Cunibil Committed by Lucas Hedding
Browse files

Issue #2902867 by DuaelFr, mr.baileys, heddn: Documentation for skip_on_value

parent f95e6b75
No related branches found
No related tags found
No related merge requests found
......@@ -152,6 +152,11 @@ class EntityLookup extends ProcessPluginBase implements ContainerFactoryPluginIn
* {@inheritdoc}
*/
public function transform($value, MigrateExecutableInterface $migrateExecutable, Row $row, $destinationProperty) {
// If the source data is an empty array, return the same.
if (gettype($value) === 'array' && count($value) === 0) {
return [];
}
// In case of subfields ('field_reference/target_id'), extract the field
// name only.
$parts = explode('/', $destinationProperty);
......
......@@ -20,7 +20,7 @@ use Drupal\migrate\Row;
* - value: An single value or array of values against which the source value
* should be compared.
* - not_equals: (optional) If set, skipping occurs when values are not equal.
* - method: (optional) What to do if the input value is empty. Possible values:
* - method: What to do if the input value is empty. Possible values:
* - row: Skips the entire row when an empty value is encountered.
* - process: Prevents further processing of the input property when the value
* is empty.
......@@ -32,6 +32,7 @@ use Drupal\migrate\Row;
* type:
* plugin: skip_on_value
* source: content_type
* method: row
* value: blog
* @endcode
*
......
......@@ -119,12 +119,16 @@ class EntityGenerateTest extends KernelTestBase implements MigrateMessageInterfa
public function testTransform(array $definition, array $expected, array $preSeed = []) {
// Pre seed some test data.
foreach ($preSeed as $storageName => $values) {
/** @var \Drupal\Core\Entity\ContentEntityStorageInterface $storage */
$storage = $this->container
->get('entity_type.manager')
->getStorage($storageName);
$entity = $storage->create($values);
$entity->save();
// If the first element of $values is a non-empty array, create multiple
// entities. Otherwise, create just one entity.
if (isset($values[0])) {
foreach ($values as $itemValues) {
$this->createTestData($storageName, $itemValues);
}
}
else {
$this->createTestData($storageName, $values);
}
}
/** @var \Drupal\migrate\Plugin\Migration $migration */
......@@ -139,20 +143,52 @@ class EntityGenerateTest extends KernelTestBase implements MigrateMessageInterfa
$properties = array_diff_key($row, array_flip(['id']));
foreach ($properties as $property => $value) {
if (is_array($value)) {
foreach ($value as $key => $expectedValue) {
if (empty($expectedValue)) {
if (!$entity->{$property}->isEmpty()) {
$this->assertTrue($entity->{$property}[0]->entity->$key->isEmpty(), "Expected value is empty but field $property.$key is not empty.");
}
else {
$this->assertTrue($entity->{$property}->isEmpty(), "Expected value is empty but field $property is not empty.");
if (empty($value)) {
$this->assertEmpty($entity->{$property}->getValue(), "Expected value is 'unset' but field $property is set.");
}
else {
// Check if we're testing multiple values in one field. If so, loop
// through them one-by-one and check that they're present in the
// $entity.
if (isset($value[0])) {
foreach ($value as $valueID => $valueToCheck) {
foreach ($valueToCheck as $key => $expectedValue) {
if (empty($expectedValue)) {
if (!$entity->{$property}->isEmpty()) {
$this->assertTrue($entity->{$property}[0]->entity->$key->isEmpty(), "Expected value is empty but field $property.$key is not empty.");
}
else {
$this->assertTrue($entity->{$property}->isEmpty(), "FOOBAR Expected value is empty but field $property is not empty.");
}
}
elseif ($entity->{$property}->getValue()) {
$this->assertEquals($expectedValue, $entity->{$property}[$valueID]->entity->$key->value);
}
else {
$this->fail("Expected value: $expectedValue does not exist in $property.");
}
}
}
}
elseif ($entity->{$property}->getValue()) {
$this->assertEquals($expectedValue, $entity->{$property}[0]->entity->$key->value);
}
// If we get to this point, we're only checking a
// single field value.
else {
$this->fail("Expected value: $expectedValue does not exist in $property.");
foreach ($value as $key => $expectedValue) {
if (empty($expectedValue)) {
if (!$entity->{$property}->isEmpty()) {
$this->assertTrue($entity->{$property}[0]->entity->$key->isEmpty(), "Expected value is empty but field $property.$key is not empty.");
}
else {
$this->assertTrue($entity->{$property}->isEmpty(), "BINBAZ Expected value is empty but field $property is not empty.");
}
}
elseif ($entity->{$property}->getValue()) {
$this->assertEquals($expectedValue, $entity->{$property}[0]->entity->$key->value);
}
else {
$this->fail("Expected value: $expectedValue does not exist in $property.");
}
}
}
}
}
......@@ -405,6 +441,273 @@ class EntityGenerateTest extends KernelTestBase implements MigrateMessageInterfa
],
],
],
'lookup single existing term returns correct term' => [
'definition' => [
'source' => [
'plugin' => 'embedded_data',
'data_rows' => [
[
'id' => 1,
'title' => 'content item 1',
'term' => 'Grapes',
],
],
'ids' => [
'id' => ['type' => 'integer'],
],
],
'process' => [
'id' => 'id',
'type' => [
'plugin' => 'default_value',
'default_value' => $this->bundle,
],
'title' => 'title',
$this->fieldName => [
'plugin' => 'entity_lookup',
'source' => 'term',
],
],
'destination' => [
'plugin' => 'entity:node',
],
],
'expected' => [
'row 1' => [
'id' => 1,
'title' => 'content item 1',
$this->fieldName => [
'tid' => 1,
'name' => 'Grapes',
],
],
],
'pre seed' => [
'taxonomy_term' => [
'name' => 'Grapes',
'vid' => $this->vocabulary,
'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
],
],
],
'lookup single missing term returns null value' => [
'definition' => [
'source' => [
'plugin' => 'embedded_data',
'data_rows' => [
[
'id' => 1,
'title' => 'content item 1',
'term' => 'Apple',
],
],
'ids' => [
'id' => ['type' => 'integer'],
],
],
'process' => [
'id' => 'id',
'type' => [
'plugin' => 'default_value',
'default_value' => $this->bundle,
],
'title' => 'title',
$this->fieldName => [
'plugin' => 'entity_lookup',
'source' => 'term',
],
],
'destination' => [
'plugin' => 'entity:node',
],
],
'expected' => [
'row 1' => [
'id' => 1,
'title' => 'content item 1',
$this->fieldName => [],
],
],
'pre seed' => [
'taxonomy_term' => [
'name' => 'Grapes',
'vid' => $this->vocabulary,
'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
],
],
],
'lookup multiple existing terms returns correct terms' => [
'definition' => [
'source' => [
'plugin' => 'embedded_data',
'data_rows' => [
[
'id' => 1,
'title' => 'content item 1',
'term' => [
'Grapes',
'Apples',
],
],
],
'ids' => [
'id' => ['type' => 'integer'],
],
],
'process' => [
'id' => 'id',
'title' => 'title',
'type' => [
'plugin' => 'default_value',
'default_value' => $this->bundle,
],
$this->fieldName => [
'plugin' => 'entity_lookup',
'source' => 'term',
],
],
'destination' => [
'plugin' => 'entity:node',
],
],
'expected' => [
'row 1' => [
'id' => 1,
'title' => 'content item 1',
$this->fieldName => [
[
'tid' => 1,
'name' => 'Grapes',
],
[
'tid' => 2,
'name' => 'Apples',
],
],
],
],
'pre seed' => [
'taxonomy_term' => [
[
'name' => 'Grapes',
'vid' => $this->vocabulary,
'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
],
[
'name' => 'Apples',
'vid' => $this->vocabulary,
'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
],
],
],
],
'lookup multiple mixed terms returns correct terms' => [
'definition' => [
'source' => [
'plugin' => 'embedded_data',
'data_rows' => [
[
'id' => 1,
'title' => 'content item 1',
'term' => [
'Grapes',
'Pears',
],
],
],
'ids' => [
'id' => ['type' => 'integer'],
],
],
'process' => [
'id' => 'id',
'title' => 'title',
'type' => [
'plugin' => 'default_value',
'default_value' => $this->bundle,
],
$this->fieldName => [
'plugin' => 'entity_lookup',
'source' => 'term',
],
],
'destination' => [
'plugin' => 'entity:node',
],
],
'expected' => [
'row 1' => [
'id' => '1',
'title' => 'content item 1',
$this->fieldName => [
[
'tid' => 1,
'name' => 'Grapes',
],
],
],
],
'pre seed' => [
'taxonomy_term' => [
[
'name' => 'Grapes',
'vid' => $this->vocabulary,
'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
],
[
'name' => 'Apples',
'vid' => $this->vocabulary,
'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
],
],
],
],
'lookup with empty term value returns no terms' => [
'definition' => [
'source' => [
'plugin' => 'embedded_data',
'data_rows' => [
[
'id' => 1,
'title' => 'content item 1',
'term' => [],
],
],
'ids' => [
'id' => ['type' => 'integer'],
],
],
'process' => [
'id' => 'id',
'title' => 'title',
'type' => [
'plugin' => 'default_value',
'default_value' => $this->bundle,
],
$this->fieldName => [
'plugin' => 'entity_lookup',
'source' => 'term',
],
],
'destination' => [
'plugin' => 'entity:node',
],
],
'expected' => [
'row 1' => [
'id' => 1,
'title' => 'content item 1',
$this->fieldName => [],
],
],
'pre seed' => [
'taxonomy_term' => [
'name' => 'Grapes',
'vid' => $this->vocabulary,
'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
],
],
],
];
}
......@@ -415,4 +718,21 @@ class EntityGenerateTest extends KernelTestBase implements MigrateMessageInterfa
$this->assertTrue($type == 'status', $message);
}
/**
* Create pre-seed test data.
*
* @param string $storageName
* The storage manager to create.
* @param array $values
* The values to use when creating the entity.
*/
private function createTestData($storageName, array $values) {
/** @var \Drupal\Core\Entity\ContentEntityStorageInterface $storage */
$storage = $this->container
->get('entity_type.manager')
->getStorage($storageName);
$entity = $storage->create($values);
$entity->save();
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment