You are here

public function CacheContextOptimizationTest::testUserPermissionCacheContextOptimization in Drupal 9

Same name and namespace in other branches
  1. 8 core/tests/Drupal/KernelTests/Core/Cache/CacheContextOptimizationTest.php \Drupal\KernelTests\Core\Cache\CacheContextOptimizationTest::testUserPermissionCacheContextOptimization()
  2. 10 core/tests/Drupal/KernelTests/Core/Cache/CacheContextOptimizationTest.php \Drupal\KernelTests\Core\Cache\CacheContextOptimizationTest::testUserPermissionCacheContextOptimization()

Ensures that 'user.permissions' cache context is able to define cache tags.

File

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

Class

CacheContextOptimizationTest
Tests the cache context optimization.

Namespace

Drupal\KernelTests\Core\Cache

Code

public function testUserPermissionCacheContextOptimization() {
  $user1 = $this
    ->createUser();
  $this
    ->assertEquals(1, $user1
    ->id());
  $authenticated_user = $this
    ->createUser([
    'administer permissions',
  ]);
  $role = $authenticated_user
    ->getRoles()[1];
  $test_element = [
    '#cache' => [
      'keys' => [
        'test',
      ],
      'contexts' => [
        'user',
        'user.permissions',
      ],
    ],
  ];
  \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.permissions' cache context defined a cache tags for permission
  // changes, which should have bubbled up for the element when it was
  // optimized away.
  Role::load($role)
    ->revokePermission('administer permissions')
    ->save();
  $element = $test_element;
  $element['#markup'] = 'this should be visible';
  $output = \Drupal::service('renderer')
    ->renderRoot($element);
  $this
    ->assertEquals('this should be visible', $output);
}