function UserNameThemeCacheTest::testUserNameThemeRenderCache

Test cache metadata when rendering arrays using 'username' theme element.

File

core/modules/user/tests/src/Kernel/UserNameThemeCacheTest.php, line 40

Class

UserNameThemeCacheTest
Tests the 'username' theme element.

Namespace

Drupal\Tests\user\Kernel

Code

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());
}

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