RenderCacheTest.php

Same filename in other branches
  1. 9 core/tests/Drupal/KernelTests/Core/Render/RenderCacheTest.php
  2. 8.9.x core/tests/Drupal/KernelTests/Core/Render/RenderCacheTest.php
  3. 10 core/tests/Drupal/KernelTests/Core/Render/RenderCacheTest.php

Namespace

Drupal\KernelTests\Core\Render

File

core/tests/Drupal/KernelTests/Core/Render/RenderCacheTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\KernelTests\Core\Render;

use Drupal\KernelTests\KernelTestBase;
use Drupal\Tests\user\Traits\UserCreationTrait;

/**
 * Tests the caching of render items via functional tests.
 *
 * @todo Remove or updated in https://www.drupal.org/project/drupal/issues/3436395.
 *
 * @group Render
 */
class RenderCacheTest extends KernelTestBase {
    use UserCreationTrait;
    
    /**
     * {@inheritdoc}
     */
    protected static $modules = [
        'user',
        'system',
    ];
    
    /**
     * {@inheritdoc}
     *
     * @todo Remove and fix test to not rely on super user.
     * @see https://www.drupal.org/project/drupal/issues/3437620
     */
    protected bool $usesSuperUserAccessPolicy = TRUE;
    
    /**
     * {@inheritdoc}
     */
    protected function setUp() : void {
        parent::setUp();
        $this->installEntitySchema('user');
        $this->installConfig([
            'user',
        ]);
    }
    
    /**
     * Tests that user 1 has a different permission context with the same roles.
     */
    public function testUser1PermissionContext() : void {
        $this->doTestUser1WithContexts([
            'user.permissions',
        ]);
    }
    
    /**
     * Tests that user 1 has a different roles context with the same roles.
     */
    public function testUser1RolesContext() : void {
        $this->doTestUser1WithContexts([
            'user.roles',
        ]);
    }
    
    /**
     * Ensures that user 1 has a unique render cache for the given context.
     *
     * @param string[] $contexts
     *   List of cache contexts to use.
     */
    protected function doTestUser1WithContexts($contexts) : void {
        // Test that user 1 does not share the cache with other users who have the
        // same roles, even when using a role-based cache context.
        $user1 = $this->createUser();
        $this->assertEquals(1, $user1->id());
        $first_authenticated_user = $this->createUser();
        $second_authenticated_user = $this->createUser();
        $admin_user = $this->createUser([], NULL, TRUE);
        $this->assertEquals($user1->getRoles(), $first_authenticated_user->getRoles(), 'User 1 has the same roles as an authenticated user.');
        // Impersonate user 1 and render content that only user 1 should have
        // permission to see.
        \Drupal::service('account_switcher')->switchTo($user1);
        $test_element = [
            '#cache' => [
                'keys' => [
                    'test',
                ],
                'contexts' => $contexts,
            ],
        ];
        $element = $test_element;
        $element['#markup'] = 'content for admin users';
        $output = \Drupal::service('renderer')->renderRoot($element);
        $this->assertEquals('content for admin users', $output);
        // Verify the cache is working by rendering the same element but with
        // different markup passed in; the result should be the same.
        $element = $test_element;
        $element['#markup'] = 'should not be used';
        $output = \Drupal::service('renderer')->renderRoot($element);
        $this->assertEquals('content for admin users', $output);
        \Drupal::service('account_switcher')->switchBack();
        // Verify that the first authenticated user does not see the same content
        // as user 1.
        \Drupal::service('account_switcher')->switchTo($first_authenticated_user);
        $element = $test_element;
        $element['#markup'] = 'content for authenticated users';
        $output = \Drupal::service('renderer')->renderRoot($element);
        $this->assertEquals('content for authenticated users', $output);
        \Drupal::service('account_switcher')->switchBack();
        // Verify that the second authenticated user shares the cache with the
        // first authenticated user.
        \Drupal::service('account_switcher')->switchTo($second_authenticated_user);
        $element = $test_element;
        $element['#markup'] = 'should not be used';
        $output = \Drupal::service('renderer')->renderRoot($element);
        $this->assertEquals('content for authenticated users', $output);
        \Drupal::service('account_switcher')->switchBack();
        // The admin user should have the same cache as user 1, as the admin role
        // has the same permissions hash.
        \Drupal::service('account_switcher')->switchTo($admin_user);
        $element = $test_element;
        $element['#markup'] = 'content that is role specific';
        $output = \Drupal::service('renderer')->renderRoot($element);
        $expected = in_array('user.roles', $contexts, TRUE) ? 'content that is role specific' : 'content for admin users';
        $this->assertEquals($expected, $output);
        \Drupal::service('account_switcher')->switchBack();
    }

}

Classes

Title Deprecated Summary
RenderCacheTest Tests the caching of render items via functional tests.

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