OverrideMenuLinksConfigActionTest.php

Namespace

Drupal\KernelTests\Core\Menu

File

core/tests/Drupal/KernelTests/Core/Menu/OverrideMenuLinksConfigActionTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\KernelTests\Core\Menu;

use ColinODell\PsrTestLogger\TestLogger;
use Drupal\Core\Config\Action\ConfigActionException;
use Drupal\Core\Logger\LoggerChannelFactoryInterface;
use Drupal\Core\Logger\RfcLogLevel;
use Drupal\Core\Menu\MenuLinkManagerInterface;
use Drupal\Core\Menu\Plugin\ConfigAction\OverrideMenuLinks;
use Drupal\KernelTests\KernelTestBase;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\Group;
use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;

/**
 * Tests overriding static menu links with config actions.
 */
final class OverrideMenuLinksConfigActionTest extends KernelTestBase {
  
  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'menu_test',
  ];
  
  /**
   * Tests that the action only works on core.menu.static_menu_link_overrides.
   */
  public function testConfigName() : void {
    $this->expectException(ConfigActionException::class);
    $this->expectExceptionMessage('This config action can only be used on the core.menu.static_menu_link_overrides config object.');
    $this->container
      ->get('plugin.manager.config_action')
      ->applyAction('overrideMenuLinks', 'system.menu.original', []);
  }
  
  /**
   * Tests overriding static menu links.
   */
  public function testOverrideLinks() : void {
    /** @var \Drupal\Core\Config\Action\ConfigActionManager $action_manager */
    $action_manager = $this->container
      ->get('plugin.manager.config_action');
    /** @var \Drupal\Core\Menu\MenuLinkManagerInterface $link_manager */
    $link_manager = $this->container
      ->get(MenuLinkManagerInterface::class);
    $link_manager->rebuild();
    $definition = $link_manager->getDefinition('menu_test.menu_name_test');
    $this->assertSame('0', $definition['weight']);
    $this->assertSame('1', $definition['enabled']);
    $logger = new TestLogger();
    $this->container
      ->get(LoggerChannelFactoryInterface::class)
      ->get('menu')
      ->addLogger($logger);
    $action_manager->applyAction('overrideMenuLinks', 'core.menu.static_menu_link_overrides', [
      'menu_test.menu_name_test' => [
        'weight' => 5,
        'enabled' => FALSE,
      ],
      'not_a_link' => [
        'enabled' => TRUE,
      ],
    ]);
    $link_manager->rebuild();
    $definition = $link_manager->getDefinition('menu_test.menu_name_test');
    $this->assertSame('5', $definition['weight']);
    $this->assertSame('0', $definition['enabled']);
    // Trying to override a non-existent link should log a warning.
    $this->assertTrue($logger->hasRecord('The @link_id menu link was not overridden because it does not exist.', RfcLogLevel::WARNING));
    // We should be able to undo the override.
    $action_manager->applyAction('overrideMenuLinks', 'core.menu.static_menu_link_overrides', [
      'menu_test.menu_name_test' => NULL,
    ]);
    $link_manager->rebuild();
    $definition = $link_manager->getDefinition('menu_test.menu_name_test');
    $this->assertSame('0', $definition['weight']);
    $this->assertSame('1', $definition['enabled']);
  }

}

Classes

Title Deprecated Summary
OverrideMenuLinksConfigActionTest Tests overriding static menu links with config actions.

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