From 0b47db51aa8178a52dc6fcbdbb5182b12847f653 Mon Sep 17 00:00:00 2001 From: Lee Rowlands <lee.rowlands@previousnext.com.au> Date: Fri, 22 Mar 2019 09:03:43 +1000 Subject: [PATCH] Issue #2998335 by tim.plunkett: [regression] \Drupal\user\ContextProvider\CurrentUserContext broken for anonymous users --- .../ContextProvider/CurrentUserContext.php | 7 ++- .../CurrentUserContextTest.php | 62 +++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 core/modules/user/tests/src/Kernel/ContextProvider/CurrentUserContextTest.php diff --git a/core/modules/user/src/ContextProvider/CurrentUserContext.php b/core/modules/user/src/ContextProvider/CurrentUserContext.php index 990eafb2747e..f1f69ad1480c 100644 --- a/core/modules/user/src/ContextProvider/CurrentUserContext.php +++ b/core/modules/user/src/ContextProvider/CurrentUserContext.php @@ -53,9 +53,14 @@ public function getRuntimeContexts(array $unqualified_context_ids) { // @todo Do not validate protected fields to avoid bug in TypedData, // remove this in https://www.drupal.org/project/drupal/issues/2934192. $current_user->_skipProtectedUserFieldConstraint = TRUE; + + $context = EntityContext::fromEntity($current_user, $this->t('Current user')); + } + else { + // If not user is available, provide an empty context object. + $context = EntityContext::fromEntityTypeId('user', $this->t('Current user')); } - $context = EntityContext::fromEntity($current_user, $this->t('Current user')); $cacheability = new CacheableMetadata(); $cacheability->setCacheContexts(['user']); $context->addCacheableDependency($cacheability); diff --git a/core/modules/user/tests/src/Kernel/ContextProvider/CurrentUserContextTest.php b/core/modules/user/tests/src/Kernel/ContextProvider/CurrentUserContextTest.php new file mode 100644 index 000000000000..be9e829e4ebb --- /dev/null +++ b/core/modules/user/tests/src/Kernel/ContextProvider/CurrentUserContextTest.php @@ -0,0 +1,62 @@ +<?php + +namespace Drupal\Tests\user\Kernel\ContextProvider; + +use Drupal\Core\Session\AccountInterface; +use Drupal\KernelTests\KernelTestBase; +use Drupal\user\Entity\User; + +/** + * @coversDefaultClass \Drupal\user\ContextProvider\CurrentUserContext + * + * @group user + */ +class CurrentUserContextTest extends KernelTestBase { + + /** + * {@inheritdoc} + */ + protected static $modules = ['system', 'user']; + + /** + * {@inheritdoc} + */ + protected function setUp() { + parent::setUp(); + + $this->installSchema('system', ['sequences']); + $this->installEntitySchema('user'); + } + + /** + * @covers ::getAvailableContexts + */ + public function testGetAvailableContexts() { + $context_repository = $this->container->get('context.repository'); + + // Test an authenticated account. + $authenticated = User::create([ + 'name' => $this->randomMachineName(), + ]); + $authenticated->save(); + $authenticated = User::load($authenticated->id()); + $this->container->get('current_user')->setAccount($authenticated); + + $contexts = $context_repository->getAvailableContexts(); + $this->assertArrayHasKey('@user.current_user_context:current_user', $contexts); + $this->assertSame('entity:user', $contexts['@user.current_user_context:current_user']->getContextDefinition()->getDataType()); + $this->assertTrue($contexts['@user.current_user_context:current_user']->hasContextValue()); + $this->assertTrue($contexts['@user.current_user_context:current_user']->getContextValue()); + + // Test an anonymous account. + $anonymous = $this->prophesize(AccountInterface::class); + $anonymous->id()->willReturn(0); + $this->container->get('current_user')->setAccount($anonymous->reveal()); + + $contexts = $context_repository->getAvailableContexts(); + $this->assertArrayHasKey('@user.current_user_context:current_user', $contexts); + $this->assertSame('entity:user', $contexts['@user.current_user_context:current_user']->getContextDefinition()->getDataType()); + $this->assertFalse($contexts['@user.current_user_context:current_user']->hasContextValue()); + } + +} -- GitLab