LocalActionTest.php

Same filename in this branch
  1. 10 core/modules/system/tests/modules/menu_test/src/Plugin/Derivative/LocalActionTest.php
Same filename and directory in other branches
  1. 9 core/modules/system/tests/src/Functional/Menu/LocalActionTest.php
  2. 9 core/modules/system/tests/modules/menu_test/src/Plugin/Derivative/LocalActionTest.php
  3. 8.9.x core/modules/system/tests/src/Functional/Menu/LocalActionTest.php
  4. 8.9.x core/modules/system/tests/modules/menu_test/src/Plugin/Derivative/LocalActionTest.php
  5. 11.x core/modules/system/tests/src/Functional/Menu/LocalActionTest.php
  6. 11.x core/modules/system/tests/modules/menu_test/src/Plugin/Derivative/LocalActionTest.php
  7. 11.x core/modules/block_content/tests/src/Functional/LocalActionTest.php

Namespace

Drupal\Tests\system\Functional\Menu

File

core/modules/system/tests/src/Functional/Menu/LocalActionTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\Tests\system\Functional\Menu;

use Drupal\Component\Utility\Html;
use Drupal\Core\Url;
use Drupal\Tests\BrowserTestBase;

/**
 * Tests local actions derived from router and added/altered via hooks.
 *
 * @group Menu
 */
class LocalActionTest extends BrowserTestBase {
  
  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'block',
    'menu_test',
  ];
  
  /**
   * {@inheritdoc}
   */
  protected $defaultTheme = 'stark';
  
  /**
   * {@inheritdoc}
   */
  protected function setUp() : void {
    parent::setUp();
    $this->drupalPlaceBlock('local_actions_block');
  }
  
  /**
   * Tests appearance of local actions.
   */
  public function testLocalAction() : void {
    $this->drupalGet('menu-test-local-action');
    // Ensure that both menu and route based actions are shown.
    $this->assertLocalAction([
      [
        Url::fromRoute('menu_test.local_action4'),
        'My dynamic-title action',
      ],
      [
        Url::fromRoute('menu_test.local_action4'),
        Html::escape("<script>alert('Welcome to the jungle!')</script>"),
      ],
      [
        Url::fromRoute('menu_test.local_action4'),
        Html::escape("<script>alert('Welcome to the derived jungle!')</script>"),
      ],
      [
        Url::fromRoute('menu_test.local_action2'),
        'My hook_menu action',
      ],
      [
        Url::fromRoute('menu_test.local_action3'),
        'My YAML discovery action',
      ],
      [
        Url::fromRoute('menu_test.local_action5'),
        'Title override',
      ],
    ]);
    // Test a local action title that changes based on a config value.
    $this->drupalGet(Url::fromRoute('menu_test.local_action6'));
    $this->assertLocalAction([
      [
        Url::fromRoute('menu_test.local_action5'),
        'Original title',
      ],
    ]);
    // Verify the expected cache tag in the response headers.
    $this->assertSession()
      ->responseHeaderContains('x-drupal-cache-tags', 'config:menu_test.links.action');
    /** @var \Drupal\Core\Config\Config $config */
    $config = $this->container
      ->get('config.factory')
      ->getEditable('menu_test.links.action');
    $config->set('title', 'New title');
    $config->save();
    $this->drupalGet(Url::fromRoute('menu_test.local_action6'));
    $this->assertLocalAction([
      [
        Url::fromRoute('menu_test.local_action5'),
        'New title',
      ],
    ]);
  }
  
  /**
   * Asserts local actions in the page output.
   *
   * @param array $actions
   *   A list of expected action link titles, keyed by the hrefs.
   *
   * @internal
   */
  protected function assertLocalAction(array $actions) : void {
    $elements = $this->xpath('//a[contains(@class, :class)]', [
      ':class' => 'button-action',
    ]);
    $index = 0;
    foreach ($actions as $action) {
      /** @var \Drupal\Core\Url $url */
      [
        $url,
        $title,
      ] = $action;
      // SimpleXML gives us the unescaped text, not the actual escaped markup,
      // so use a pattern instead to check the raw content.
      // This behavior is a bug in libxml, see
      // https://bugs.php.net/bug.php?id=49437.
      $this->assertSession()
        ->responseMatches('@<a [^>]*class="[^"]*button-action[^"]*"[^>]*>' . preg_quote($title, '@') . '</@');
      $this->assertEquals($url->toString(), $elements[$index]->getAttribute('href'));
      $index++;
    }
  }

}

Classes

Title Deprecated Summary
LocalActionTest Tests local actions derived from router and added/altered via hooks.

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