function LocalTasksTest::testPluginLocalTask

Same name in other branches
  1. 9 core/modules/system/tests/src/Functional/Menu/LocalTasksTest.php \Drupal\Tests\system\Functional\Menu\LocalTasksTest::testPluginLocalTask()
  2. 8.9.x core/modules/system/tests/src/Functional/Menu/LocalTasksTest.php \Drupal\Tests\system\Functional\Menu\LocalTasksTest::testPluginLocalTask()
  3. 11.x core/modules/system/tests/src/Functional/Menu/LocalTasksTest.php \Drupal\Tests\system\Functional\Menu\LocalTasksTest::testPluginLocalTask()

Tests the plugin based local tasks.

File

core/modules/system/tests/src/Functional/Menu/LocalTasksTest.php, line 107

Class

LocalTasksTest
Tests local tasks derived from router and added/altered via hooks.

Namespace

Drupal\Tests\system\Functional\Menu

Code

public function testPluginLocalTask() : void {
    // Verify local tasks defined in the hook.
    $this->drupalGet(Url::fromRoute('menu_test.tasks_default'));
    $this->assertLocalTasks([
        [
            'menu_test.tasks_default',
            [],
        ],
        [
            'menu_test.router_test1',
            [
                'bar' => 'unsafe',
            ],
        ],
        [
            'menu_test.router_test1',
            [
                'bar' => '1',
            ],
        ],
        [
            'menu_test.router_test2',
            [
                'bar' => '2',
            ],
        ],
    ]);
    // Verify that script tags are escaped on output.
    $title = Html::escape("Task 1 <script>alert('Welcome to the jungle!')</script>");
    $this->assertLocalTaskAppears($title);
    $title = Html::escape("<script>alert('Welcome to the derived jungle!')</script>");
    $this->assertLocalTaskAppears($title);
    // Verify that local tasks appear as defined in the router.
    $this->drupalGet(Url::fromRoute('menu_test.local_task_test_tasks_view'));
    $this->assertLocalTasks([
        [
            'menu_test.local_task_test_tasks_view',
            [],
        ],
        [
            'menu_test.local_task_test_tasks_edit',
            [],
        ],
        [
            'menu_test.local_task_test_tasks_settings',
            [],
        ],
        [
            'menu_test.local_task_test_tasks_settings_dynamic',
            [],
        ],
    ]);
    $title = Html::escape("<script>alert('Welcome to the jungle!')</script>");
    $this->assertLocalTaskAppears($title);
    // Ensure the view tab is active.
    $this->assertSession()
        ->elementsCount('xpath', '//ul[contains(@class, "tabs")]//li[contains(@class, "active")]/a', 1);
    $this->assertSession()
        ->elementTextEquals('xpath', '//ul[contains(@class, "tabs")]//li[contains(@class, "active")]/a', 'View');
    // Verify that local tasks in the second level appear.
    $sub_tasks = [
        [
            'menu_test.local_task_test_tasks_settings_sub1',
            [],
        ],
        [
            'menu_test.local_task_test_tasks_settings_sub2',
            [],
        ],
        [
            'menu_test.local_task_test_tasks_settings_sub3',
            [],
        ],
        [
            'menu_test.local_task_test_tasks_settings_derived',
            [
                'placeholder' => 'derive1',
            ],
        ],
        [
            'menu_test.local_task_test_tasks_settings_derived',
            [
                'placeholder' => 'derive2',
            ],
        ],
    ];
    $this->drupalGet(Url::fromRoute('menu_test.local_task_test_tasks_settings'));
    $this->assertLocalTasks($sub_tasks, 1);
    $this->assertSession()
        ->elementsCount('xpath', '//ul[contains(@class, "tabs")]//li[contains(@class, "active")]/a', 1);
    $this->assertSession()
        ->elementTextEquals('xpath', '//ul[contains(@class, "tabs")]//li[contains(@class, "active")]/a', 'Settings');
    $this->drupalGet(Url::fromRoute('menu_test.local_task_test_tasks_settings_sub1'));
    $this->assertLocalTasks($sub_tasks, 1);
    $xpath = '//ul[contains(@class, "tabs")]//a[contains(@class, "active")]';
    $this->assertSession()
        ->elementsCount('xpath', $xpath, 2);
    $links = $this->xpath($xpath);
    $this->assertEquals('Settings', $links[0]->getText(), 'The settings tab is active.');
    $this->assertEquals('Dynamic title for TestTasksSettingsSub1', $links[1]->getText(), 'The sub1 tab is active.');
    $this->assertSession()
        ->responseHeaderContains('X-Drupal-Cache-Tags', 'kittens:ragdoll');
    $this->assertSession()
        ->responseHeaderContains('X-Drupal-Cache-Tags', 'kittens:dwarf-cat');
    $this->drupalGet(Url::fromRoute('menu_test.local_task_test_tasks_settings_derived', [
        'placeholder' => 'derive1',
    ]));
    $this->assertLocalTasks($sub_tasks, 1);
    $result = $this->xpath('//ul[contains(@class, "tabs")]//li[contains(@class, "active")]');
    $this->assertCount(2, $result, 'There are tabs active on both levels.');
    $this->assertEquals('Settings', $result[0]->getText(), 'The settings tab is active.');
    $this->assertEquals('Derive 1', $result[1]->getText(), 'The derive1 tab is active.');
    // Ensures that the local tasks contains the proper 'provider key'
    $definitions = $this->container
        ->get('plugin.manager.menu.local_task')
        ->getDefinitions();
    $this->assertEquals('menu_test', $definitions['menu_test.local_task_test_tasks_view']['provider']);
    $this->assertEquals('menu_test', $definitions['menu_test.local_task_test_tasks_edit']['provider']);
    $this->assertEquals('menu_test', $definitions['menu_test.local_task_test_tasks_settings']['provider']);
    $this->assertEquals('menu_test', $definitions['menu_test.local_task_test_tasks_settings_sub1']['provider']);
    $this->assertEquals('menu_test', $definitions['menu_test.local_task_test_tasks_settings_sub2']['provider']);
    $this->assertEquals('menu_test', $definitions['menu_test.local_task_test_tasks_settings_sub3']['provider']);
    // Test that we correctly apply the active class to tabs where one of the
    // request attributes is upcast to an entity object.
    $entity = \Drupal::entityTypeManager()->getStorage('entity_test')
        ->create([
        'bundle' => 'test',
    ]);
    $entity->save();
    $this->drupalGet(Url::fromRoute('menu_test.local_task_test_upcasting_sub1', [
        'entity_test' => '1',
    ]));
    $tasks = [
        [
            'menu_test.local_task_test_upcasting_sub1',
            [
                'entity_test' => '1',
            ],
        ],
        [
            'menu_test.local_task_test_upcasting_sub2',
            [
                'entity_test' => '1',
            ],
        ],
    ];
    $this->assertLocalTasks($tasks, 0);
    $this->assertSession()
        ->elementsCount('xpath', '//ul[contains(@class, "tabs")]//li[contains(@class, "active")]', 1);
    $this->assertSession()
        ->elementTextEquals('xpath', '//ul[contains(@class, "tabs")]//li[contains(@class, "active")]', 'upcasting sub1');
    $this->drupalGet(Url::fromRoute('menu_test.local_task_test_upcasting_sub2', [
        'entity_test' => '1',
    ]));
    $tasks = [
        [
            'menu_test.local_task_test_upcasting_sub1',
            [
                'entity_test' => '1',
            ],
        ],
        [
            'menu_test.local_task_test_upcasting_sub2',
            [
                'entity_test' => '1',
            ],
        ],
    ];
    $this->assertLocalTasks($tasks, 0);
    $this->assertSession()
        ->elementsCount('xpath', '//ul[contains(@class, "tabs")]//li[contains(@class, "active")]', 1);
    $this->assertSession()
        ->elementTextEquals('xpath', '//ul[contains(@class, "tabs")]//li[contains(@class, "active")]', 'upcasting sub2');
}

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