class UserNameThemeCacheTest
Tests the 'username' theme element.
Attributes
#[Group('user')]
#[RunTestsInSeparateProcesses]
Hierarchy
- class \Drupal\KernelTests\KernelTestBase implements \Drupal\Core\DependencyInjection\ServiceProviderInterface uses \Drupal\Tests\DrupalTestCaseTrait, \Drupal\KernelTests\AssertContentTrait, \Drupal\Tests\RandomGeneratorTrait, \Drupal\Tests\ConfigTestTrait, \Drupal\Tests\ExtensionListTestTrait, \Drupal\Tests\TestRequirementsTrait, \Drupal\Tests\PhpUnitCompatibilityTrait, \Prophecy\PhpUnit\ProphecyTrait, \Drupal\TestTools\Extension\DeprecationBridge\ExpectDeprecationTrait extends \PHPUnit\Framework\TestCase
- class \Drupal\Tests\user\Kernel\UserNameThemeCacheTest uses \Drupal\Tests\user\Traits\UserCreationTrait extends \Drupal\KernelTests\KernelTestBase
Expanded class hierarchy of UserNameThemeCacheTest
File
-
core/
modules/ user/ tests/ src/ Kernel/ UserNameThemeCacheTest.php, line 18
Namespace
Drupal\Tests\user\KernelView source
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());
}
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.