function LinksetControllerTest::testCacheability
Same name in other branches
- 10 core/modules/system/tests/src/Functional/Menu/LinksetControllerTest.php \Drupal\Tests\system\Functional\Menu\LinksetControllerTest::testCacheability()
Test the cacheability of the linkset endpoint.
This test's purpose is to ensure that the menu linkset response is properly cached. It does this by sending a request and validating it has a cache miss and the correct cacheability meta, then by sending the same request to assert a cache hit. Finally, a new menu item is created to ensure that the cached response is properly invalidated.
File
-
core/
modules/ system/ tests/ src/ Functional/ Menu/ LinksetControllerTest.php, line 178
Class
- LinksetControllerTest
- Tests the behavior of the linkset controller.
Namespace
Drupal\Tests\system\Functional\MenuCode
public function testCacheability() : void {
$this->enableEndpoint(TRUE);
$expected_cacheability = new CacheableMetadata();
$expected_cacheability->addCacheContexts([
'user.permissions',
]);
$expected_cacheability->addCacheTags([
'config:system.menu.main',
'config:user.role.anonymous',
'http_response',
'node:1',
'node:2',
'node:3',
]);
$response = $this->doRequest('GET', Url::fromUri('base:/system/menu/main/linkset'));
$this->assertDrupalResponseCacheability('MISS', $expected_cacheability, $response);
$response = $this->doRequest('GET', Url::fromUri('base:/system/menu/main/linkset'));
$this->assertDrupalResponseCacheability('HIT', $expected_cacheability, $response);
// Create a new menu item to invalidate the cache.
$duplicate_title = 'About us (duplicate)';
$this->createMenuItem([
'title' => $duplicate_title,
'description' => 'Links to the about us page again.',
'link' => 'entity:node/1',
'menu_name' => 'main',
]);
// Redo the request.
$response = $this->doRequest('GET', Url::fromUri('base:/system/menu/main/linkset'));
// Assert that the cache has been invalidated.
$this->assertDrupalResponseCacheability('MISS', $expected_cacheability, $response);
// Then ensure that the new menu link is in the response.
$link_items = Json::decode((string) $response->getBody())['linkset'][0]['item'];
$titles = array_column($link_items, 'title');
$this->assertContains($duplicate_title, $titles);
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.