MenuLinkContentDeriverTest.php

Same filename in other branches
  1. 9 core/modules/menu_link_content/tests/src/Kernel/MenuLinkContentDeriverTest.php
  2. 8.9.x core/modules/menu_link_content/tests/src/Kernel/MenuLinkContentDeriverTest.php
  3. 11.x core/modules/menu_link_content/tests/src/Kernel/MenuLinkContentDeriverTest.php

Namespace

Drupal\Tests\menu_link_content\Kernel

File

core/modules/menu_link_content/tests/src/Kernel/MenuLinkContentDeriverTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\Tests\menu_link_content\Kernel;

use Drupal\Core\Menu\MenuTreeParameters;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\menu_link_content\Entity\MenuLinkContent;
use Drupal\KernelTests\KernelTestBase;
use Symfony\Component\Routing\Route;

/**
 * Tests the menu link content deriver.
 *
 * @group menu_link_content
 */
class MenuLinkContentDeriverTest extends KernelTestBase {
    
    /**
     * {@inheritdoc}
     */
    protected static $modules = [
        'menu_link_content',
        'link',
        'system',
        'menu_link_content_dynamic_route',
        'user',
    ];
    
    /**
     * {@inheritdoc}
     */
    protected function setUp() : void {
        parent::setUp();
        $this->installEntitySchema('user');
        $this->installEntitySchema('menu_link_content');
    }
    
    /**
     * Tests the rediscovering.
     */
    public function testRediscover() : void {
        \Drupal::state()->set('menu_link_content_dynamic_route.routes', [
            'route_name_1' => new Route('/example-path'),
        ]);
        \Drupal::service('router.builder')->rebuild();
        // Set up a custom menu link pointing to a specific path.
        $parent = MenuLinkContent::create([
            'title' => '<script>alert("Welcome to the discovered jungle!")</script>',
            'link' => [
                [
                    'uri' => 'internal:/example-path',
                ],
            ],
            'menu_name' => 'tools',
        ]);
        $parent->save();
        $menu_tree = \Drupal::menuTree()->load('tools', new MenuTreeParameters());
        $this->assertCount(1, $menu_tree);
        
        /** @var \Drupal\Core\Menu\MenuLinkTreeElement $tree_element */
        $tree_element = reset($menu_tree);
        $this->assertEquals('route_name_1', $tree_element->link
            ->getRouteName());
        // Change the underlying route and trigger the rediscovering.
        \Drupal::state()->set('menu_link_content_dynamic_route.routes', [
            'route_name_2' => new Route('/example-path'),
        ]);
        \Drupal::service('router.builder')->rebuild();
        // Ensure that the new route name / parameters are captured by the tree.
        $menu_tree = \Drupal::menuTree()->load('tools', new MenuTreeParameters());
        $this->assertCount(1, $menu_tree);
        
        /** @var \Drupal\Core\Menu\MenuLinkTreeElement $tree_element */
        $tree_element = reset($menu_tree);
        $this->assertEquals('route_name_2', $tree_element->link
            ->getRouteName());
        $title = $tree_element->link
            ->getTitle();
        $this->assertNotInstanceOf(TranslatableMarkup::class, $title);
        $this->assertSame('<script>alert("Welcome to the discovered jungle!")</script>', $title);
        // Create a hierarchy.
        \Drupal::state()->set('menu_link_content_dynamic_route.routes', [
            'route_name_1' => new Route('/example-path'),
            'route_name_2' => new Route('/example-path/child'),
        ]);
        $child = MenuLinkContent::create([
            'title' => 'Child',
            'link' => [
                [
                    'uri' => 'entity:/example-path/child',
                ],
            ],
            'menu_name' => 'tools',
            'parent' => 'menu_link_content:' . $parent->uuid(),
        ]);
        $child->save();
        $parent->set('link', [
            [
                'uri' => 'entity:/example-path',
            ],
        ]);
        $parent->save();
        $menu_tree = \Drupal::menuTree()->load('tools', new MenuTreeParameters());
        $this->assertCount(1, $menu_tree);
        
        /** @var \Drupal\Core\Menu\MenuLinkTreeElement $tree_element */
        $tree_element = reset($menu_tree);
        $this->assertTrue($tree_element->hasChildren);
        $this->assertCount(1, $tree_element->subtree);
        // Edit child element link to use 'internal' instead of 'entity'.
        $child->set('link', [
            [
                'uri' => 'internal:/example-path/child',
            ],
        ]);
        $child->save();
        \Drupal::service('plugin.manager.menu.link')->rebuild();
        $menu_tree = \Drupal::menuTree()->load('tools', new MenuTreeParameters());
        $this->assertCount(1, $menu_tree);
        
        /** @var \Drupal\Core\Menu\MenuLinkTreeElement $tree_element */
        $tree_element = reset($menu_tree);
        $this->assertTrue($tree_element->hasChildren);
        $this->assertCount(1, $tree_element->subtree);
    }

}

Classes

Title Deprecated Summary
MenuLinkContentDeriverTest Tests the menu link content deriver.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.