From 88b0d1433408451e0d6815e365a2778a91bc498d Mon Sep 17 00:00:00 2001 From: DuaelFr <DuaelFr@931394.no-reply.drupal.org> Date: Thu, 31 May 2018 10:26:38 -0600 Subject: [PATCH] Issue #2902867 by DuaelFr, mr.baileys, heddn: Documentation for skip_on_value --- src/Plugin/migrate/process/EntityLookup.php | 5 + src/Plugin/migrate/process/SkipOnValue.php | 3 +- .../migrate/process/EntityGenerateTest.php | 354 +++++++++++++++++- 3 files changed, 344 insertions(+), 18 deletions(-) diff --git a/src/Plugin/migrate/process/EntityLookup.php b/src/Plugin/migrate/process/EntityLookup.php index d02bb912..2313d5a2 100644 --- a/src/Plugin/migrate/process/EntityLookup.php +++ b/src/Plugin/migrate/process/EntityLookup.php @@ -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); diff --git a/src/Plugin/migrate/process/SkipOnValue.php b/src/Plugin/migrate/process/SkipOnValue.php index ff5a0578..f9c26be0 100644 --- a/src/Plugin/migrate/process/SkipOnValue.php +++ b/src/Plugin/migrate/process/SkipOnValue.php @@ -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 * diff --git a/tests/src/Kernel/Plugin/migrate/process/EntityGenerateTest.php b/tests/src/Kernel/Plugin/migrate/process/EntityGenerateTest.php index 0944ff83..ad6d9894 100644 --- a/tests/src/Kernel/Plugin/migrate/process/EntityGenerateTest.php +++ b/tests/src/Kernel/Plugin/migrate/process/EntityGenerateTest.php @@ -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(); + } + } -- GitLab