function BlockContentAccessHandlerTest::testAccess

Same name and namespace in other branches
  1. 9 core/modules/block_content/tests/src/Kernel/BlockContentAccessHandlerTest.php \Drupal\Tests\block_content\Kernel\BlockContentAccessHandlerTest::testAccess()
  2. 8.9.x core/modules/block_content/tests/src/Kernel/BlockContentAccessHandlerTest.php \Drupal\Tests\block_content\Kernel\BlockContentAccessHandlerTest::testAccess()
  3. 11.x core/modules/block_content/tests/src/Kernel/BlockContentAccessHandlerTest.php \Drupal\Tests\block_content\Kernel\BlockContentAccessHandlerTest::testAccess()

Test block content entity access.

@covers ::checkAccess

@dataProvider providerTestAccess

@phpstan-param class-string<\Drupal\Core\Access\AccessResultInterface>|null $parent_access @phpstan-param class-string<\Drupal\Core\Access\AccessResultInterface> $expected_access

Parameters

string $operation: The entity operation to test.

bool $published: Whether the latest revision should be published.

bool $reusable: Whether the block content should be reusable. Non-reusable blocks are typically used in Layout Builder.

array $permissions: Permissions to grant to the test user.

bool $isLatest: Whether the block content should be the latest revision when checking access. If FALSE, multiple revisions will be created, and an older revision will be loaded before checking access.

string|null $parent_access: Whether the test user has access to the parent entity, valid values are class names of classes implementing AccessResultInterface. Set to NULL to assert parent will not be called.

string $expected_access: The expected access for the user and block content. Valid values are class names of classes implementing AccessResultInterface

string|null $expected_access_message: The expected access message.

File

core/modules/block_content/tests/src/Kernel/BlockContentAccessHandlerTest.php, line 140

Class

BlockContentAccessHandlerTest
Tests the block content entity access handler.

Namespace

Drupal\Tests\block_content\Kernel

Code

public function testAccess(string $operation, bool $published, bool $reusable, array $permissions, bool $isLatest, ?string $parent_access, string $expected_access, ?string $expected_access_message = NULL) : void {
  /** @var \Drupal\Core\Entity\RevisionableStorageInterface $entityStorage */
  $entityStorage = \Drupal::entityTypeManager()->getStorage('block_content');
  $loadRevisionId = NULL;
  if (!$isLatest) {
    // Save a historical revision, then setup for a new revision to be saved.
    $this->blockEntity
      ->save();
    $loadRevisionId = $this->blockEntity
      ->getRevisionId();
    $this->blockEntity = $entityStorage->createRevision($this->blockEntity);
  }
  $published ? $this->blockEntity
    ->setPublished() : $this->blockEntity
    ->setUnpublished();
  $reusable ? $this->blockEntity
    ->setReusable() : $this->blockEntity
    ->setNonReusable();
  $user = User::create([
    'name' => 'Someone',
    'mail' => 'hi@example.com',
  ]);
  if ($permissions) {
    foreach ($permissions as $permission) {
      $this->role
        ->grantPermission($permission);
    }
    $this->role
      ->save();
  }
  $user->addRole($this->role
    ->id())
    ->save();
  if ($parent_access !== NULL) {
    $parent_entity = $this->prophesize(AccessibleInterface::class);
    $expected_parent_result = new $parent_access();
    $parent_entity->access($operation, $user, TRUE)
      ->willReturn($expected_parent_result)
      ->shouldBeCalled();
    $this->blockEntity
      ->setAccessDependency($parent_entity->reveal());
  }
  $this->blockEntity
    ->save();
  // Reload a previous revision.
  if ($loadRevisionId !== NULL) {
    $this->blockEntity = $entityStorage->loadRevision($loadRevisionId);
  }
  $result = $this->accessControlHandler
    ->access($this->blockEntity, $operation, $user, TRUE);
  $this->assertInstanceOf($expected_access, $result);
  if ($expected_access_message !== NULL) {
    $this->assertInstanceOf(AccessResultReasonInterface::class, $result);
    $this->assertEquals($expected_access_message, $result->getReason());
  }
}

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