migmag-1.0.x-dev/migmag_process/tests/src/Kernel/Plugin/MigMagLookupTest.php
migmag_process/tests/src/Kernel/Plugin/MigMagLookupTest.php
<?php
namespace Drupal\Tests\migmag_process\Kernel\Plugin;
use Drupal\Component\Utility\Variable;
use Drupal\Core\Database\Database;
use Drupal\Core\Extension\ModuleInstallerInterface;
use Drupal\Tests\migrate\Kernel\MigrateTestBase;
use Drupal\migmag_process\Plugin\migrate\process\MigMagLookup;
use Drupal\migrate\MigrateExecutable;
use Drupal\migrate\Plugin\MigrationInterface;
use Drupal\migrate\Plugin\MigrationPluginManagerInterface;
use Drupal\migrate\Plugin\migrate\id_map\Sql;
use Drupal\migrate\Row;
// cspell:ignore destid sourceid
/**
* Tests the MigMagLookup migrate process plugin with real migrations.
*
* @coversDefaultClass \Drupal\migmag_process\Plugin\migrate\process\MigMagLookup
*
* @group migmag_process
*/
class MigMagLookupTest extends MigrateTestBase {
/**
* {@inheritdoc}
*/
protected static $modules = [
'migmag',
'migmag_lookup_test_migrations',
'migmag_process',
'migrate_events_test',
'tecla',
];
/**
* Tests the MigMagLookup migrate process plugin with non-sql migrations.
*
* @param int|string|array $value
* The value to pass to the lookup plugin instance.
* @param string|array|null $expected_transformed_value
* The expected transformed value.
* @param array $plugin_configuration
* The configuration the plugin should be tested with.
* @param array $previous_migrate_map_entries
* An array of migration row source IDs and destination IDs to be saved into
* the ID map before the plugin gets tested.
* @param array $expected_migrate_map_entries
* An array of the expected migration map entries after the plugin's
* transform method was called.
* @param array|null $row_data
* The actual migration row's data.
*
* @dataProvider providerTestPluginWithNonSqlSources
*/
public function testPluginWithNonSqlSources(
int|string|array $value,
string|array|null $expected_transformed_value,
array $plugin_configuration,
array $previous_migrate_map_entries,
array $expected_migrate_map_entries,
?array $row_data = NULL,
) {
$migration = $this->prophesize(MigrationInterface::class);
$executable = $this->prophesize(MigrateExecutable::class);
$row_data = $row_data ?? ['dummy_source_property' => 'dummy_source_data'];
$row = new Row(
$row_data,
array_combine(array_keys($row_data), array_keys($row_data))
);
// Pre-fill migration map if needed.
$this->populateMigrationMaps($previous_migrate_map_entries);
// Check how many messages we have right now.
$messageCountsBefore = $this->getMessageCounts(array_keys($previous_migrate_map_entries));
$plugin = MigMagLookup::create(
$this->container,
$plugin_configuration,
'migmag_lookup',
[],
$migration->reveal()
);
$actual_transformed_value = $plugin->transform($value, $executable->reveal(), $row, 'destination_property');
$this->assertEquals(
$expected_transformed_value,
$actual_transformed_value
);
// Verify that we have at least the same amount of message what we had
// before the value transformation.
$messageCountsAfter = $this->getMessageCounts(array_keys($previous_migrate_map_entries));
foreach ($messageCountsBefore as $migrationId => $count) {
$this->assertGreaterThanOrEqual(
$count,
$messageCountsAfter[$migrationId] ?? 0,
sprintf(
"'%s' migration has '%s' migration message(s) after transform, but it should have at least '%s'.",
$migrationId,
$messageCountsAfter[$migrationId],
$count,
)
);
}
$this->assertMigrationMaps($expected_migrate_map_entries);
}
/**
* Returns the number of the messages saved for the given migrations.
*
* @param string[] $migrationPluginIds
* The ID of the migrations.
*
* @return array
* Number of the messages saved for the migrations, keyed by the migration
* plugin ID.
*/
protected function getMessageCounts(array $migrationPluginIds): array {
$manager = \Drupal::service('plugin.manager.migration');
$messageCounts = [];
foreach ($migrationPluginIds as $migrationPluginId) {
$dummyMigration = $manager->createInstance($migrationPluginId);
$messageCounts[$migrationPluginId] = $dummyMigration->getIdMap()->messageCount();
}
return $messageCounts;
}
/**
* Tests the MigMagLookup migrate process plugin with sql sources.
*
* @param int|string|array $value
* The value to pass to the lookup plugin instance.
* @param string|array $expected_transformed_value
* The expected transformed value.
* @param array $plugin_configuration
* The configuration the plugin should be tested with.
* @param array $previous_migrate_map_entries
* An array of migration row source IDs and destination IDs to be saved into
* the ID map before the plugin gets tested.
* @param array $expected_migrate_map_entries
* An array of the expected migration map entries after the plugin's
* transform method was called.
* @param array|null $row_data
* The actual migration row's data.
*
* @dataProvider providerTestPluginWithSqlSources
*/
public function testPluginWithSqlSources($value, $expected_transformed_value, array $plugin_configuration, array $previous_migrate_map_entries, array $expected_migrate_map_entries, $row_data = NULL) {
$module_installer = $this->container->get('module_installer');
assert($module_installer instanceof ModuleInstallerInterface);
$module_installer->install([
'migrate_drupal',
'node',
'language',
'content_translation',
]);
$this->loadFixture(
implode(DIRECTORY_SEPARATOR, [
DRUPAL_ROOT,
'core',
'modules',
'migrate_drupal',
'tests',
'fixtures',
'drupal7.php',
])
);
$this->startCollectingMessages();
$this->executeMigrations([
'language',
'default_language',
]);
$this->assertEmpty($this->migrateMessages);
$this->testPluginWithNonSqlSources($value, $expected_transformed_value, $plugin_configuration, $previous_migrate_map_entries, $expected_migrate_map_entries, $row_data);
}
/**
* Tests the MigMagLookup migrate process plugin with 'source_ids' config.
*
* @param int|string|array $value
* The value to pass to the lookup plugin instance.
* @param array $row_data
* The actual migration row's data.
* @param array $plugin_configuration
* The configuration the plugin should be tested with.
* @param array $previous_migrate_map_entries
* An array of migration row source IDs and destination IDs to be saved into
* the ID map before the plugin gets tested.
* @param string|array $expected_transformed_value
* The expected transformed value.
* @param array $expected_migrate_map_entries
* An array of the expected migration map entries after the plugin's
* transform method was called.
*
* @dataProvider providerTestPluginWithSourceIds
*/
public function testPluginWithSourceIds($value, array $row_data, array $plugin_configuration, array $previous_migrate_map_entries, $expected_transformed_value, array $expected_migrate_map_entries) {
$this->testPluginWithNonSqlSources($value, $expected_transformed_value, $plugin_configuration, $previous_migrate_map_entries, $expected_migrate_map_entries, $row_data);
}
/**
* Data provider for ::testPluginWithNonSqlSources.
*
* @return array[]
* The test cases.
*/
public static function providerTestPluginWithNonSqlSources() {
return [
'Lookup for already migrated source "2" in the right migration, no stubbing' => [
'value' => 2,
'expected_transformed_value' => '10',
'plugin_configuration' => [
'migration' => [
'migmag_lookup_test_with_source_4',
'migmag_lookup_test_with_source_2',
],
'no_stub' => TRUE,
],
'previous_migrate_map_entries' => [
'migmag_lookup_test_with_source_2' => [
[
'source_ids' => ['id' => 2],
'destination_ids' => '10',
],
],
],
'expected_migrate_map_entries' => [
'migmag_lookup_test_with_source_2' => [
[
'sourceid1' => '2',
'destid1' => '10',
'source_row_status' => '0',
'rollback_action' => '0',
],
],
'migmag_lookup_test_with_source_4' => [],
],
],
'Lookup for already migrated source "4" in the right migration, no stubbing' => [
'value' => 4,
'expected_transformed_value' => '100',
'plugin_configuration' => [
'migration' => [
'migmag_lookup_test_with_source_4',
'migmag_lookup_test_with_source_2',
],
'no_stub' => TRUE,
],
'previous_migrate_map_entries' => [
'migmag_lookup_test_with_source_4' => [
[
'source_ids' => ['id' => 4],
'destination_ids' => '100',
],
],
],
'expected_migrate_map_entries' => [
'migmag_lookup_test_with_source_2' => NULL,
'migmag_lookup_test_with_source_4' => [
[
'sourceid1' => '4',
'destid1' => '100',
'source_row_status' => '0',
'rollback_action' => '0',
],
],
],
],
'Stubbing "2" in the right migration, no lookup' => [
'value' => 2,
'expected_transformed_value' => '10',
'plugin_configuration' => [
'migration' => [
'migmag_lookup_test_with_source_4',
'migmag_lookup_test_with_source_2',
],
'no_stub' => FALSE,
],
'previous_migrate_map_entries' => [],
'expected_migrate_map_entries' => [
'migmag_lookup_test_with_source_2' => [
[
'sourceid1' => '2',
'destid1' => '10',
'source_row_status' => '1',
'rollback_action' => '0',
],
],
'migmag_lookup_test_with_source_4' => [],
],
],
'Stubbing "4" in the right migration, no lookup' => [
'value' => 4,
'expected_transformed_value' => '100',
'plugin_configuration' => [
'migration' => [
'migmag_lookup_test_with_source_4',
'migmag_lookup_test_with_source_2',
],
'no_stub' => FALSE,
],
'previous_migrate_map_entries' => [],
'expected_migrate_map_entries' => [
'migmag_lookup_test_with_source_2' => [],
'migmag_lookup_test_with_source_4' => [
[
'sourceid1' => '4',
'destid1' => '100',
'source_row_status' => '1',
'rollback_action' => '0',
],
],
],
],
'Stubbing "4" in the right migration, with default value for the stub ID' => [
'value' => 4,
'expected_transformed_value' => 'dummy_source_data',
'plugin_configuration' => [
'migration' => [
'migmag_lookup_test_with_source_4',
'migmag_lookup_test_with_source_2',
],
'no_stub' => FALSE,
'stub_default_values' => [
'value' => 'dummy_source_property',
],
],
'previous_migrate_map_entries' => [],
'expected_migrate_map_entries' => [
'migmag_lookup_test_with_source_2' => [],
'migmag_lookup_test_with_source_4' => [
[
'sourceid1' => '4',
'destid1' => 'dummy_source_data',
'source_row_status' => '1',
'rollback_action' => '0',
],
],
],
],
'Looking for not-yet migrated source "2", no stubbing' => [
'value' => 2,
'expected_transformed_value' => NULL,
'plugin_configuration' => [
'migration' => [
'migmag_lookup_test_with_source_4',
'migmag_lookup_test_with_source_2',
],
'no_stub' => TRUE,
],
'previous_migrate_map_entries' => [],
'expected_migrate_map_entries' => [
'migmag_lookup_test_with_source_2' => [],
'migmag_lookup_test_with_source_4' => [],
],
],
'Looking for missing source, without stubbing' => [
'value' => 500,
'expected_transformed_value' => NULL,
'plugin_configuration' => [
'migration' => [
'migmag_lookup_test_with_source_4',
'migmag_lookup_test_with_source_2',
],
'no_stub' => TRUE,
],
'previous_migrate_map_entries' => [],
'expected_migrate_map_entries' => [
'migmag_lookup_test_with_source_2' => [],
'migmag_lookup_test_with_source_4' => [],
],
],
'Looking for missing source with stubbing' => [
'value' => 501,
'expected_transformed_value' => NULL,
'plugin_configuration' => [
'migration' => [
'migmag_lookup_test_with_source_4',
'migmag_lookup_test_with_source_2',
],
'no_stub' => FALSE,
],
'previous_migrate_map_entries' => [
'migmag_lookup_test_with_source_2' => [
['source_ids' => ['id' => 2], 'destination_ids' => 'foo'],
],
'migmag_lookup_test_with_source_4' => [
['source_ids' => ['id' => 4], 'destination_ids' => 'bar'],
],
],
'expected_migrate_map_entries' => [
'migmag_lookup_test_with_source_2' => [
[
'sourceid1' => 2,
'destid1' => 'foo',
'source_row_status' => 0,
'rollback_action' => 0,
],
],
'migmag_lookup_test_with_source_4' => [
[
'sourceid1' => 4,
'destid1' => 'bar',
'source_row_status' => 0,
'rollback_action' => 0,
],
],
],
],
];
}
/**
* Data provider for ::testPluginWithSqlSources.
*
* @return array[]
* The test cases.
*/
public static function providerTestPluginWithSqlSources() {
return [
'Lookup for already migrated node "2" in the right migration, no stubbing' => [
'value' => [10, 10, 'is'],
'expected_transformed_value' => ['8', 10, 'is'],
'plugin_configuration' => [
'migration' => 'd7_node_complete:blog',
'no_stub' => TRUE,
],
'previous_migrate_map_entries' => [
'd7_node_complete:blog' => [
[
'source_ids' => [
'nid' => '10',
'vid' => '10',
'language' => 'is',
],
'destination_ids' => ['8', 10, 'is'],
],
],
],
'expected_migrate_map_entries' => [
'd7_node_complete:blog' => [
[
'sourceid1' => '10',
'sourceid2' => '10',
'sourceid3' => 'is',
'destid1' => '8',
'destid2' => '10',
'destid3' => 'is',
'source_row_status' => '0',
'rollback_action' => '0',
],
],
],
],
'Lookup for already migrated node "6" in the right migration, no stubbing' => [
'value' => 6,
'expected_transformed_value' => ['6', 6, 'en'],
'plugin_configuration' => [
'migration' => [
'd7_node_complete:test_content_type',
'd7_node_complete:forum',
],
'no_stub' => TRUE,
],
'previous_migrate_map_entries' => [
'd7_node_complete:forum' => [
[
'source_ids' => [
'nid' => '6',
'vid' => '6',
'language' => 'en',
],
'destination_ids' => ['6', 6, 'en'],
],
],
],
'expected_migrate_map_entries' => [
'd7_node_complete:test_content_type' => [],
'd7_node_complete:forum' => [
[
'sourceid1' => '6',
'sourceid2' => '6',
'sourceid3' => 'en',
'destid1' => '6',
'destid2' => '6',
'destid3' => 'en',
'source_row_status' => '0',
'rollback_action' => '0',
],
],
],
],
'Stubbing node "5" with partial source IDs, with a base migration ID, no lookup' => [
'value' => [5],
'expected_transformed_value' => ['4', 5, 'en'],
'plugin_configuration' => [
'migration' => 'd7_node_complete',
'no_stub' => FALSE,
],
'previous_migrate_map_entries' => [],
'expected_migrate_map_entries' => [
'd7_node_complete:test_content_type' => [],
'd7_node_complete:article' => [
[
'sourceid1' => '5',
'sourceid2' => '5',
'sourceid3' => 'en',
'destid1' => '4',
'destid2' => '5',
'destid3' => 'en',
'source_row_status' => '1',
'rollback_action' => '0',
],
[
'sourceid1' => '5',
'sourceid2' => '14',
'sourceid3' => 'en',
'destid1' => '4',
'destid2' => '14',
'destid3' => 'en',
'source_row_status' => '1',
'rollback_action' => '0',
],
],
'd7_node_complete:blog' => [],
'd7_node_complete:forum' => [],
'd7_node_complete:et' => [],
],
],
'Stubbing node "3" with partial source IDs in the right migration, no lookup' => [
'value' => 3,
'expected_transformed_value' => ['2', 3, 'is'],
'plugin_configuration' => [
'migration' => 'd7_node_complete:article',
'no_stub' => FALSE,
],
'previous_migrate_map_entries' => [],
'expected_migrate_map_entries' => [
'd7_node_complete:test_content_type' => NULL,
'd7_node_complete:article' => [
[
'sourceid1' => '3',
'sourceid2' => '12',
'sourceid3' => 'is',
'destid1' => '2',
'destid2' => '12',
'destid3' => 'is',
'source_row_status' => '1',
'rollback_action' => '0',
],
[
'sourceid1' => '3',
'sourceid2' => '3',
'sourceid3' => 'is',
'destid1' => '2',
'destid2' => '3',
'destid3' => 'is',
'source_row_status' => '1',
'rollback_action' => '0',
],
],
'd7_node_complete:blog' => NULL,
'd7_node_complete:forum' => NULL,
'd7_node_complete:et' => NULL,
],
],
'Stubbing not-yet migrated node "1" with full IDs' => [
'value' => ['1', '1', 'en'],
'expected_transformed_value' => ['1', '1', 'en'],
'plugin_configuration' => [
'migration' => 'd7_node_complete',
],
'previous_migrate_map_entries' => [],
'expected_migrate_map_entries' => [
'd7_node_complete:test_content_type' => [
[
'sourceid1' => '1',
'sourceid2' => '1',
'sourceid3' => 'en',
'destid1' => '1',
'destid2' => '1',
'destid3' => 'en',
'source_row_status' => '1',
'rollback_action' => '0',
],
],
'd7_node_complete:article' => [],
'd7_node_complete:blog' => [],
'd7_node_complete:forum' => [],
'd7_node_complete:et' => [],
],
],
'Stubbing not-yet migrated node "1" with some default value' => [
'value' => ['1', '1', 'en'],
'expected_transformed_value' => ['1', 1111, 'is'],
'plugin_configuration' => [
'migration' => 'd7_node_complete',
'stub_default_values' => [
'vid' => 'foo',
'langcode' => 'bar',
],
],
'previous_migrate_map_entries' => [],
'expected_migrate_map_entries' => [
'd7_node_complete:test_content_type' => [
[
'sourceid1' => '1',
'sourceid2' => '1',
'sourceid3' => 'en',
'destid1' => '1',
'destid2' => '1111',
'destid3' => 'is',
'source_row_status' => '1',
'rollback_action' => '0',
],
],
'd7_node_complete:article' => [],
'd7_node_complete:blog' => [],
'd7_node_complete:forum' => [],
'd7_node_complete:et' => [],
],
'row_data' => [
'foo' => 1111,
'bar' => 'is',
],
],
'Looking for not-yet migrated node "1" without stubbing' => [
'value' => 1,
'expected_transformed_value' => NULL,
'plugin_configuration' => [
'migration' => 'd7_node_complete',
'no_stub' => TRUE,
],
'previous_migrate_map_entries' => [],
'expected_migrate_map_entries' => [
'd7_node_complete:test_content_type' => [],
'd7_node_complete:article' => [],
'd7_node_complete:blog' => [],
'd7_node_complete:forum' => [],
'd7_node_complete:et' => [],
],
],
'Looking for missing node, without stubbing' => [
'value' => 500,
'expected_transformed_value' => NULL,
'plugin_configuration' => [
'migration' => 'd7_node_complete',
'no_stub' => TRUE,
],
'previous_migrate_map_entries' => [],
'expected_migrate_map_entries' => [
'd7_node_complete:test_content_type' => [],
'd7_node_complete:article' => [],
'd7_node_complete:blog' => [],
'd7_node_complete:forum' => [],
'd7_node_complete:et' => [],
],
],
'Looking for missing node with stubbing' => [
'value' => 500,
'expected_transformed_value' => NULL,
'plugin_configuration' => [
'migration' => 'd7_node_complete',
'no_stub' => FALSE,
],
'previous_migrate_map_entries' => [],
'expected_migrate_map_entries' => [
'd7_node_complete:test_content_type' => [],
'd7_node_complete:article' => [],
'd7_node_complete:blog' => [],
'd7_node_complete:forum' => [],
'd7_node_complete:et' => [],
],
],
'Looking for missing node with stubbing, with stub_id set' => [
'value' => ['222', 546, 'is'],
'expected_transformed_value' => ['546', '546', 'is'],
'plugin_configuration' => [
'migration' => 'd7_node_complete',
'no_stub' => FALSE,
'stub_id' => 'migmag_lookup_test_invalid_node_stubs',
],
'previous_migrate_map_entries' => [],
'expected_migrate_map_entries' => [
'd7_node_complete:test_content_type' => [],
'd7_node_complete:article' => [],
'd7_node_complete:blog' => [],
'd7_node_complete:forum' => [],
'd7_node_complete:et' => [],
'migmag_lookup_test_invalid_node_stubs' => [
[
'sourceid1' => '222',
'sourceid2' => '546',
'sourceid3' => 'is',
'destid1' => '546',
'destid2' => '546',
'destid3' => 'is',
'source_row_status' => '1',
'rollback_action' => '0',
],
],
],
],
'Looking for existing node with stubbing, with fallback_stub_id set' => [
'value' => ['3', 12],
'expected_transformed_value' => ['2', 12, 'is'],
'plugin_configuration' => [
'migration' => 'd7_node_complete',
'no_stub' => FALSE,
'fallback_stub_id' => 'migmag_lookup_test_invalid_node_stubs',
],
'previous_migrate_map_entries' => [],
'expected_migrate_map_entries' => [
'd7_node_complete:test_content_type' => [],
'd7_node_complete:article' => [
[
'sourceid1' => '3',
'sourceid2' => '12',
'sourceid3' => 'is',
'destid1' => '2',
'destid2' => '12',
'destid3' => 'is',
'source_row_status' => '1',
'rollback_action' => '0',
],
],
'd7_node_complete:blog' => [],
'd7_node_complete:forum' => [],
'd7_node_complete:et' => [],
'migmag_lookup_test_invalid_node_stubs' => NULL,
],
],
'Looking for missing node with stubbing, with fallback_stub_id set' => [
'value' => ['222', 546, 'is'],
'expected_transformed_value' => ['546', '546', 'is'],
'plugin_configuration' => [
'migration' => 'd7_node_complete',
'no_stub' => FALSE,
'fallback_stub_id' => 'migmag_lookup_test_invalid_node_stubs',
],
'previous_migrate_map_entries' => [],
'expected_migrate_map_entries' => [
'd7_node_complete:test_content_type' => [],
'd7_node_complete:article' => [],
'd7_node_complete:blog' => [],
'd7_node_complete:forum' => [],
'd7_node_complete:et' => [],
'migmag_lookup_test_invalid_node_stubs' => [
[
'sourceid1' => '222',
'sourceid2' => '546',
'sourceid3' => 'is',
'destid1' => '546',
'destid2' => '546',
'destid3' => 'is',
'source_row_status' => '1',
'rollback_action' => '0',
],
],
],
],
];
}
/**
* Data provider for ::testPluginWithSourceIds.
*
* @return array[]
* The test cases.
*/
public static function providerTestPluginWithSourceIds() {
return [
'Stubbing row 5 with source ids config using base ID, set to 3 3' => [
'value' => 5,
'row_data' => [
'derived_id' => 3,
'derived_subid' => 3,
],
'plugin_configuration' => [
'migration' => [
'migmag_lookup_test_with_source_4',
'migmag_lookup_test_with_source_2',
],
'fallback_stub_id' => 'migmag_lookup_test_derived:s_3_3',
'no_stub' => FALSE,
'source_ids' => [
'migmag_lookup_test_derived' => [
'derived_id',
'derived_subid',
],
],
],
'previous_migrate_map_entries' => [],
'expected_transformed_value' => '100001',
'expected_migrate_map_entries' => [
'migmag_lookup_test_with_source_2' => [],
'migmag_lookup_test_with_source_4' => [],
'migmag_lookup_test_derived:s_1_1' => NULL,
'migmag_lookup_test_derived:s_3_3' => [
[
'sourceid1' => '3',
'sourceid2' => '3',
'destid1' => '100001',
'source_row_status' => '1',
'rollback_action' => '0',
],
],
],
],
'Stubbing row 10 with source ids config using full ID, set to 1 1' => [
'value' => 10,
'row_data' => [
'derived_id' => 1,
'derived_subid' => 1,
],
'plugin_configuration' => [
'migration' => [
'migmag_lookup_test_with_source_2',
'migmag_lookup_test_with_source_4',
],
'fallback_stub_id' => 'migmag_lookup_test_derived:s_1_1',
'no_stub' => FALSE,
'source_ids' => [
'migmag_lookup_test_derived:s_1_1' => [
'derived_id',
'derived_subid',
],
],
],
'previous_migrate_map_entries' => [],
'expected_transformed_value' => '1011',
'expected_migrate_map_entries' => [
'migmag_lookup_test_with_source_2' => [],
'migmag_lookup_test_with_source_4' => [],
'migmag_lookup_test_derived:s_1_1' => [
[
'sourceid1' => '1',
'sourceid2' => '1',
'destid1' => '1011',
'source_row_status' => '1',
'rollback_action' => '0',
],
],
'migmag_lookup_test_derived:s_3_3' => NULL,
],
],
// cspell:disable-next-line
'Stubbing with source ids config set for all migrations (4 is valid in mltws_4)' => [
'value' => ['a string', 'an another string'],
'row_data' => [
'id' => 4,
'derived_id' => 2,
'derived_subid' => 2,
],
'plugin_configuration' => [
'migration' => [
'migmag_lookup_test_with_source_2',
'migmag_lookup_test_with_source_4',
'migmag_lookup_test_derived',
],
'no_stub' => FALSE,
'source_ids' => [
'migmag_lookup_test_derived' => [
'derived_id',
'derived_subid',
],
'migmag_lookup_test_with_source_2' => [
'id',
],
'migmag_lookup_test_with_source_4' => [
'id',
],
],
],
'previous_migrate_map_entries' => [],
'expected_transformed_value' => '100',
'expected_migrate_map_entries' => [
'migmag_lookup_test_with_source_2' => [],
'migmag_lookup_test_with_source_4' => [
[
'sourceid1' => '4',
'destid1' => '100',
'source_row_status' => '1',
'rollback_action' => '0',
],
],
'migmag_lookup_test_derived:s_1_1' => [],
'migmag_lookup_test_derived:s_3_3' => [],
],
],
// cspell:disable-next-line
'Stubbing with source ids config set for all migrations (3 3 is valid in mltd:s_3_3)' => [
'value' => ['a string', 'an another string'],
'row_data' => [
'id' => 3,
'derived_id' => 3,
'derived_subid' => 3,
],
'plugin_configuration' => [
'migration' => [
'migmag_lookup_test_with_source_2',
'migmag_lookup_test_with_source_4',
'migmag_lookup_test_derived',
],
'no_stub' => FALSE,
'source_ids' => [
'migmag_lookup_test_derived' => [
'derived_id',
'derived_subid',
],
'migmag_lookup_test_with_source_2' => [
'id',
],
'migmag_lookup_test_with_source_4' => [
'id',
],
],
],
'previous_migrate_map_entries' => [],
'expected_transformed_value' => '100001',
'expected_migrate_map_entries' => [
'migmag_lookup_test_with_source_2' => [],
'migmag_lookup_test_with_source_4' => [],
'migmag_lookup_test_derived:s_1_1' => [],
'migmag_lookup_test_derived:s_3_3' => [
[
'sourceid1' => '3',
'sourceid2' => '3',
'destid1' => '100001',
'source_row_status' => '1',
'rollback_action' => '0',
],
],
],
],
];
}
/**
* Checks the migration map records.
*
* @param array $expected_migration_map_entries
* The migration map record data to check, keyed by the migration's plugin
* ID.
*/
protected function assertMigrationMaps(array $expected_migration_map_entries) :void {
$migration_plugin_manager = $this->container->get('plugin.manager.migration');
$connection = \Drupal::database();
assert($migration_plugin_manager instanceof MigrationPluginManagerInterface);
foreach ($expected_migration_map_entries as $migration_plugin_id => $expected_entries) {
$migration = $migration_plugin_manager->createInstance($migration_plugin_id);
assert($migration instanceof MigrationInterface);
$id_map = $migration->getIdMap();
assert($id_map instanceof Sql);
// If no lookup was performed, the migration map shouldn't exist.
if ($expected_entries === NULL) {
$this->assertFalse(
$connection->schema()->tableExists($id_map->mapTableName()),
sprintf(
"Migration map table of '%s' shouldn't exist, but it does.",
$migration_plugin_id
)
);
continue;
}
$actual_id_map_records = $connection->select($id_map->mapTableName())
->fields($id_map->mapTableName())
->execute()
->fetchAll(\PDO::FETCH_ASSOC);
$cleaned_actual_id_map_records = array_reduce($actual_id_map_records, function (array $carry, array $record) {
unset($record['source_ids_hash']);
unset($record['hash']);
// We're unable to mock this timestamp.
// See https://drupal.org/i/3198608.
unset($record['last_imported']);
$carry[] = $record;
return $carry;
}, []);
$this->assertEquals(
$expected_entries,
$cleaned_actual_id_map_records,
sprintf(
"Expected migration map of '%s' records aren't match with the actual ones.",
$migration_plugin_id
)
);
}
}
/**
* Pre-fills migration maps, and also migrate messages.
*
* @param array $migrate_map_entries
* The migration map record data to save, keyed by the migration's plugin
* ID.
*/
protected function populateMigrationMaps(array $migrate_map_entries) :void {
$migration_plugin_manager = $this->container->get('plugin.manager.migration');
assert($migration_plugin_manager instanceof MigrationPluginManagerInterface);
// Pre-fill migration map if needed.
foreach ($migrate_map_entries as $migration_plugin_id => $entries) {
$migration = $migration_plugin_manager->createInstance($migration_plugin_id);
assert($migration instanceof MigrationInterface);
$id_map = $migration->getIdMap();
$migration_rows = iterator_to_array($migration->getSourcePlugin(), FALSE);
$matching_row = NULL;
$destination_id_values = [];
foreach ($entries as $entry) {
[
'source_ids' => $source_ids,
'destination_ids' => $destination_id_values,
] = $entry;
$matching_row = array_reduce(
$migration_rows,
function ($matching_row, Row $row) use ($source_ids) {
if ($row->getSourceIdValues() === $source_ids) {
return $row;
}
return $matching_row;
},
);
$this->assertInstanceOf(
Row::class,
$matching_row,
sprintf(
"'%s' wasn't able to identify the row which should get a destination ID record for migration '%s'. This is an example row source IDs array: %s",
__METHOD__,
$migration->getPluginId(),
Variable::export(reset($migration_rows)->getSourceIdValues())
)
);
}
if ($matching_row instanceof Row) {
$id_map->saveIdMapping($matching_row, (array) $destination_id_values);
// Also save a debug message.
$id_map->saveMessage(
$matching_row->getSourceIdValues(),
'This is a message about a test row',
MigrationInterface::MESSAGE_INFORMATIONAL,
);
}
}
}
/**
* Loads a database fixture into the source database connection.
*
* Copied from MigrateDrupalTestBase.
*
* @param string $path
* Path to the dump file.
*
* @see \Drupal\Tests\migrate_drupal\Kernel\MigrateDrupalTestBase::loadFixture()
*/
protected function loadFixture($path) {
$default_db = Database::getConnection()->getKey();
Database::setActiveConnection($this->sourceDatabase->getKey());
if (substr($path, -3) == '.gz') {
$path = 'compress.zlib://' . $path;
}
require $path;
Database::setActiveConnection($default_db);
}
}
