From 3a6bbc8cae0579c01f45d644455295fcefdff4b4 Mon Sep 17 00:00:00 2001 From: Nathaniel Catchpole Date: Mon, 12 Jun 2017 12:08:10 +0100 Subject: [PATCH] Issue #2843772 by Wim Leers, arshadcn: EntityResource: Provide comprehensive test coverage for DateFormat entity --- .../DateFormat/DateFormatHalJsonAnonTest.php | 30 ++++ .../DateFormatHalJsonBasicAuthTest.php | 35 ++++ .../DateFormatHalJsonCookieTest.php | 35 ++++ .../DateFormat/DateFormatJsonAnonTest.php | 24 +++ .../DateFormatJsonBasicAuthTest.php | 34 ++++ .../DateFormat/DateFormatJsonCookieTest.php | 29 ++++ .../DateFormat/DateFormatResourceTestBase.php | 76 +++++++++ .../src/DateFormatAccessControlHandler.php | 11 +- .../DateFormatAccessControlHandlerTest.php | 149 ++++++++++++++++++ 9 files changed, 420 insertions(+), 3 deletions(-) create mode 100644 core/modules/hal/tests/src/Functional/EntityResource/DateFormat/DateFormatHalJsonAnonTest.php create mode 100644 core/modules/hal/tests/src/Functional/EntityResource/DateFormat/DateFormatHalJsonBasicAuthTest.php create mode 100644 core/modules/hal/tests/src/Functional/EntityResource/DateFormat/DateFormatHalJsonCookieTest.php create mode 100644 core/modules/rest/tests/src/Functional/EntityResource/DateFormat/DateFormatJsonAnonTest.php create mode 100644 core/modules/rest/tests/src/Functional/EntityResource/DateFormat/DateFormatJsonBasicAuthTest.php create mode 100644 core/modules/rest/tests/src/Functional/EntityResource/DateFormat/DateFormatJsonCookieTest.php create mode 100644 core/modules/rest/tests/src/Functional/EntityResource/DateFormat/DateFormatResourceTestBase.php create mode 100644 core/modules/system/tests/src/Kernel/DateFormatAccessControlHandlerTest.php diff --git a/core/modules/hal/tests/src/Functional/EntityResource/DateFormat/DateFormatHalJsonAnonTest.php b/core/modules/hal/tests/src/Functional/EntityResource/DateFormat/DateFormatHalJsonAnonTest.php new file mode 100644 index 00000000000..1bd6eb803c1 --- /dev/null +++ b/core/modules/hal/tests/src/Functional/EntityResource/DateFormat/DateFormatHalJsonAnonTest.php @@ -0,0 +1,30 @@ +grantPermissionsToTestedRole(['administer site configuration']); + } + + /** + * {@inheritdoc} + */ + protected function createEntity() { + // Create a date format. + $date_format = DateFormat::create([ + 'id' => 'llama', + 'label' => 'Llama', + 'pattern' => 'F d, Y', + ]); + + $date_format->save(); + + return $date_format; + } + + /** + * {@inheritdoc} + */ + protected function getExpectedNormalizedEntity() { + return [ + 'dependencies' => [], + 'id' => 'llama', + 'label' => 'Llama', + 'langcode' => 'en', + 'locked' => FALSE, + 'pattern' => 'F d, Y', + 'status' => TRUE, + 'uuid' => $this->entity->uuid(), + ]; + } + + /** + * {@inheritdoc} + */ + protected function getNormalizedPostEntity() { + // @todo Update in https://www.drupal.org/node/2300677. + } + +} diff --git a/core/modules/system/src/DateFormatAccessControlHandler.php b/core/modules/system/src/DateFormatAccessControlHandler.php index c9cee601ec3..e56fe92a46a 100644 --- a/core/modules/system/src/DateFormatAccessControlHandler.php +++ b/core/modules/system/src/DateFormatAccessControlHandler.php @@ -14,18 +14,23 @@ use Drupal\Core\Session\AccountInterface; */ class DateFormatAccessControlHandler extends EntityAccessControlHandler { + /** + * {@inheritdoc} + */ + protected $viewLabelOperation = TRUE; + /** * {@inheritdoc} */ protected function checkAccess(EntityInterface $entity, $operation, AccountInterface $account) { - // There are no restrictions on viewing a date format. - if ($operation == 'view') { + // There are no restrictions on viewing the label of a date format. + if ($operation === 'view label') { return AccessResult::allowed(); } // Locked date formats cannot be updated or deleted. elseif (in_array($operation, ['update', 'delete'])) { if ($entity->isLocked()) { - return AccessResult::forbidden()->addCacheableDependency($entity); + return AccessResult::forbidden('The DateFormat config entity is locked.')->addCacheableDependency($entity); } else { return parent::checkAccess($entity, $operation, $account)->addCacheableDependency($entity); diff --git a/core/modules/system/tests/src/Kernel/DateFormatAccessControlHandlerTest.php b/core/modules/system/tests/src/Kernel/DateFormatAccessControlHandlerTest.php new file mode 100644 index 00000000000..01b09dc6bbd --- /dev/null +++ b/core/modules/system/tests/src/Kernel/DateFormatAccessControlHandlerTest.php @@ -0,0 +1,149 @@ +installEntitySchema('date_format'); + $this->installEntitySchema('user'); + $this->installSchema('system', 'sequences'); + $this->accessControlHandler = $this->container->get('entity_type.manager')->getAccessControlHandler('date_format'); + } + + /** + * @covers ::checkAccess + * @covers ::checkCreateAccess + * @dataProvider testAccessProvider + */ + public function testAccess($which_user, $which_entity, $view_label_access_result, $view_access_result, $update_access_result, $delete_access_result, $create_access_result) { + // We must always create user 1, so that a "normal" user has a ID >1. + $root_user = $this->drupalCreateUser(); + + if ($which_user === 'user1') { + $user = $root_user; + } + else { + $permissions = ($which_user === 'admin') + ? ['administer site configuration'] + : []; + $user = $this->drupalCreateUser($permissions); + } + + $entity_values = ($which_entity === 'unlocked') + ? ['locked' => FALSE] + : ['locked' => TRUE]; + $entity_values['id'] = $this->randomMachineName(); + $entity = DateFormat::create($entity_values); + $entity->save(); + + static::assertEquals($view_label_access_result, $this->accessControlHandler->access($entity, 'view label', $user, TRUE)); + static::assertEquals($view_access_result, $this->accessControlHandler->access($entity, 'view', $user, TRUE)); + static::assertEquals($update_access_result, $this->accessControlHandler->access($entity, 'update', $user, TRUE)); + static::assertEquals($delete_access_result, $this->accessControlHandler->access($entity, 'delete', $user, TRUE)); + static::assertEquals($create_access_result, $this->accessControlHandler->createAccess(NULL, $user, [], TRUE)); + } + + public function testAccessProvider() { + $c = new ContainerBuilder(); + $cache_contexts_manager = $this->prophesize(CacheContextsManager::class); + $cache_contexts_manager->assertValidTokens()->willReturn(TRUE); + $cache_contexts_manager->reveal(); + $c->set('cache_contexts_manager', $cache_contexts_manager); + \Drupal::setContainer($c); + + return [ + 'permissionless + unlocked' => [ + 'permissionless', + 'unlocked', + AccessResult::allowed(), + AccessResult::neutral()->addCacheContexts(['user.permissions'])->setReason("The 'administer site configuration' permission is required."), + AccessResult::neutral()->addCacheContexts(['user.permissions'])->setReason("The 'administer site configuration' permission is required.")->addCacheTags(['rendered']), + AccessResult::neutral()->addCacheContexts(['user.permissions'])->setReason("The 'administer site configuration' permission is required.")->addCacheTags(['rendered']), + AccessResult::neutral()->addCacheContexts(['user.permissions'])->setReason("The 'administer site configuration' permission is required."), + ], + 'permissionless + locked' => [ + 'permissionless', + 'locked', + AccessResult::allowed(), + AccessResult::neutral()->addCacheContexts(['user.permissions'])->setReason("The 'administer site configuration' permission is required."), + AccessResult::forbidden()->addCacheTags(['rendered'])->setReason("The DateFormat config entity is locked."), + AccessResult::forbidden()->addCacheTags(['rendered'])->setReason("The DateFormat config entity is locked."), + AccessResult::neutral()->addCacheContexts(['user.permissions'])->setReason("The 'administer site configuration' permission is required."), + ], + 'admin + unlocked' => [ + 'admin', + 'unlocked', + AccessResult::allowed(), + AccessResult::allowed()->addCacheContexts(['user.permissions']), + AccessResult::allowed()->addCacheContexts(['user.permissions'])->addCacheTags(['rendered']), + AccessResult::allowed()->addCacheContexts(['user.permissions'])->addCacheTags(['rendered']), + AccessResult::allowed()->addCacheContexts(['user.permissions']), + ], + 'admin + locked' => [ + 'admin', + 'locked', + AccessResult::allowed(), + AccessResult::allowed()->addCacheContexts(['user.permissions']), + AccessResult::forbidden()->addCacheTags(['rendered'])->setReason("The DateFormat config entity is locked."), + AccessResult::forbidden()->addCacheTags(['rendered'])->setReason("The DateFormat config entity is locked."), + AccessResult::allowed()->addCacheContexts(['user.permissions']), + ], + 'user1 + unlocked' => [ + 'user1', + 'unlocked', + AccessResult::allowed(), + AccessResult::allowed()->addCacheContexts(['user.permissions']), + AccessResult::allowed()->addCacheContexts(['user.permissions'])->addCacheTags(['rendered']), + AccessResult::allowed()->addCacheContexts(['user.permissions'])->addCacheTags(['rendered']), + AccessResult::allowed()->addCacheContexts(['user.permissions']), + ], + 'user1 + locked' => [ + 'user1', + 'locked', + AccessResult::allowed(), + AccessResult::allowed()->addCacheContexts(['user.permissions']), + AccessResult::forbidden()->addCacheTags(['rendered'])->setReason("The DateFormat config entity is locked."), + AccessResult::forbidden()->addCacheTags(['rendered'])->setReason("The DateFormat config entity is locked."), + AccessResult::allowed()->addCacheContexts(['user.permissions']), + ], + ]; + } + +}