diff --git a/core/modules/migrate/src/Plugin/migrate/process/MigrationLookup.php b/core/modules/migrate/src/Plugin/migrate/process/MigrationLookup.php index e8a075606e68194d8a65347b84bfb61f1f262b32..047871b73481d2bce14835562d060b9afbb673fc 100644 --- a/core/modules/migrate/src/Plugin/migrate/process/MigrationLookup.php +++ b/core/modules/migrate/src/Plugin/migrate/process/MigrationLookup.php @@ -3,6 +3,7 @@ namespace Drupal\migrate\Plugin\migrate\process; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; +use Drupal\migrate\MigrateException; use Drupal\migrate\MigrateSkipProcessException; use Drupal\migrate\Plugin\MigratePluginManagerInterface; use Drupal\migrate\Plugin\MigrationPluginManagerInterface; @@ -155,10 +156,17 @@ public function transform($value, MigrateExecutableInterface $migrate_executable $migration_ids = [$migration_ids]; } $self = FALSE; - /** @var \Drupal\migrate\Plugin\MigrationInterface[] $migrations */ $destination_ids = NULL; $source_id_values = []; + + /** @var \Drupal\migrate\Plugin\MigrationInterface[] $migrations */ $migrations = $this->migrationPluginManager->createInstances($migration_ids); + + // If no migrations are loaded it means either the migration is unavailable + // (perhaps in a disabled module) or doesn't exist (probably mis-typed). + if (empty($migrations)) { + throw new MigrateException(sprintf("The '%s' plugin failed because at least one of the migrations with the following ID(s) does not exist: %s.", $this->getPluginId(), implode(', ', $migration_ids))); + } foreach ($migrations as $migration_id => $migration) { if ($migration_id == $this->migration->id()) { $self = TRUE; diff --git a/core/modules/migrate/tests/src/Unit/process/MigrationLookupTest.php b/core/modules/migrate/tests/src/Unit/process/MigrationLookupTest.php index ffa28170ee5311c55ee6f6846f8ecf45572e5b69..e5e16e79dca766dfc1f5e460728fa6ee4aede501 100644 --- a/core/modules/migrate/tests/src/Unit/process/MigrationLookupTest.php +++ b/core/modules/migrate/tests/src/Unit/process/MigrationLookupTest.php @@ -3,6 +3,7 @@ namespace Drupal\Tests\migrate\Unit\process; use Drupal\Core\Entity\EntityStorageInterface; +use Drupal\migrate\MigrateException; use Drupal\migrate\MigrateSkipProcessException; use Drupal\migrate\Plugin\MigrationInterface; use Drupal\migrate\Plugin\migrate\process\MigrationLookup; @@ -298,4 +299,49 @@ public function testMultipleSourceIds() { $this->assertEquals(2, $result); } + /** + * Tests that invalid migrations trigger the exception in transform(). + * + * @covers ::transform + * + * @dataProvider transformWithInvalidMigrationsDataProvider + * + * @param string|string[] $migration_ids + * The ID(s) of migration(s) including at least one invalid ID. + * @param string $invalid_migrations + * The list of migration IDs containing at least one invalid ID. + */ + public function testTransformWithInvalidMigrations($migration_ids, $invalid_migrations) { + $migration_plugin = $this->prophesize(MigrationInterface::class); + $process_plugin_manager = $this->prophesize(MigratePluginManager::class); + $migration_plugin_manager = $this->prophesize(MigrationPluginManagerInterface::class); + $migration_plugin_manager->createInstances(Argument::any())->willReturn([]); + + $migration = new MigrationLookup(['migration' => $migration_ids], 'migration_lookup', [], $migration_plugin->reveal(), $migration_plugin_manager->reveal(), $process_plugin_manager->reveal()); + $this->setExpectedException(MigrateException::class, "The 'migration_lookup' plugin failed because at least one of the migrations with the following ID(s) does not exist: $invalid_migrations."); + $migration->transform(1, $this->migrateExecutable, $this->row, ''); + } + + /** + * Provides data for the invalid migrations test. + * + * @return array + */ + public function transformWithInvalidMigrationsDataProvider() { + return [ + 'migration_id_string' => [ + 'migration_ids' => 'invalid_migration', + 'invalid_migrations' => 'invalid_migration', + ], + 'migration_id_array_single' => [ + 'migration_ids' => ['invalid_migration'], + 'invalid_migrations' => 'invalid_migration', + ], + 'migration_id_array_multiple' => [ + 'migration_ids' => ['invalid_migration_1', 'invalid_migration_2'], + 'invalid_migrations' => 'invalid_migration_1, invalid_migration_2', + ], + ]; + } + }