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. 10 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 101

Class

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

Namespace

Drupal\Tests\system\Functional\Menu

Code

public function testPluginLocalTask() {
    // 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.
    $result = $this->xpath('//ul[contains(@class, "tabs")]//li[contains(@class, "active")]/a');
    $this->assertCount(1, $result, 'There is just a single active tab.');
    $this->assertEqual('View(active tab)', $result[0]->getText(), 'The view tab is active.');
    // 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);
    $result = $this->xpath('//ul[contains(@class, "tabs")]//li[contains(@class, "active")]/a');
    $this->assertCount(1, $result, 'There is just a single active tab.');
    $this->assertEqual('Settings(active tab)', $result[0]->getText(), 'The settings tab is active.');
    $this->drupalGet(Url::fromRoute('menu_test.local_task_test_tasks_settings_sub1'));
    $this->assertLocalTasks($sub_tasks, 1);
    $result = $this->xpath('//ul[contains(@class, "tabs")]//a[contains(@class, "active")]');
    $this->assertCount(2, $result, 'There are tabs active on both levels.');
    $this->assertEqual('Settings(active tab)', $result[0]->getText(), 'The settings tab is active.');
    $this->assertEqual('Dynamic title for TestTasksSettingsSub1(active tab)', $result[1]->getText(), 'The sub1 tab is active.');
    $this->assertCacheTag('kittens:ragdoll');
    $this->assertCacheTag('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->assertEqual('Settings(active tab)', $result[0]->getText(), 'The settings tab is active.');
    $this->assertEqual('Derive 1(active tab)', $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->assertEqual($definitions['menu_test.local_task_test_tasks_view']['provider'], 'menu_test');
    $this->assertEqual($definitions['menu_test.local_task_test_tasks_edit']['provider'], 'menu_test');
    $this->assertEqual($definitions['menu_test.local_task_test_tasks_settings']['provider'], 'menu_test');
    $this->assertEqual($definitions['menu_test.local_task_test_tasks_settings_sub1']['provider'], 'menu_test');
    $this->assertEqual($definitions['menu_test.local_task_test_tasks_settings_sub2']['provider'], 'menu_test');
    $this->assertEqual($definitions['menu_test.local_task_test_tasks_settings_sub3']['provider'], 'menu_test');
    // Test that we 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);
    $result = $this->xpath('//ul[contains(@class, "tabs")]//li[contains(@class, "active")]');
    $this->assertCount(1, $result, 'There is one active tab.');
    $this->assertEqual('upcasting sub1(active tab)', $result[0]->getText(), 'The "upcasting sub1" tab is active.');
    $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);
    $result = $this->xpath('//ul[contains(@class, "tabs")]//li[contains(@class, "active")]');
    $this->assertCount(1, $result, 'There is one active tab.');
    $this->assertEqual('upcasting sub2(active tab)', $result[0]->getText(), 'The "upcasting sub2" tab is active.');
}

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