function CacheContextOptimizationTest::testUserRolesCacheContextOptimization

Same name in other branches
  1. 9 core/tests/Drupal/KernelTests/Core/Cache/CacheContextOptimizationTest.php \Drupal\KernelTests\Core\Cache\CacheContextOptimizationTest::testUserRolesCacheContextOptimization()
  2. 8.9.x core/tests/Drupal/KernelTests/Core/Cache/CacheContextOptimizationTest.php \Drupal\KernelTests\Core\Cache\CacheContextOptimizationTest::testUserRolesCacheContextOptimization()
  3. 11.x core/tests/Drupal/KernelTests/Core/Cache/CacheContextOptimizationTest.php \Drupal\KernelTests\Core\Cache\CacheContextOptimizationTest::testUserRolesCacheContextOptimization()

Ensures that 'user.roles' still works when it is optimized away.

File

core/tests/Drupal/KernelTests/Core/Cache/CacheContextOptimizationTest.php, line 80

Class

CacheContextOptimizationTest
Tests the cache context optimization.

Namespace

Drupal\KernelTests\Core\Cache

Code

public function testUserRolesCacheContextOptimization() : void {
    $root_user = $this->createUser();
    $this->assertEquals(1, $root_user->id());
    $authenticated_user = $this->createUser([
        'administer permissions',
    ]);
    $role = $authenticated_user->getRoles()[1];
    $test_element = [
        '#cache' => [
            'keys' => [
                'test',
            ],
            'contexts' => [
                'user',
                'user.roles',
            ],
        ],
    ];
    \Drupal::service('account_switcher')->switchTo($authenticated_user);
    $element = $test_element;
    $element['#markup'] = 'content for authenticated users';
    $output = \Drupal::service('renderer')->renderRoot($element);
    $this->assertEquals('content for authenticated users', $output);
    // Verify that the render caching is working so that other tests can be
    // trusted.
    $element = $test_element;
    $element['#markup'] = 'this should not be visible';
    $output = \Drupal::service('renderer')->renderRoot($element);
    $this->assertEquals('content for authenticated users', $output);
    // Even though the cache contexts have been optimized to only include 'user'
    // cache context, the element should have been changed because 'user.roles'
    // cache context defined a cache tag for user entity changes, which should
    // have bubbled up for the element when it was optimized away.
    $authenticated_user->removeRole($role)
        ->save();
    $element = $test_element;
    $element['#markup'] = 'this should be visible';
    $output = \Drupal::service('renderer')->renderRoot($element);
    $this->assertEquals('this should be visible', $output);
}

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