hook_event_dispatcher-8.x-2.04/modules/core_event_dispatcher/tests/src/Kernel/Entity/EntityFieldAccessEventTest.php

modules/core_event_dispatcher/tests/src/Kernel/Entity/EntityFieldAccessEventTest.php
<?php

namespace Drupal\Tests\core_event_dispatcher\Kernel\Entity;

use Drupal\Core\Access\AccessResult;
use Drupal\Core\Access\AccessResultInterface;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\core_event_dispatcher\EntityHookEvents;
use Drupal\core_event_dispatcher\Event\Entity\EntityFieldAccessEvent;
use Drupal\KernelTests\KernelTestBase;
use Drupal\Tests\hook_event_dispatcher\Kernel\ListenerTrait;

/**
 * Class EntityFieldAccessEventTest.
 *
 * @covers \Drupal\core_event_dispatcher\Event\Entity\EntityFieldAccessEvent
 *
 * @group hook_event_dispatcher
 * @group core_event_dispatcher
 */
class EntityFieldAccessEventTest extends KernelTestBase {

  use ListenerTrait;

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'entity_test',
    'hook_event_dispatcher',
    'core_event_dispatcher',
  ];

  /**
   * The entity operation.
   *
   * @var string
   */
  protected $operation;

  /**
   * The field definition.
   *
   * @var \Drupal\Core\Field\FieldDefinitionInterface|\PHPUnit\Framework\MockObject\MockObject
   */
  protected $fieldDefinition;

  /**
   * The field item list.
   *
   * @var \Drupal\Core\Field\FieldItemListInterface<\Drupal\Core\Field\FieldItemInterface>|\PHPUnit\Framework\MockObject\MockObject
   */
  protected $fieldItemList;

  /**
   * The access result.
   *
   * @var \Drupal\Core\Access\AccessResultInterface
   */
  protected $accessResult;

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();

    $this->operation = $this->randomMachineName();
    $this->fieldDefinition = $this->createMock(FieldDefinitionInterface::class);

    $this->fieldItemList = $this->createMock(FieldItemListInterface::class);
    $this->fieldItemList->method('defaultAccess')
      ->willReturn(AccessResult::neutral());
  }

  /**
   * Field access event without result set.
   *
   * @throws \Exception
   */
  public function testEntityFieldAccessEventWithoutResult(): void {
    $this->listen(EntityHookEvents::ENTITY_FIELD_ACCESS, 'onEntityFieldAccessEventWithoutResult');

    $accessControlHandler = $this->container->get('entity_type.manager')
      ->getAccessControlHandler('entity_test');
    $access = $accessControlHandler->fieldAccess($this->operation, $this->fieldDefinition, NULL, $this->fieldItemList, TRUE);
    $this->assertInstanceOf(AccessResultInterface::class, $access);
    $this->assertTrue($access->isNeutral());
  }

  /**
   * Callback for EntityFieldAccessEvent.
   *
   * @param \Drupal\core_event_dispatcher\Event\Entity\EntityFieldAccessEvent $event
   *   The event.
   */
  public function onEntityFieldAccessEventWithoutResult(EntityFieldAccessEvent $event): void {
    $this->assertEquals($this->operation, $event->getOperation());
    $this->assertSame($this->fieldDefinition, $event->getFieldDefinition());
    $this->assertTrue($event->getAccount()->isAnonymous());
    $this->assertSame($this->fieldItemList, $event->getItems());
  }

  /**
   * Field access event with result set.
   *
   * @dataProvider entityFieldAccessEventWithResultSetProvider
   *
   * @throws \Exception
   */
  public function testEntityFieldAccessEventWithResultSet(AccessResultInterface $accessResult): void {
    $this->listen(EntityHookEvents::ENTITY_FIELD_ACCESS, 'onEntityFieldAccessEventWithResultSet');

    $this->accessResult = $accessResult;

    $accessControlHandler = $this->container->get('entity_type.manager')
      ->getAccessControlHandler('entity_test');
    $access = $accessControlHandler->fieldAccess($this->operation, $this->fieldDefinition, NULL, $this->fieldItemList, TRUE);
    $this->assertInstanceOf(AccessResultInterface::class, $access);
    $this->assertEquals($accessResult->isNeutral(), $access->isNeutral());
    $this->assertEquals($accessResult->isAllowed(), $access->isAllowed());
    $this->assertEquals($accessResult->isForbidden(), $access->isForbidden());
  }

  /**
   * Callback for EntityFieldAccessEvent.
   *
   * @param \Drupal\core_event_dispatcher\Event\Entity\EntityFieldAccessEvent $event
   *   The event.
   */
  public function onEntityFieldAccessEventWithResultSet(EntityFieldAccessEvent $event): void {
    $event->setAccessResult($this->accessResult);
  }

  /**
   * Data provider for testEntityFieldAccessEventWithResultSet.
   *
   * @return array[]
   *   The provided data.
   *
   * @see \Drupal\Tests\core_event_dispatcher\Kernel\Entity\EntityFieldAccessEventTest::testEntityFieldAccessEventWithResultSet()
   */
  public static function entityFieldAccessEventWithResultSetProvider(): array {
    return [
      'allowed access result' => [AccessResult::allowed()],
      'forbidden access result' => [AccessResult::forbidden()],
    ];
  }

  /**
   * Field access event with no items.
   *
   * @throws \Exception
   */
  public function testEntityFieldAccessEventWithNoItems(): void {
    $this->listen(EntityHookEvents::ENTITY_FIELD_ACCESS, 'onEntityFieldAccessEventWithNoItems');

    $accessControlHandler = $this->container->get('entity_type.manager')
      ->getAccessControlHandler('entity_test');
    $accessControlHandler->fieldAccess($this->operation, $this->fieldDefinition, NULL, NULL, TRUE);

  }

  /**
   * Callback for EntityFieldAccessEvent.
   *
   * @param \Drupal\core_event_dispatcher\Event\Entity\EntityFieldAccessEvent $event
   *   The event.
   */
  public function onEntityFieldAccessEventWithNoItems(EntityFieldAccessEvent $event): void {
    $this->assertNull($event->getItems());
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc