Skip to content
Snippets Groups Projects
Commit bf4667b0 authored by catch's avatar catch
Browse files

Issue #3498963 by benjifisher, heddn: Add lookup_migrations configuration to...

Issue #3498963 by benjifisher, heddn: Add lookup_migrations configuration to menu_link_parent process plugin

(cherry picked from commit 50ea7698)
parent c8098d19
Branches
Tags
1 merge request!122353526426-warning-for-missing
Pipeline #470206 passed with warnings
Pipeline: drupal

#470231

    Pipeline: drupal

    #470222

      Pipeline: drupal

      #470217

        +1
        ......@@ -36,7 +36,12 @@
        * - parent_link_path: The Drupal path or external URL the parent of this menu
        * link points to.
        *
        * Example:
        * There is one configuration option:
        * - lookup_migrations: (optional) An array of migration IDs. If missing or
        * null, then the current migration is used to look up parent_id. If provided,
        * then use just the listed migrations for that look-up.
        *
        * Examples:
        *
        * @code
        * process:
        ......@@ -52,6 +57,35 @@
        * combination of a menu name (e.g., 'management') and a parent menu link path
        * (e.g., 'admin/structure').
        *
        * @code
        * process:
        * parent:
        * plugin: menu_link_parent
        * source:
        * - plid
        * - menu_name
        * - parent_link_path
        * lookup_migrations: []
        * @endcode
        * In this example, skip the migration lookup and find the parent item using
        * just the menu name and the link path.
        *
        * @code
        * process:
        * parent:
        * plugin: menu_link_parent
        * source:
        * - plid
        * - menu_name
        * - parent_link_path
        * lookup_migrations:
        * - this_migration
        * - another_migration
        * @endcode
        * In this example, use this_migration and another_migration (in that order) to
        * look up plid. When lookup_migrations is provided, the current migration is
        * not added by default. If you want to use it, then include it in the list.
        *
        * @see https://www.drupal.org/docs/8/api/menu-api
        * @see \Drupal\migrate\Plugin\MigrateProcessInterface
        */
        ......@@ -86,6 +120,13 @@ class MenuLinkParent extends ProcessPluginBase implements ContainerFactoryPlugin
        */
        protected $menuLinkStorage;
        /**
        * The migration IDs to use for looking up the parent link.
        *
        * @var string[]
        */
        protected array $lookupMigrations;
        /**
        * Constructs a MenuLinkParent object.
        *
        ......@@ -111,6 +152,7 @@ public function __construct(array $configuration, $plugin_id, $plugin_definition
        $this->migrateLookup = $migrate_lookup;
        $this->menuLinkManager = $menu_link_manager;
        $this->menuLinkStorage = $menu_link_storage;
        $this->lookupMigrations = $this->configuration['lookup_migrations'] ?? [$this->migration->id()];
        }
        /**
        ......@@ -141,9 +183,12 @@ public function transform($value, MigrateExecutableInterface $migrate_executable
        return '';
        }
        $lookup_result = $this->migrateLookup->lookup($this->migration->id(), [$parent_id]);
        if ($lookup_result) {
        $already_migrated_id = $lookup_result[0]['id'];
        foreach ($this->lookupMigrations as $migration_id) {
        $lookup_result = $this->migrateLookup->lookup($migration_id, [$parent_id]);
        if ($lookup_result) {
        $already_migrated_id = $lookup_result[0]['id'];
        break;
        }
        }
        if (!empty($already_migrated_id) && ($link = $this->menuLinkStorage->load($already_migrated_id))) {
        ......
        ......@@ -79,6 +79,55 @@ protected function setUp(): void {
        \Drupal::setContainer($container);
        }
        /**
        * Tests that an exception is thrown for invalid options.
        *
        * @param array $configuration
        * The plugin configuration being tested.
        * @param bool $is_valid
        * TRUE if the configuration is valid, FALSE if not.
        *
        * @dataProvider providerConstructorException
        */
        public function testConstructorException(array $configuration, bool $is_valid): void {
        if (!$is_valid) {
        $this->expectException('TypeError');
        $this->expectExceptionMessage('Cannot assign string to property ' . MenuLinkParent::class . '::$lookupMigrations of type array');
        }
        $plugin = new MenuLinkParent($configuration, 'map', [], $this->migrateLookup->reveal(), $this->menuLinkManager->reveal(), $this->menuLinkStorage->reveal(), $this->migration->reveal());
        if ($is_valid) {
        $this->assertInstanceOf(MenuLinkParent::class, $plugin);
        }
        }
        /**
        * Provides data for testConstructorException().
        */
        public static function providerConstructorException(): array {
        return [
        'default configuration is valid' => [
        'configuration' => [],
        'is_valid' => TRUE,
        ],
        'lookup_migrations = null is valid' => [
        'configuration' => ['lookup_migrations' => NULL],
        'is_valid' => TRUE,
        ],
        'bypass migration lookup is valid' => [
        'configuration' => ['lookup_migrations' => []],
        'is_valid' => TRUE,
        ],
        'a list of migrations is valid' => [
        'configuration' => ['lookup_migrations' => ['this_migration', 'another_migration']],
        'is_valid' => TRUE,
        ],
        'a single string is not valid' => [
        'configuration' => ['lookup_migrations' => 'this_migration'],
        'is_valid' => FALSE,
        ],
        ];
        }
        /**
        * Tests that an exception is thrown when the parent menu link is not found.
        *
        ......@@ -225,4 +274,68 @@ public function doTransform(array $source_value, $plugin_id) {
        return $plugin->transform($source_value, $this->migrateExecutable, $this->row, 'destination');
        }
        /**
        * Tests the lookup_migrations option.
        *
        * @param int $plid
        * The ID of the parent menu link.
        * @param array $configuration
        * The plugin configuration being tested.
        * @param string $expected_result
        * The expected value(s) of the migration process plugin.
        *
        * @dataProvider providerLookupMigrations
        */
        public function testLookupMigrations(int $plid, array $configuration, string $expected_result): void {
        $source_value = [$plid, 'some_menu', 'https://www.example.com'];
        $this->migration->id()
        ->willReturn('this_migration');
        $this->migrateLookup->lookup('this_migration', [1])
        ->willReturn([['id' => 101]]);
        $this->migrateLookup->lookup('some_migration', [2])
        ->willReturn([['id' => 202]]);
        $this->migrateLookup->lookup('some_migration', [3])
        ->willReturn([]);
        $this->migrateLookup->lookup('another_migration', [3])
        ->willReturn([['id' => 303]]);
        $menu_link_content_this = $this->prophesize(MenuLinkContent::class);
        $menu_link_content_this->getPluginId()->willReturn('menu_link_content:this_migration');
        $this->menuLinkStorage->load(101)->willReturn($menu_link_content_this);
        $menu_link_content_some = $this->prophesize(MenuLinkContent::class);
        $menu_link_content_some->getPluginId()->willReturn('menu_link_content:some_migration');
        $this->menuLinkStorage->load(202)->willReturn($menu_link_content_some);
        $menu_link_content_another = $this->prophesize(MenuLinkContent::class);
        $menu_link_content_another->getPluginId()->willReturn('menu_link_content:another_migration');
        $this->menuLinkStorage->load(303)->willReturn($menu_link_content_another);
        $plugin = new MenuLinkParent($configuration, 'menu_link', [], $this->migrateLookup->reveal(), $this->menuLinkManager->reveal(), $this->menuLinkStorage->reveal(), $this->migration->reveal());
        $result = $plugin->transform($source_value, $this->migrateExecutable, $this->row, 'destination');
        $this->assertSame($expected_result, $result);
        }
        /**
        * Provides data for testLookupMigrations().
        */
        public static function providerLookupMigrations(): array {
        return [
        'default configuration' => [
        'plid' => 1,
        'configuration' => [],
        'expected_result' => 'menu_link_content:this_migration',
        ],
        'some migration' => [
        'plid' => 2,
        'configuration' => ['lookup_migrations' => ['some_migration', 'another_migration']],
        'expected_result' => 'menu_link_content:some_migration',
        ],
        'another migration' => [
        'plid' => 3,
        'configuration' => ['lookup_migrations' => ['some_migration', 'another_migration']],
        'expected_result' => 'menu_link_content:another_migration',
        ],
        ];
        }
        }
        0% Loading or .
        You are about to add 0 people to the discussion. Proceed with caution.
        Please register or to comment