diff -u b/core/modules/file/src/Plugin/migrate/process/d6/FieldFile.php b/core/modules/file/src/Plugin/migrate/process/d6/CckFile.php --- b/core/modules/file/src/Plugin/migrate/process/d6/FieldFile.php +++ b/core/modules/file/src/Plugin/migrate/process/d6/CckFile.php @@ -5,88 +5,14 @@ -use Drupal\Core\Plugin\ContainerFactoryPluginInterface; -use Drupal\migrate\Plugin\MigrationInterface; -use Drupal\migrate\MigrateExecutableInterface; -use Drupal\migrate\Plugin\MigrateProcessInterface; -use Drupal\migrate\ProcessPluginBase; -use Drupal\migrate\Row; -use Symfony\Component\DependencyInjection\ContainerInterface; +@trigger_error('CckFile is deprecated in Drupal 8.3.x and will be +be removed before Drupal 9.0.x. Use \Drupal\file\Plugin\migrate\process\d6\FieldFile +instead.', E_USER_DEPRECATED); + /** * @MigrateProcessPlugin( - * id = "d6_field_file" + * id = "d6_cck_file" * ) + * + * @deprecated in Drupal 8.3.x, to be removed before Drupal 9.0.x. Use + * \Drupal\file\Plugin\migrate\process\d6\FieldFile instead. */ -class FieldFile extends ProcessPluginBase implements ContainerFactoryPluginInterface { - - /** - * The migration process plugin, configured for lookups in d6_file. - * - * @var \Drupal\migrate\Plugin\MigrateProcessInterface - */ - protected $migrationPlugin; - - /** - * Constructs a FieldFile plugin instance. - * - * @param array $configuration - * The plugin configuration. - * @param string $plugin_id - * The plugin ID. - * @param mixed $plugin_definition - * The plugin definition. - * @param \Drupal\migrate\Plugin\MigrationInterface $migration - * The current migration. - * @param \Drupal\migrate\Plugin\MigrateProcessInterface $migration_plugin - * An instance of the 'migration' process plugin. - */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, MigrateProcessInterface $migration_plugin) { - parent::__construct($configuration, $plugin_id, $plugin_definition); - $this->migration = $migration; - $this->migrationPlugin = $migration_plugin; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration = NULL) { - // Configure the migration process plugin to look up migrated IDs from - // a d6 file migration. - $migration_plugin_configuration = $configuration + [ - 'migration' => 'd6_file', - 'source' => ['fid'], - ]; - - return new static( - $configuration, - $plugin_id, - $plugin_definition, - $migration, - $container->get('plugin.manager.migrate.process')->createInstance('migration', $migration_plugin_configuration, $migration) - ); - } - - /** - * {@inheritdoc} - */ - public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) { - $options = unserialize($value['data']); - - // Try to look up the ID of the migrated file. If one cannot be found, it - // means the file referenced by the current field item did not migrate for - // some reason -- file migration is notoriously brittle -- and we do NOT - // want to send invalid file references into the field system (it causes - // fatals), so return an empty item instead. - if ($fid = $this->migrationPlugin->transform($value['fid'], $migrate_executable, $row, $destination_property)) { - return [ - 'target_id' => $fid, - 'display' => $value['list'], - 'description' => isset($options['description']) ? $options['description'] : '', - 'alt' => isset($options['alt']) ? $options['alt'] : '', - 'title' => isset($options['title']) ? $options['title'] : '', - ]; - } - else { - return []; - } - } - -} +class CckFile extends FieldFile {} diff -u b/core/modules/link/src/Plugin/migrate/cckfield/LinkField.php b/core/modules/link/src/Plugin/migrate/cckfield/LinkField.php --- b/core/modules/link/src/Plugin/migrate/cckfield/LinkField.php +++ b/core/modules/link/src/Plugin/migrate/cckfield/LinkField.php @@ -2,6 +2,10 @@ namespace Drupal\link\Plugin\migrate\cckfield; +@trigger_error('LinkField is deprecated in Drupal 8.3.x and will be +be removed before Drupal 9.0.x. Use \Drupal\link\Plugin\migrate\field\LinkField +instead.', E_USER_DEPRECATED); + use Drupal\migrate\Plugin\MigrationInterface; use Drupal\migrate_drupal\Plugin\migrate\cckfield\CckFieldPluginBase; diff -u b/core/modules/link/src/Plugin/migrate/cckfield/d7/LinkField.php b/core/modules/link/src/Plugin/migrate/cckfield/d7/LinkField.php --- b/core/modules/link/src/Plugin/migrate/cckfield/d7/LinkField.php +++ b/core/modules/link/src/Plugin/migrate/cckfield/d7/LinkField.php @@ -2,6 +2,10 @@ namespace Drupal\link\Plugin\migrate\cckfield\d7; +@trigger_error('LinkField is deprecated in Drupal 8.3.x and will be +be removed before Drupal 9.0.x. Use \Drupal\link\Plugin\migrate\field\d7\LinkField +instead.', E_USER_DEPRECATED); + use Drupal\link\Plugin\migrate\cckfield\LinkField as D6LinkField; use Drupal\migrate\Plugin\MigrationInterface; reverted: --- b/core/modules/text/tests/src/Unit/Migrate/TextCckTest.php +++ a/core/modules/text/tests/src/Unit/Migrate/TextFieldTest.php @@ -12,7 +12,7 @@ * @coversDefaultClass \Drupal\text\Plugin\migrate\cckfield\TextField * @group text */ +class TextFieldTest extends UnitTestCase { -class TextCckTest extends UnitTestCase { /** * @var \Drupal\migrate_drupal\Plugin\MigrateCckFieldInterface @@ -147,7 +147,12 @@ ['list_string', 'optionwidgets_buttons'], ['list_string', 'optionwidgets_select'], ['boolean', 'optionwidgets_onoff'], + ['text_long', 'text_textarea', [ + 'text_processing' => TRUE, + ]], + ['string_long', 'text_textarea', [ + 'text_processing' => FALSE, + ]], - ['text_long', 'text_textarea'], [NULL, 'undefined'], ]; } @@ -157,7 +162,8 @@ * @dataProvider getFieldTypeProvider */ public function testGetFieldType($expected_type, $widget_type, array $settings = []) { + $row = new Row(); + $row->setSourceProperty('widget_type', $widget_type); - $row = new Row(['widget_type' => $widget_type], ['widget_type' => []]); $row->setSourceProperty('global_settings', $settings); $this->assertSame($expected_type, $this->plugin->getFieldType($row)); } diff -u b/core/modules/text/tests/src/Unit/Migrate/TextFieldTest.php b/core/modules/text/tests/src/Unit/Plugin/migrate/cckfield/TextCckTest.php --- b/core/modules/text/tests/src/Unit/Migrate/TextFieldTest.php +++ b/core/modules/text/tests/src/Unit/Plugin/migrate/cckfield/TextCckTest.php @@ -1,21 +1,21 @@ prophesize(MigrationInterface::class); - // The plugin's processFieldValues() method will call + // The plugin's processCckFieldValues() method will call // setProcessOfProperty() and return nothing. So, in order to examine the // process pipeline created by the plugin, we need to ensure that // getProcess() always returns the last input to setProcessOfProperty(). @@ -45,13 +45,13 @@ } /** - * @covers ::processFieldValues + * @covers ::processCckFieldValues */ public function testProcessFilteredTextFieldValues() { $field_info = [ 'widget_type' => 'text_textfield', ]; - $this->plugin->processFieldValues($this->migration, 'body', $field_info); + $this->plugin->processCckFieldValues($this->migration, 'body', $field_info); $process = $this->migration->getProcess(); $this->assertSame('iterator', $process['plugin']); @@ -68,7 +68,7 @@ } /** - * @covers ::processFieldValues + * @covers ::processCckFieldValues */ public function testProcessBooleanTextImplicitValues() { $info = [ @@ -77,7 +77,7 @@ 'allowed_values' => "foo\nbar", ] ]; - $this->plugin->processFieldValues($this->migration, 'field', $info); + $this->plugin->processCckFieldValues($this->migration, 'field', $info); $expected = [ 'value' => [ @@ -93,7 +93,7 @@ } /** - * @covers ::processFieldValues + * @covers ::processCckFieldValues */ public function testProcessBooleanTextExplicitValues() { $info = [ @@ -102,7 +102,7 @@ 'allowed_values' => "foo|Foo\nbaz|Baz", ] ]; - $this->plugin->processFieldValues($this->migration, 'field', $info); + $this->plugin->processCckFieldValues($this->migration, 'field', $info); $expected = [ 'value' => [ @@ -162,8 +162,7 @@ * @dataProvider getFieldTypeProvider */ public function testGetFieldType($expected_type, $widget_type, array $settings = []) { - $row = new Row(); - $row->setSourceProperty('widget_type', $widget_type); + $row = new Row(['widget_type' => $widget_type], ['widget_type' => []]); $row->setSourceProperty('global_settings', $settings); $this->assertSame($expected_type, $this->plugin->getFieldType($row)); } only in patch2: unchanged: --- a/core/modules/file/src/Plugin/migrate/cckfield/d6/FileField.php +++ b/core/modules/file/src/Plugin/migrate/cckfield/d6/FileField.php @@ -2,6 +2,10 @@ namespace Drupal\file\Plugin\migrate\cckfield\d6; +@trigger_error('FileField is deprecated in Drupal 8.3.x and will be +be removed before Drupal 9.0.x. Use \Drupal\\Plugin\migrate\field\FileField +instead.', E_USER_DEPRECATED); + use Drupal\migrate\Plugin\MigrationInterface; use Drupal\migrate\Row; use Drupal\migrate_drupal\Plugin\migrate\cckfield\CckFieldPluginBase; only in patch2: unchanged: --- a/core/modules/file/src/Plugin/migrate/cckfield/d7/FileField.php +++ b/core/modules/file/src/Plugin/migrate/cckfield/d7/FileField.php @@ -2,6 +2,10 @@ namespace Drupal\file\Plugin\migrate\cckfield\d7; +@trigger_error('FileField is deprecated in Drupal 8.3.x and will be +be removed before Drupal 9.0.x. Use \Drupal\file\Plugin\migrate\field\d7\FileField +instead.', E_USER_DEPRECATED); + use Drupal\migrate\Plugin\MigrationInterface; use Drupal\migrate\Row; use Drupal\migrate_drupal\Plugin\migrate\cckfield\CckFieldPluginBase; only in patch2: unchanged: --- a/core/modules/file/src/Plugin/migrate/cckfield/d7/ImageField.php +++ b/core/modules/file/src/Plugin/migrate/cckfield/d7/ImageField.php @@ -2,6 +2,10 @@ namespace Drupal\file\Plugin\migrate\cckfield\d7; +@trigger_error('ImageField is deprecated in Drupal 8.3.x and will be +be removed before Drupal 9.0.x. Use \Drupal\file\Plugin\migrate\field\d7\ImageField +instead.', E_USER_DEPRECATED); + use Drupal\migrate\Plugin\MigrationInterface; use Drupal\migrate_drupal\Plugin\migrate\cckfield\CckFieldPluginBase; only in patch2: unchanged: --- /dev/null +++ b/core/modules/file/src/Plugin/migrate/process/d6/FieldFile.php @@ -0,0 +1,92 @@ +migration = $migration; + $this->migrationPlugin = $migration_plugin; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration = NULL) { + // Configure the migration process plugin to look up migrated IDs from + // a d6 file migration. + $migration_plugin_configuration = $configuration + [ + 'migration' => 'd6_file', + 'source' => ['fid'], + ]; + + return new static( + $configuration, + $plugin_id, + $plugin_definition, + $migration, + $container->get('plugin.manager.migrate.process')->createInstance('migration', $migration_plugin_configuration, $migration) + ); + } + + /** + * {@inheritdoc} + */ + public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) { + $options = unserialize($value['data']); + + // Try to look up the ID of the migrated file. If one cannot be found, it + // means the file referenced by the current field item did not migrate for + // some reason -- file migration is notoriously brittle -- and we do NOT + // want to send invalid file references into the field system (it causes + // fatals), so return an empty item instead. + if ($fid = $this->migrationPlugin->transform($value['fid'], $migrate_executable, $row, $destination_property)) { + return [ + 'target_id' => $fid, + 'display' => $value['list'], + 'description' => isset($options['description']) ? $options['description'] : '', + 'alt' => isset($options['alt']) ? $options['alt'] : '', + 'title' => isset($options['title']) ? $options['title'] : '', + ]; + } + else { + return []; + } + } + +} only in patch2: unchanged: --- /dev/null +++ b/core/modules/file/tests/src/Kernel/Migrate/process/d6/FieldFileTest.php @@ -0,0 +1,32 @@ +container, [], 'custom_migration', []); + $cck_file_migration = FieldFile::create($this->container, ['migration' => 'custom_file'], 'custom_file', [], $migration); + $migration_plugin = $this->readAttribute($cck_file_migration, 'migrationPlugin'); + $config = $this->readAttribute($migration_plugin, 'configuration'); + + $this->assertEquals($config['migration'], 'custom_file'); + } + +} only in patch2: unchanged: --- /dev/null +++ b/core/modules/file/tests/src/Unit/Plugin/migrate/cckfield/d6/FileCckTest.php @@ -0,0 +1,81 @@ +plugin = new FileField([], 'file', []); + + $migration = $this->prophesize(MigrationInterface::class); + + // The plugin's processFieldValues() method will call + // mergeProcessOfProperty() and return nothing. So, in order to examine the + // process pipeline created by the plugin, we need to ensure that + // getProcess() always returns the last input to mergeProcessOfProperty(). + $migration->mergeProcessOfProperty(Argument::type('string'), Argument::type('array')) + ->will(function($arguments) use ($migration) { + $migration->getProcess()->willReturn($arguments[1]); + }); + $this->migration = $migration->reveal(); + } + + /** + * @covers ::processCckFieldValues + */ + public function testProcessCckFieldValues() { + $this->plugin->processCckFieldValues($this->migration, 'somefieldname', []); + + $expected = [ + 'plugin' => 'd6_cck_file', + 'source' => 'somefieldname', + ]; + $this->assertSame($expected, $this->migration->getProcess()); + } + + /* + * Data provider for testGetFieldType(). + */ + public function getFieldTypeProvider() { + return [ + ['image', 'imagefield_widget'], + ['file', 'filefield_widget'], + ['file', 'x_widget'] + ]; + } + + /** + * @covers ::getFieldType + * @dataProvider getFieldTypeProvider + */ + public function testGetFieldType($expected_type, $widget_type, array $settings = []) { + $row = new Row(); + $row->setSourceProperty('widget_type', $widget_type); + $row->setSourceProperty('global_settings', $settings); + $this->assertSame($expected_type, $this->plugin->getFieldType($row)); + } + +} only in patch2: unchanged: --- /dev/null +++ b/core/modules/file/tests/src/Unit/Plugin/migrate/cckfield/d7/FileCckTest.php @@ -0,0 +1,86 @@ +plugin = new FileField([], 'file', []); + + $migration = $this->prophesize(MigrationInterface::class); + + // The plugin's processFieldValues() method will call + // mergeProcessOfProperty() and return nothing. So, in order to examine the + // process pipeline created by the plugin, we need to ensure that + // getProcess() always returns the last input to mergeProcessOfProperty(). + $migration->mergeProcessOfProperty(Argument::type('string'), Argument::type('array')) + ->will(function($arguments) use ($migration) { + $migration->getProcess()->willReturn($arguments[1]); + }); + $this->migration = $migration->reveal(); + } + + /** + * @covers ::processCckFieldValues + */ + public function testProcessCckFieldValues() { + $this->plugin->processCckFieldValues($this->migration, 'somefieldname', []); + + $expected = [ + 'plugin' => 'iterator', + 'source' => 'somefieldname', + 'process' => [ + 'target_id' => 'fid', + 'display' => 'display', + 'description' => 'description', + ], + ]; + $this->assertSame($expected, $this->migration->getProcess()); + } + + /* + * Data provider for testGetFieldType(). + */ + public function getFieldTypeProvider() { + return [ + ['image', 'imagefield_widget'], + ['file', 'filefield_widget'], + ['file', 'x_widget'] + ]; + } + + /** + * @covers ::getFieldType + * @dataProvider getFieldTypeProvider + */ + public function testGetFieldType($expected_type, $widget_type, array $settings = []) { + $row = new Row(); + $row->setSourceProperty('widget_type', $widget_type); + $row->setSourceProperty('global_settings', $settings); + $this->assertSame($expected_type, $this->plugin->getFieldType($row)); + } + +} only in patch2: unchanged: --- /dev/null +++ b/core/modules/file/tests/src/Unit/Plugin/migrate/cckfield/d7/ImageCckTest.php @@ -0,0 +1,65 @@ +plugin = new ImageField([], 'image', []); + + $migration = $this->prophesize(MigrationInterface::class); + + // The plugin's processFieldValues() method will call + // mergeProcessOfProperty() and return nothing. So, in order to examine the + // process pipeline created by the plugin, we need to ensure that + // getProcess() always returns the last input to mergeProcessOfProperty(). + $migration->mergeProcessOfProperty(Argument::type('string'), Argument::type('array')) + ->will(function($arguments) use ($migration) { + $migration->getProcess()->willReturn($arguments[1]); + }); + $this->migration = $migration->reveal(); + } + + /** + * @covers ::processCckFieldValues + */ + public function testProcessCckFieldValues() { + $this->plugin->processCckFieldValues($this->migration, 'somefieldname', []); + + $expected = [ + 'plugin' => 'iterator', + 'source' => 'somefieldname', + 'process' => [ + 'target_id' => 'fid', + 'alt' => 'alt', + 'title' => 'title', + 'width' => 'width', + 'height' => 'height', + ], + ]; + $this->assertSame($expected, $this->migration->getProcess()); + } + +} only in patch2: unchanged: --- /dev/null +++ b/core/modules/file/tests/src/Unit/Plugin/migrate/field/d6/FileFieldTest.php @@ -0,0 +1,81 @@ +plugin = new FileField([], 'file', []); + + $migration = $this->prophesize(MigrationInterface::class); + + // The plugin's processFieldValues() method will call + // mergeProcessOfProperty() and return nothing. So, in order to examine the + // process pipeline created by the plugin, we need to ensure that + // getProcess() always returns the last input to mergeProcessOfProperty(). + $migration->mergeProcessOfProperty(Argument::type('string'), Argument::type('array')) + ->will(function($arguments) use ($migration) { + $migration->getProcess()->willReturn($arguments[1]); + }); + $this->migration = $migration->reveal(); + } + + /** + * @covers ::processFieldValues + */ + public function testProcessFieldValues() { + $this->plugin->processFieldValues($this->migration, 'somefieldname', []); + + $expected = [ + 'plugin' => 'd6_field_file', + 'source' => 'somefieldname', + ]; + $this->assertSame($expected, $this->migration->getProcess()); + } + + /* + * Data provider for testGetFieldType(). + */ + public function getFieldTypeProvider() { + return [ + ['image', 'imagefield_widget'], + ['file', 'filefield_widget'], + ['file', 'x_widget'] + ]; + } + + /** + * @covers ::getFieldType + * @dataProvider getFieldTypeProvider + */ + public function testGetFieldType($expected_type, $widget_type, array $settings = []) { + $row = new Row(); + $row->setSourceProperty('widget_type', $widget_type); + $row->setSourceProperty('global_settings', $settings); + $this->assertSame($expected_type, $this->plugin->getFieldType($row)); + } + +} only in patch2: unchanged: --- /dev/null +++ b/core/modules/file/tests/src/Unit/Plugin/migrate/field/d7/FileFieldTest.php @@ -0,0 +1,86 @@ +plugin = new FileField([], 'file', []); + + $migration = $this->prophesize(MigrationInterface::class); + + // The plugin's processFieldValues() method will call + // mergeProcessOfProperty() and return nothing. So, in order to examine the + // process pipeline created by the plugin, we need to ensure that + // getProcess() always returns the last input to mergeProcessOfProperty(). + $migration->mergeProcessOfProperty(Argument::type('string'), Argument::type('array')) + ->will(function($arguments) use ($migration) { + $migration->getProcess()->willReturn($arguments[1]); + }); + $this->migration = $migration->reveal(); + } + + /** + * @covers ::processFieldValues + */ + public function testProcessFieldValues() { + $this->plugin->processFieldValues($this->migration, 'somefieldname', []); + + $expected = [ + 'plugin' => 'iterator', + 'source' => 'somefieldname', + 'process' => [ + 'target_id' => 'fid', + 'display' => 'display', + 'description' => 'description', + ], + ]; + $this->assertSame($expected, $this->migration->getProcess()); + } + + /* + * Data provider for testGetFieldType(). + */ + public function getFieldTypeProvider() { + return [ + ['image', 'imagefield_widget'], + ['file', 'filefield_widget'], + ['file', 'x_widget'] + ]; + } + + /** + * @covers ::getFieldType + * @dataProvider getFieldTypeProvider + */ + public function testGetFieldType($expected_type, $widget_type, array $settings = []) { + $row = new Row(); + $row->setSourceProperty('widget_type', $widget_type); + $row->setSourceProperty('global_settings', $settings); + $this->assertSame($expected_type, $this->plugin->getFieldType($row)); + } + +} only in patch2: unchanged: --- /dev/null +++ b/core/modules/file/tests/src/Unit/Plugin/migrate/field/d7/ImageFieldTest.php @@ -0,0 +1,65 @@ +plugin = new ImageField([], 'image', []); + + $migration = $this->prophesize(MigrationInterface::class); + + // The plugin's processFieldValues() method will call + // mergeProcessOfProperty() and return nothing. So, in order to examine the + // process pipeline created by the plugin, we need to ensure that + // getProcess() always returns the last input to mergeProcessOfProperty(). + $migration->mergeProcessOfProperty(Argument::type('string'), Argument::type('array')) + ->will(function($arguments) use ($migration) { + $migration->getProcess()->willReturn($arguments[1]); + }); + $this->migration = $migration->reveal(); + } + + /** + * @covers ::processFieldValues + */ + public function testProcessFieldValues() { + $this->plugin->processFieldValues($this->migration, 'somefieldname', []); + + $expected = [ + 'plugin' => 'iterator', + 'source' => 'somefieldname', + 'process' => [ + 'target_id' => 'fid', + 'alt' => 'alt', + 'title' => 'title', + 'width' => 'width', + 'height' => 'height', + ], + ]; + $this->assertSame($expected, $this->migration->getProcess()); + } + +} only in patch2: unchanged: --- /dev/null +++ b/core/modules/link/tests/src/Unit/Plugin/migrate/cckfield/LinkCckTest.php @@ -0,0 +1,59 @@ +plugin = new LinkField([], 'link', []); + + $migration = $this->prophesize(MigrationInterface::class); + + // The plugin's processFieldValues() method will call + // mergeProcessOfProperty() and return nothing. So, in order to examine the + // process pipeline created by the plugin, we need to ensure that + // getProcess() always returns the last input to mergeProcessOfProperty(). + $migration->mergeProcessOfProperty(Argument::type('string'), Argument::type('array')) + ->will(function($arguments) use ($migration) { + $migration->getProcess()->willReturn($arguments[1]); + }); + + $this->migration = $migration->reveal(); + } + + /** + * @covers ::processCckFieldValues + */ + public function testProcessCckFieldValues() { + $this->plugin->processCckFieldValues($this->migration, 'somefieldname', []); + + $expected = [ + 'plugin' => 'd6_cck_link', + 'source' => 'somefieldname', + ]; + $this->assertSame($expected, $this->migration->getProcess()); + } + +} only in patch2: unchanged: --- /dev/null +++ b/core/modules/link/tests/src/Unit/Plugin/migrate/cckfield/d7/LinkCckFieldTest.php @@ -0,0 +1,65 @@ +plugin = new LinkField([], 'link', []); + + $migration = $this->prophesize(MigrationInterface::class); + + // The plugin's processFieldValues() method will call + // mergeProcessOfProperty() and return nothing. So, in order to examine the + // process pipeline created by the plugin, we need to ensure that + // getProcess() always returns the last input to mergeProcessOfProperty(). + $migration->mergeProcessOfProperty(Argument::type('string'), Argument::type('array')) + ->will(function($arguments) use ($migration) { + $migration->getProcess()->willReturn($arguments[1]); + }); + + $this->migration = $migration->reveal(); + } + + /** + * @covers ::processFieldInstance + */ + public function testProcessFieldInstance() { + $this->plugin->processFieldInstance($this->migration); + + $expected = [ + 'plugin' => 'static_map', + 'source' => 'instance_settings/title', + 'bypass' => TRUE, + 'map' => [ + 'disabled' => DRUPAL_DISABLED, + 'optional' => DRUPAL_OPTIONAL, + 'required' => DRUPAL_REQUIRED, + ], + ]; + $this->assertSame($expected, $this->migration->getProcess()); + } + +} only in patch2: unchanged: --- /dev/null +++ b/core/modules/link/tests/src/Unit/Plugin/migrate/field/d6/LinkFieldTest.php @@ -0,0 +1,59 @@ +plugin = new LinkField([], 'link', []); + + $migration = $this->prophesize(MigrationInterface::class); + + // The plugin's processFieldValues() method will call + // mergeProcessOfProperty() and return nothing. So, in order to examine the + // process pipeline created by the plugin, we need to ensure that + // getProcess() always returns the last input to mergeProcessOfProperty(). + $migration->mergeProcessOfProperty(Argument::type('string'), Argument::type('array')) + ->will(function($arguments) use ($migration) { + $migration->getProcess()->willReturn($arguments[1]); + }); + + $this->migration = $migration->reveal(); + } + + /** + * @covers ::processFieldValues + */ + public function testProcessFieldValues() { + $this->plugin->processFieldValues($this->migration, 'somefieldname', []); + + $expected = [ + 'plugin' => 'd6_field_link', + 'source' => 'somefieldname', + ]; + $this->assertSame($expected, $this->migration->getProcess()); + } + +} only in patch2: unchanged: --- /dev/null +++ b/core/modules/link/tests/src/Unit/Plugin/migrate/field/d7/LinkFieldTest.php @@ -0,0 +1,65 @@ +plugin = new LinkField([], 'link', []); + + $migration = $this->prophesize(MigrationInterface::class); + + // The plugin's processFieldValues() method will call + // mergeProcessOfProperty() and return nothing. So, in order to examine the + // process pipeline created by the plugin, we need to ensure that + // getProcess() always returns the last input to mergeProcessOfProperty(). + $migration->mergeProcessOfProperty(Argument::type('string'), Argument::type('array')) + ->will(function($arguments) use ($migration) { + $migration->getProcess()->willReturn($arguments[1]); + }); + + $this->migration = $migration->reveal(); + } + + /** + * @covers ::processFieldInstance + */ + public function testProcessFieldInstance() { + $this->plugin->processFieldInstance($this->migration); + + $expected = [ + 'plugin' => 'static_map', + 'source' => 'instance_settings/title', + 'bypass' => TRUE, + 'map' => [ + 'disabled' => DRUPAL_DISABLED, + 'optional' => DRUPAL_OPTIONAL, + 'required' => DRUPAL_REQUIRED, + ], + ]; + $this->assertSame($expected, $this->migration->getProcess()); + } + +} only in patch2: unchanged: --- a/core/modules/taxonomy/src/Plugin/migrate/cckfield/TaxonomyTermReference.php +++ b/core/modules/taxonomy/src/Plugin/migrate/cckfield/TaxonomyTermReference.php @@ -2,6 +2,10 @@ namespace Drupal\taxonomy\Plugin\migrate\cckfield; +@trigger_error('TaxonomyTermReference is deprecated in Drupal 8.3.x and will be +be removed before Drupal 9.0.x. Use \Drupal\text\Plugin\migrate\field\TaxonomyTermReference +instead.', E_USER_DEPRECATED); + use Drupal\migrate\Plugin\MigrationInterface; use Drupal\migrate_drupal\Plugin\migrate\cckfield\CckFieldPluginBase; only in patch2: unchanged: --- a/core/modules/text/src/Plugin/migrate/cckfield/TextField.php +++ b/core/modules/text/src/Plugin/migrate/cckfield/TextField.php @@ -2,6 +2,10 @@ namespace Drupal\text\Plugin\migrate\cckfield; +@trigger_error('TextField is deprecated in Drupal 8.3.x and will be +be removed before Drupal 9.0.x. Use \Drupal\text\Plugin\migrate\field\TextField +instead.', E_USER_DEPRECATED); + use Drupal\migrate\Plugin\MigrationInterface; use Drupal\migrate\Row; use Drupal\migrate_drupal\Plugin\migrate\cckfield\CckFieldPluginBase; only in patch2: unchanged: --- /dev/null +++ b/core/modules/text/tests/src/Unit/Plugin/migrate/field/TextFieldTest.php @@ -0,0 +1,171 @@ +plugin = new TextField([], 'text', []); + + $migration = $this->prophesize(MigrationInterface::class); + + // The plugin's processFieldValues() method will call + // setProcessOfProperty() and return nothing. So, in order to examine the + // process pipeline created by the plugin, we need to ensure that + // getProcess() always returns the last input to setProcessOfProperty(). + $migration->setProcessOfProperty(Argument::type('string'), Argument::type('array')) + ->will(function($arguments) use ($migration) { + $migration->getProcess()->willReturn($arguments[1]); + }); + + $this->migration = $migration->reveal(); + } + + /** + * @covers ::processFieldValues + */ + public function testProcessFilteredTextFieldValues() { + $field_info = [ + 'widget_type' => 'text_textfield', + ]; + $this->plugin->processFieldValues($this->migration, 'body', $field_info); + + $process = $this->migration->getProcess(); + $this->assertSame('iterator', $process['plugin']); + $this->assertSame('body', $process['source']); + $this->assertSame('value', $process['process']['value']); + + // Ensure that filter format IDs will be looked up in the filter format + // migrations. + $lookup = $process['process']['format'][2]; + $this->assertSame('migration', $lookup['plugin']); + $this->assertContains('d6_filter_format', $lookup['migration']); + $this->assertContains('d7_filter_format', $lookup['migration']); + $this->assertSame('format', $lookup['source']); + } + + /** + * @covers ::processFieldValues + */ + public function testProcessBooleanTextImplicitValues() { + $info = [ + 'widget_type' => 'optionwidgets_onoff', + 'global_settings' => [ + 'allowed_values' => "foo\nbar", + ] + ]; + $this->plugin->processFieldValues($this->migration, 'field', $info); + + $expected = [ + 'value' => [ + 'plugin' => 'static_map', + 'source' => 'value', + 'default_value' => 0, + 'map' => [ + 'bar' => 1, + ], + ], + ]; + $this->assertSame($expected, $this->migration->getProcess()['process']); + } + + /** + * @covers ::processFieldValues + */ + public function testProcessBooleanTextExplicitValues() { + $info = [ + 'widget_type' => 'optionwidgets_onoff', + 'global_settings' => [ + 'allowed_values' => "foo|Foo\nbaz|Baz", + ] + ]; + $this->plugin->processFieldValues($this->migration, 'field', $info); + + $expected = [ + 'value' => [ + 'plugin' => 'static_map', + 'source' => 'value', + 'default_value' => 0, + 'map' => [ + 'baz' => 1, + ], + ], + ]; + $this->assertSame($expected, $this->migration->getProcess()['process']); + } + + /** + * Data provider for testGetFieldType(). + */ + public function getFieldTypeProvider() { + return [ + ['string_long', 'text_textfield', [ + 'text_processing' => FALSE, + ]], + ['string', 'text_textfield', [ + 'text_processing' => FALSE, + 'max_length' => 128, + ]], + ['string_long', 'text_textfield', [ + 'text_processing' => FALSE, + 'max_length' => 4096, + ]], + ['text_long', 'text_textfield', [ + 'text_processing' => TRUE, + ]], + ['text', 'text_textfield', [ + 'text_processing' => TRUE, + 'max_length' => 128, + ]], + ['text_long', 'text_textfield', [ + 'text_processing' => TRUE, + 'max_length' => 4096, + ]], + ['list_string', 'optionwidgets_buttons'], + ['list_string', 'optionwidgets_select'], + ['boolean', 'optionwidgets_onoff'], + ['text_long', 'text_textarea', [ + 'text_processing' => TRUE, + ]], + ['string_long', 'text_textarea', [ + 'text_processing' => FALSE, + ]], + [NULL, 'undefined'], + ]; + } + + /** + * @covers ::getFieldType + * @dataProvider getFieldTypeProvider + */ + public function testGetFieldType($expected_type, $widget_type, array $settings = []) { + $row = new Row(); + $row->setSourceProperty('widget_type', $widget_type); + $row->setSourceProperty('global_settings', $settings); + $this->assertSame($expected_type, $this->plugin->getFieldType($row)); + } + +}