diff --git a/core/modules/migrate/src/Plugin/NoSourcePluginDecorator.php b/core/modules/migrate/src/Plugin/NoSourcePluginDecorator.php index aa2121eee2ecb9d90ad3bb471512af673a08b1e4..98a0c7cbc827a1e6836e1b2c6ea5a6a753590a12 100644 --- a/core/modules/migrate/src/Plugin/NoSourcePluginDecorator.php +++ b/core/modules/migrate/src/Plugin/NoSourcePluginDecorator.php @@ -36,7 +36,7 @@ public function getDefinitions() { /** @var \Drupal\Component\Plugin\PluginManagerInterface $source_plugin_manager */ $source_plugin_manager = \Drupal::service('plugin.manager.migrate.source'); return array_filter($this->decorated->getDefinitions(), function (array $definition) use ($source_plugin_manager) { - return $source_plugin_manager->hasDefinition($definition['source']['plugin']); + return !empty($definition['source']['plugin']) && $source_plugin_manager->hasDefinition($definition['source']['plugin']); }); } diff --git a/core/modules/migrate/tests/src/Unit/Plugin/NoSourcePluginDecoratorTest.php b/core/modules/migrate/tests/src/Unit/Plugin/NoSourcePluginDecoratorTest.php new file mode 100644 index 0000000000000000000000000000000000000000..aa1a50e3351db0f15e1a800d13a5cc8cfcab5791 --- /dev/null +++ b/core/modules/migrate/tests/src/Unit/Plugin/NoSourcePluginDecoratorTest.php @@ -0,0 +1,78 @@ +<?php + +declare(strict_types=1); + +namespace Drupal\Tests\migrate\Unit\Plugin; + +use Drupal\Component\Plugin\Discovery\DiscoveryInterface; +use Drupal\Core\DependencyInjection\ContainerBuilder; +use Drupal\migrate\Plugin\MigrateSourcePluginManager; +use Drupal\migrate\Plugin\NoSourcePluginDecorator; +use Drupal\Tests\UnitTestCase; + +/** + * @coversDefaultClass \Drupal\migrate\Plugin\NoSourcePluginDecorator + * @group migrate + */ +class NoSourcePluginDecoratorTest extends UnitTestCase { + + /** + * @covers ::getDefinitions + * @dataProvider providerGetDefinitions + */ + public function testGetDefinitions(array $definition, bool $source_exists): void { + $source_manager = $this->createMock(MigrateSourcePluginManager::class); + $source_manager->expects($this->any()) + ->method('hasDefinition') + ->willReturn($source_exists); + $container = new ContainerBuilder(); + $container->set('plugin.manager.migrate.source', $source_manager); + \Drupal::setContainer($container); + + $discovery_interface = $this->createMock(DiscoveryInterface::class); + $discovery_interface->expects($this->once()) + ->method('getDefinitions') + ->willReturn([$definition]); + + $decorator = new NoSourcePluginDecorator($discovery_interface); + $results = $decorator->getDefinitions(); + if ($source_exists) { + $this->assertEquals([$definition], $results); + } + else { + $this->assertEquals([], $results); + } + } + + /** + * Provides data for testGetDefinitions(). + */ + public static function providerGetDefinitions(): array { + return [ + 'source exists' => [ + [ + 'source' => ['plugin' => 'valid_plugin'], + 'process' => [], + 'destination' => [], + ], + TRUE, + ], + 'source does not exist' => [ + [ + 'source' => ['plugin' => 'invalid_plugin'], + 'process' => [], + 'destination' => [], + ], + FALSE, + ], + 'source is not defined' => [ + [ + 'process' => [], + 'destination' => [], + ], + FALSE, + ], + ]; + } + +}