X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=web%2Fcore%2Fmodules%2Fmigrate_drupal%2Ftests%2Fsrc%2FKernel%2FPlugin%2Fmigrate%2Fsource%2FContentEntityTest.php;fp=web%2Fcore%2Fmodules%2Fmigrate_drupal%2Ftests%2Fsrc%2FKernel%2FPlugin%2Fmigrate%2Fsource%2FContentEntityTest.php;h=72372afc2e869a73fda4bcbe2a3e90a3c25b947b;hb=af6d1fb995500ae68849458ee10d66abbdcfb252;hp=0000000000000000000000000000000000000000;hpb=680c79a86e3ed402f263faeac92e89fb6d9edcc0;p=yaffs-website diff --git a/web/core/modules/migrate_drupal/tests/src/Kernel/Plugin/migrate/source/ContentEntityTest.php b/web/core/modules/migrate_drupal/tests/src/Kernel/Plugin/migrate/source/ContentEntityTest.php new file mode 100644 index 000000000..72372afc2 --- /dev/null +++ b/web/core/modules/migrate_drupal/tests/src/Kernel/Plugin/migrate/source/ContentEntityTest.php @@ -0,0 +1,444 @@ +installEntitySchema('node'); + $this->installEntitySchema('file'); + $this->installEntitySchema('media'); + $this->installEntitySchema('taxonomy_term'); + $this->installEntitySchema('taxonomy_vocabulary'); + $this->installEntitySchema('user'); + $this->installSchema('system', ['sequences']); + $this->installSchema('user', 'users_data'); + $this->installSchema('file', 'file_usage'); + $this->installSchema('node', ['node_access']); + $this->installConfig($this->modules); + + ConfigurableLanguage::createFromLangcode('fr')->save(); + + // Create article content type. + $node_type = NodeType::create(['type' => $this->bundle, 'name' => 'Article']); + $node_type->save(); + + // Create a vocabulary. + $vocabulary = Vocabulary::create([ + 'name' => $this->vocabulary, + 'description' => $this->vocabulary, + 'vid' => $this->vocabulary, + 'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED, + ]); + $vocabulary->save(); + + // Create a term reference field on node. + $this->createEntityReferenceField( + 'node', + $this->bundle, + $this->fieldName, + 'Term reference', + 'taxonomy_term', + 'default', + ['target_bundles' => [$this->vocabulary]], + FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED + ); + // Create a term reference field on user. + $this->createEntityReferenceField( + 'user', + 'user', + $this->fieldName, + 'Term reference', + 'taxonomy_term', + 'default', + ['target_bundles' => [$this->vocabulary]], + FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED + ); + + // Create some data. + $this->user = User::create([ + 'name' => 'user123', + 'uid' => 1, + 'mail' => 'example@example.com', + ]); + $this->user->save(); + + $term = Term::create([ + 'vid' => $this->vocabulary, + 'name' => 'Apples', + 'uid' => $this->user->id(), + ]); + $term->save(); + $this->user->set($this->fieldName, $term->id()); + $this->user->save(); + $node = Node::create([ + 'type' => $this->bundle, + 'title' => 'Apples', + $this->fieldName => $term->id(), + 'uid' => $this->user->id(), + ]); + $node->save(); + $node->addTranslation('fr', [ + 'title' => 'Pommes', + $this->fieldName => $term->id(), + ])->save(); + + $this->sourcePluginManager = $this->container->get('plugin.manager.migrate.source'); + $this->migrationPluginManager = $this->container->get('plugin.manager.migration'); + } + + /** + * Tests the constructor for missing entity_type. + */ + public function testConstructorEntityTypeMissing() { + $migration = $this->prophesize(MigrationInterface::class)->reveal(); + $configuration = []; + $plugin_definition = [ + 'entity_type' => '', + ]; + $this->setExpectedException(InvalidPluginDefinitionException::class, 'Missing required "entity_type" definition.'); + ContentEntity::create($this->container, $configuration, 'content_entity', $plugin_definition, $migration); + } + + /** + * Tests the constructor for non content entity. + */ + public function testConstructorNonContentEntity() { + $migration = $this->prophesize(MigrationInterface::class)->reveal(); + $configuration = []; + $plugin_definition = [ + 'entity_type' => 'node_type', + ]; + $this->setExpectedException(InvalidPluginDefinitionException::class, 'The entity type (node_type) is not supported. The "content_entity" source plugin only supports content entities.'); + ContentEntity::create($this->container, $configuration, 'content_entity:node_type', $plugin_definition, $migration); + } + + /** + * Tests the constructor for not bundleable entity. + */ + public function testConstructorNotBundable() { + $migration = $this->prophesize(MigrationInterface::class)->reveal(); + $configuration = [ + 'bundle' => 'foo', + ]; + $plugin_definition = [ + 'entity_type' => 'user', + ]; + $this->setExpectedException(\InvalidArgumentException::class, 'A bundle was provided but the entity type (user) is not bundleable'); + ContentEntity::create($this->container, $configuration, 'content_entity:user', $plugin_definition, $migration); + } + + /** + * Tests the constructor for invalid entity bundle. + */ + public function testConstructorInvalidBundle() { + $migration = $this->prophesize(MigrationInterface::class)->reveal(); + $configuration = [ + 'bundle' => 'foo', + ]; + $plugin_definition = [ + 'entity_type' => 'node', + ]; + $this->setExpectedException(\InvalidArgumentException::class, 'The provided bundle (foo) is not valid for the (node) entity type.'); + ContentEntity::create($this->container, $configuration, 'content_entity:node', $plugin_definition, $migration); + } + + /** + * Tests user source plugin. + */ + public function testUserSource() { + $configuration = [ + 'include_translations' => FALSE, + ]; + $migration = $this->migrationPluginManager->createStubMigration($this->migrationDefinition('content_entity:user')); + $user_source = $this->sourcePluginManager->createInstance('content_entity:user', $configuration, $migration); + $this->assertSame('user entities', $user_source->__toString()); + $this->assertEquals(1, $user_source->count()); + $ids = $user_source->getIds(); + $this->assertArrayHasKey('langcode', $ids); + $this->assertArrayHasKey('uid', $ids); + $fields = $user_source->fields(); + $this->assertArrayHasKey('name', $fields); + $this->assertArrayHasKey('pass', $fields); + $this->assertArrayHasKey('mail', $fields); + $this->assertArrayHasKey('uid', $fields); + $this->assertArrayHasKey('roles', $fields); + $user_source->rewind(); + $values = $user_source->current()->getSource(); + $this->assertEquals('example@example.com', $values['mail'][0]['value']); + $this->assertEquals('user123', $values['name'][0]['value']); + $this->assertEquals(1, $values['uid']); + $this->assertEquals(1, $values['field_entity_reference'][0]['target_id']); + } + + /** + * Tests file source plugin. + */ + public function testFileSource() { + $file = File::create([ + 'filename' => 'foo.txt', + 'uid' => $this->user->id(), + 'uri' => 'public://foo.txt', + ]); + $file->save(); + + $configuration = [ + 'include_translations' => FALSE, + ]; + $migration = $this->migrationPluginManager->createStubMigration($this->migrationDefinition('content_entity:file')); + $file_source = $this->sourcePluginManager->createInstance('content_entity:file', $configuration, $migration); + $this->assertSame('file entities', $file_source->__toString()); + $this->assertEquals(1, $file_source->count()); + $ids = $file_source->getIds(); + $this->assertArrayHasKey('fid', $ids); + $fields = $file_source->fields(); + $this->assertArrayHasKey('fid', $fields); + $this->assertArrayHasKey('filemime', $fields); + $this->assertArrayHasKey('filename', $fields); + $this->assertArrayHasKey('uid', $fields); + $this->assertArrayHasKey('uri', $fields); + $file_source->rewind(); + $values = $file_source->current()->getSource(); + $this->assertEquals('text/plain', $values['filemime'][0]['value']); + $this->assertEquals('public://foo.txt', $values['uri'][0]['value']); + $this->assertEquals('foo.txt', $values['filename'][0]['value']); + $this->assertEquals(1, $values['fid']); + } + + /** + * Tests node source plugin. + */ + public function testNodeSource() { + $migration = $this->migrationPluginManager->createStubMigration($this->migrationDefinition('content_entity:node')); + $node_source = $this->sourcePluginManager->createInstance('content_entity:node', ['bundle' => $this->bundle], $migration); + $this->assertSame('content items', $node_source->__toString()); + $ids = $node_source->getIds(); + $this->assertArrayHasKey('langcode', $ids); + $this->assertArrayHasKey('nid', $ids); + $fields = $node_source->fields(); + $this->assertArrayHasKey('nid', $fields); + $this->assertArrayHasKey('vid', $fields); + $this->assertArrayHasKey('title', $fields); + $this->assertArrayHasKey('uid', $fields); + $this->assertArrayHasKey('sticky', $fields); + $node_source->rewind(); + $values = $node_source->current()->getSource(); + $this->assertEquals($this->bundle, $values['type'][0]['target_id']); + $this->assertEquals(1, $values['nid']); + $this->assertEquals('en', $values['langcode']); + $this->assertEquals(1, $values['status'][0]['value']); + $this->assertEquals('Apples', $values['title'][0]['value']); + $this->assertEquals(1, $values['default_langcode'][0]['value']); + $this->assertEquals(1, $values['field_entity_reference'][0]['target_id']); + $node_source->next(); + $values = $node_source->current()->getSource(); + $this->assertEquals($this->bundle, $values['type'][0]['target_id']); + $this->assertEquals(1, $values['nid']); + $this->assertEquals('fr', $values['langcode']); + $this->assertEquals(1, $values['status'][0]['value']); + $this->assertEquals('Pommes', $values['title'][0]['value']); + $this->assertEquals(0, $values['default_langcode'][0]['value']); + $this->assertEquals(1, $values['field_entity_reference'][0]['target_id']); + } + + /** + * Tests media source plugin. + */ + public function testMediaSource() { + $values = [ + 'id' => 'image', + 'bundle' => 'image', + 'label' => 'Image', + 'source' => 'test', + 'new_revision' => FALSE, + ]; + $media_type = $this->createMediaType($values); + $media = Media::create([ + 'name' => 'Foo media', + 'uid' => $this->user->id(), + 'bundle' => $media_type->id(), + ]); + $media->save(); + + $configuration = [ + 'include_translations' => FALSE, + 'bundle' => 'image', + ]; + $migration = $this->migrationPluginManager->createStubMigration($this->migrationDefinition('content_entity:media')); + $media_source = $this->sourcePluginManager->createInstance('content_entity:media', $configuration, $migration); + $this->assertSame('media items', $media_source->__toString()); + $this->assertEquals(1, $media_source->count()); + $ids = $media_source->getIds(); + $this->assertArrayHasKey('langcode', $ids); + $this->assertArrayHasKey('mid', $ids); + $fields = $media_source->fields(); + $this->assertArrayHasKey('bundle', $fields); + $this->assertArrayHasKey('mid', $fields); + $this->assertArrayHasKey('name', $fields); + $this->assertArrayHasKey('status', $fields); + $media_source->rewind(); + $values = $media_source->current()->getSource(); + $this->assertEquals(1, $values['mid']); + $this->assertEquals('Foo media', $values['name'][0]['value']); + $this->assertEquals('Foo media', $values['thumbnail'][0]['title']); + $this->assertEquals(1, $values['uid'][0]['target_id']); + $this->assertEquals('image', $values['bundle'][0]['target_id']); + } + + /** + * Tests term source plugin. + */ + public function testTermSource() { + $term2 = Term::create([ + 'vid' => $this->vocabulary, + 'name' => 'Granny Smith', + 'uid' => $this->user->id(), + 'parent' => 1, + ]); + $term2->save(); + + $configuration = [ + 'include_translations' => FALSE, + 'bundle' => $this->vocabulary, + ]; + $migration = $this->migrationPluginManager->createStubMigration($this->migrationDefinition('content_entity:taxonomy_term')); + $term_source = $this->sourcePluginManager->createInstance('content_entity:taxonomy_term', $configuration, $migration); + $this->assertSame('taxonomy term entities', $term_source->__toString()); + $this->assertEquals(2, $term_source->count()); + $ids = $term_source->getIds(); + $this->assertArrayHasKey('langcode', $ids); + $this->assertArrayHasKey('tid', $ids); + $fields = $term_source->fields(); + $this->assertArrayHasKey('vid', $fields); + $this->assertArrayHasKey('tid', $fields); + $this->assertArrayHasKey('name', $fields); + $term_source->rewind(); + $values = $term_source->current()->getSource(); + $this->assertEquals($this->vocabulary, $values['vid'][0]['target_id']); + $this->assertEquals(1, $values['tid']); + // @TODO: Add test coverage for parent in + // https://www.drupal.org/project/drupal/issues/2940198 + $this->assertEquals('Apples', $values['name'][0]['value']); + $term_source->next(); + $values = $term_source->current()->getSource(); + $this->assertEquals($this->vocabulary, $values['vid'][0]['target_id']); + $this->assertEquals(2, $values['tid']); + // @TODO: Add test coverage for parent in + // https://www.drupal.org/project/drupal/issues/2940198 + $this->assertEquals('Granny Smith', $values['name'][0]['value']); + } + + /** + * Get a migration definition. + * + * @param string $plugin_id + * The plugin id. + * + * @return array + * The definition. + */ + protected function migrationDefinition($plugin_id) { + return [ + 'source' => [ + 'plugin' => $plugin_id, + ], + 'process' => [], + 'destination' => [ + 'plugin' => 'null', + ], + ]; + } + +}