diff -u b/tests/src/Kernel/Plugin/migrate/process/EntityGenerateTest.php b/tests/src/Kernel/Plugin/migrate/process/EntityGenerateTest.php --- b/tests/src/Kernel/Plugin/migrate/process/EntityGenerateTest.php +++ b/tests/src/Kernel/Plugin/migrate/process/EntityGenerateTest.php @@ -3,27 +3,24 @@ namespace Drupal\Tests\migrate_plus\Kernel\Plugin\migrate\process; use Drupal\Core\Field\FieldStorageDefinitionInterface; +use Drupal\Core\Language\LanguageInterface; use Drupal\field\Tests\EntityReference\EntityReferenceTestTrait; use Drupal\KernelTests\KernelTestBase; use Drupal\migrate\MigrateExecutable; use Drupal\migrate\MigrateMessageInterface; use Drupal\migrate\Plugin\Migration; -use Drupal\migrate\Plugin\MigrationPluginManager; use Drupal\node\Entity\NodeType; -use Drupal\node\NodeStorageInterface; -use Drupal\taxonomy\TermStorageInterface; -use Drupal\taxonomy\Tests\TaxonomyTestTrait; +use Drupal\taxonomy\Entity\Vocabulary; /** * Tests the migration plugin. * * @coversDefaultClass \Drupal\migrate_plus\Plugin\migrate\process\EntityGenerate - * @group entity_reference_revisions + * @group migrate_plus */ class EntityGenerateTest extends KernelTestBase implements MigrateMessageInterface { use EntityReferenceTestTrait; - use TaxonomyTestTrait; /** * {@inheritdoc} @@ -55,6 +52,13 @@ protected $fieldName = 'field_entity_reference'; /** + * The vocabulary id. + * + * @var string + */ + protected $vocabulary = 'fruit'; + + /** * @var \Drupal\migrate\Plugin\MigrationPluginManager $migrationManager * * The migration plugin manager. @@ -83,7 +87,13 @@ $this->installConfig($this->modules); // Create a vocabulary. - $vocabulary = $this->createVocabulary(); + $vocabulary = Vocabulary::create([ + 'name' => $this->vocabulary, + 'description' => $this->vocabulary, + 'vid' => $this->vocabulary, + 'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED, + ]); + $vocabulary->save(); // Create a field. $this->createEntityReferenceField( @@ -93,7 +103,7 @@ 'Term reference', 'taxonomy_term', 'default', - ['target_bundles' => [$vocabulary->id()]], + ['target_bundles' => [$this->vocabulary]], FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED ); @@ -107,20 +117,45 @@ * * @covers ::transform */ - public function testTransform(array $definition, array $expected) { + 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(); + } + /** @var Migration $migration */ $migration = $this->migrationPluginManager->createStubMigration($definition); + /** @var EntityStorageBase $storage */ + $storage = $this->readAttribute($migration->getDestinationPlugin(), 'storage'); $migrationExecutable = (new MigrateExecutable($migration, $this)); $migrationExecutable->import(); foreach ($expected as $row) { - foreach ($row as $storageName => $values) { - /** @var \Drupal\Core\Entity\ContentEntityStorageInterface $storage */ - $storage = $this->container - ->get('entity_type.manager') - ->getStorage($storageName); - $entity = $storage->load($values['id']); - $this->assertEquals($values['label'], $entity->label()); + $entity = $storage->load($row['id']); + $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)) { + $this->assertEmpty($entity->{$property}->getValue(), "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."); + } + } + } + else { + $this->assertNotEmpty($entity, 'Entity with label ' . $row[$property] .' is empty'); + $this->assertEquals($row[$property], $entity->label()); + } } } } @@ -145,6 +180,11 @@ 'title' => 'content item 2', 'term' => 'Bananas', ], + [ + 'id' => 3, + 'title' => 'content item 3', + 'term' => 'Grapes', + ], ], 'ids' => [ 'id' => ['type' => 'integer'], @@ -168,12 +208,110 @@ ], 'expected' => [ 'row 1' => [ - 'node' => ['id' => 1, 'label' => 'content item 1'], - 'taxonomy_term' => ['id' => 1, 'label' => 'Apples'], + 'id' => 1, + 'title' => 'content item 1', + $this->fieldName => [ + 'tid' => 2, + 'name' => 'Apples', + ], + ], + 'row 2' => [ + 'id' => 2, + 'title' => 'content item 2', + $this->fieldName => [ + 'tid' => 3, + 'name' => 'Bananas', + ], + ], + 'row 3' => [ + 'id' => 3, + 'title' => 'content item 3', + $this->fieldName => [ + 'tid' => 1, + 'name' => 'Grapes', + ], + ], + ], + 'pre seed' => [ + 'taxonomy_term' => [ + 'name' => 'Grapes', + 'vid' => $this->vocabulary, + 'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED, + ], + ], + ], + 'no arguments_lookup_only' => [ + 'definition' => [ + 'source' => [ + 'plugin' => 'embedded_data', + 'data_rows' => [ + [ + 'id' => 1, + 'title' => 'content item 1', + 'term' => 'Apples', + ], + [ + 'id' => 2, + 'title' => 'content item 2', + 'term' => 'Bananas', + ], + [ + 'id' => 3, + 'title' => 'content item 3', + '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' => NULL, + 'name' => NULL, + ], ], 'row 2' => [ - 'node' => ['id' => 2, 'label' => 'content item 2'], - 'taxonomy_term' => ['id' => 2, 'label' => 'Bananas'], + 'id' => 2, + 'title' => 'content item 2', + $this->fieldName => [ + 'tid' => NULL, + 'name' => NULL, + ], + ], + 'row 3' => [ + 'id' => 3, + 'title' => 'content item 3', + $this->fieldName => [ + 'tid' => 1, + 'name' => 'Grapes', + ], + ], + ], + 'pre seed' => [ + 'taxonomy_term' => [ + 'name' => 'Grapes', + 'vid' => $this->vocabulary, + 'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED, ], ], ],