UserNameThemeCacheTest.php

Namespace

Drupal\Tests\user\Kernel

File

core/modules/user/tests/src/Kernel/UserNameThemeCacheTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\Tests\user\Kernel;

use Drupal\Core\Cache\CacheableDependencyInterface;
use Drupal\Core\Render\RenderContext;
use Drupal\KernelTests\KernelTestBase;
use Drupal\Tests\user\Traits\UserCreationTrait;
use Drupal\user\Entity\User;
use PHPUnit\Framework\Attributes\Group;
use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;

/**
 * Tests the 'username' theme element.
 */
class UserNameThemeCacheTest extends KernelTestBase {
  use UserCreationTrait;
  
  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'user',
    'system',
  ];
  
  /**
   * {@inheritdoc}
   */
  protected function setUp() : void {
    parent::setUp();
    $this->installEntitySchema('user');
  }
  
  /**
   * Test cache metadata when rendering arrays using 'username' theme element.
   */
  public function testUserNameThemeRenderCache() : void {
    /** @var \Drupal\Core\Render\RendererInterface $renderer */
    $renderer = \Drupal::service('renderer');
    $context = new RenderContext();
    // First, do not set #account, to test for label to anonymous.
    $build = [
      '#theme' => 'username',
    ];
    $markup = $renderer->executeInRenderContext($context, fn() => $renderer->render($build));
    $this->assertSame('<span></span>', (string) $markup);
    $metadata = $context->pop();
    $this->assertInstanceOf(CacheableDependencyInterface::class, $metadata);
    $this->assertEmpty($metadata->getCacheContexts());
    $this->assertEmpty($metadata->getCacheTags());
    $this->assertSame(-1, $metadata->getCacheMaxAge());
    $user1 = User::create([
      'name' => 'user 1',
      'status' => TRUE,
    ]);
    $user1->save();
    $user2 = User::create([
      'name' => 'user 2',
      'status' => FALSE,
    ]);
    $user2->save();
    // Test that viewing label to own profile or viewing label to a different user's
    // profile is the same without 'access user profiles' permission.
    foreach ([
      $user1,
      $user2,
    ] as $viewing_user) {
      $this->setCurrentUser($viewing_user);
      $other_user = $viewing_user === $user1 ? $user1 : $user2;
      foreach ([
        $viewing_user,
        $other_user,
      ] as $viewed_user) {
        $build = [
          '#theme' => 'username',
          '#account' => $viewed_user,
        ];
        $markup = $renderer->executeInRenderContext($context, fn() => $renderer->render($build));
        $this->assertSame("<span>{$viewed_user->getDisplayName()}</span>", (string) $markup);
        $metadata = $context->pop();
        $this->assertInstanceOf(CacheableDependencyInterface::class, $metadata);
        $cacheContexts = $metadata->getCacheContexts();
        $this->assertSame([
          'user.permissions',
        ], $cacheContexts);
        $this->assertSame([
          "user:{$viewed_user->id()}",
        ], $metadata->getCacheTags());
        $this->assertSame(-1, $metadata->getCacheMaxAge());
      }
    }
    // Now test viewing username labels with a user who can view user profiles.
    $this->setUpCurrentUser([
      'name' => 'user who can view profiles',
    ], [
      'access user profiles',
    ]);
    $build = [
      '#theme' => 'username',
      '#account' => $user1,
    ];
    // User 1 is active, so there should be a link to the profile.
    $markup = $renderer->executeInRenderContext($context, fn() => $renderer->render($build));
    $this->assertSame('<a title="View user profile." href="/user/1">user 1</a>', (string) $markup);
    $metadata = $context->pop();
    $this->assertInstanceOf(CacheableDependencyInterface::class, $metadata);
    $this->assertSame([
      'user.permissions',
    ], $metadata->getCacheContexts());
    $this->assertSame([
      'user:1',
    ], $metadata->getCacheTags());
    $this->assertSame(-1, $metadata->getCacheMaxAge());
    $build = [
      '#theme' => 'username',
      '#account' => $user2,
    ];
    // User 2 is inactive, so no link.
    $markup = $renderer->executeInRenderContext($context, fn() => $renderer->render($build));
    $this->assertSame('<span>user 2</span>', (string) $markup);
    $metadata = $context->pop();
    $this->assertInstanceOf(CacheableDependencyInterface::class, $metadata);
    $this->assertSame([
      'user.permissions',
    ], $metadata->getCacheContexts());
    $this->assertSame([
      'user:2',
    ], $metadata->getCacheTags());
    $this->assertSame(-1, $metadata->getCacheMaxAge());
  }

}

Classes

Title Deprecated Summary
UserNameThemeCacheTest Tests the 'username' theme element.

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