entity_type_access_conditions-1.0.1/tests/src/Kernel/MediaAccessConditionsTest.php

tests/src/Kernel/MediaAccessConditionsTest.php
<?php

declare(strict_types=1);

namespace Drupal\Tests\entity_type_access_conditions\Kernel;

use Drupal\media\Entity\MediaType;
use Drupal\Tests\media\Traits\MediaTypeCreationTrait;

/**
 * Tests access conditions for Media entities.
 *
 * @group entity_type_access_conditions
 */
class MediaAccessConditionsTest extends EntityTypeAccessTestBase {

  use MediaTypeCreationTrait;

  /**
   * The media type used for testing.
   *
   * @var \Drupal\media\Entity\MediaType
   */
  protected $mediaType;

  /**
   * The access handler.
   *
   * @var \Drupal\Core\Entity\EntityAccessControlHandlerInterface
   */
  protected $mediaAccessHandler;

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();
    // Create a media type for testing.
    $this->mediaType = $this->createMediaType('test', ['id' => 'test_media_type', '']);
    $this->accessHandler = $this->container->get('entity_type.manager')->getAccessControlHandler('media_type');
    $this->mediaAccessHandler = $this->container->get('entity_type.manager')->getAccessControlHandler('media');
    $this->revokePermissionsFromTestRole(['bypass entity type access conditions']);
    $administer_perm = 'administer media types';
    $this->grantPermissionsToTestRole([$administer_perm]);
  }

  /**
   * Tests access to the media add form.
   */
  public function testMediaCreateAccess(): void {
    $media_add_route_params = ['media_type' => $this->mediaType->id()];
    $create_perm = 'create ' . $this->mediaType->id() . ' media';

    // 1. Grant permission to create media, condition not set.
    $this->grantPermissionsToTestRole([$create_perm, 'access media overview']);
    $this->assertTrue($this->checkRouteAccess('entity.media.add_form', $media_add_route_params)->isAllowed(), 'User should be able to access media add form with permission.');

    // 2. Apply condition, set to met.
    $this->clearConditionsFromEntityTypeConfig('media_type', $this->mediaType->id());
    $this->applyConditionToEntityTypeConfig('media_type', $this->mediaType->id(), 'test_condition', ['condition_met' => TRUE]);
    $this->mediaType = MediaType::load($this->mediaType->id());
    $this->mediaAccessHandler->resetCache();
    $this->assertTrue($this->checkRouteAccess('entity.media.add_form', $media_add_route_params)->isAllowed(), 'User should be able to access media add form when condition is met.');

    // 3. Set condition to not met.
    $this->clearConditionsFromEntityTypeConfig('media_type', $this->mediaType->id());
    $this->applyConditionToEntityTypeConfig('media_type', $this->mediaType->id(), 'test_condition', ['condition_met' => FALSE]);
    $this->mediaType = MediaType::load($this->mediaType->id());
    $this->mediaAccessHandler->resetCache();
    $this->assertFalse($this->checkRouteAccess('entity.media.add_form', $media_add_route_params)->isAllowed(), 'User should NOT be able to access media add form when condition is not met.');

    // 4. Clear conditions.
    $this->clearConditionsFromEntityTypeConfig('media_type', $this->mediaType->id());
    $this->mediaType = MediaType::load($this->mediaType->id());
    $this->mediaAccessHandler->resetCache();
    $this->assertTrue($this->checkRouteAccess('entity.media.add_form', $media_add_route_params)->isAllowed(), 'User should be able to access media add form after conditions are cleared.');
  }

  /**
   * Tests access to the media edit form.
   */
  public function testMediaEditAccess(): void {
    // 1. Update media type, condition not set.
    $this->assertTrue($this->mediaType->access('update', $this->testUser), 'User should have update access to their own media with permission.');

    // 2. Apply condition, set to met.
    $this->clearConditionsFromEntityTypeConfig('media_type', $this->mediaType->id());
    $this->applyConditionToEntityTypeConfig('media_type', $this->mediaType->id(), 'test_condition', ['condition_met' => TRUE]);
    $this->mediaType = MediaType::load($this->mediaType->id());
    $this->accessHandler->resetCache();
    $this->assertTrue($this->mediaType->access('update', $this->testUser), 'User should have update access when condition is met.');

    // 3. Set condition to not met.
    $this->clearConditionsFromEntityTypeConfig('media_type', $this->mediaType->id());
    $this->applyConditionToEntityTypeConfig('media_type', $this->mediaType->id(), 'test_condition', ['condition_met' => FALSE]);
    $this->mediaType = MediaType::load($this->mediaType->id());
    $this->accessHandler->resetCache();
    $this->assertFalse($this->mediaType->access('update', $this->testUser), 'User should NOT have update access when condition is not met.');

    // 4. Clear conditions.
    $this->clearConditionsFromEntityTypeConfig('media_type', $this->mediaType->id());
    $this->mediaType = MediaType::load($this->mediaType->id());
    $this->accessHandler->resetCache();
    $this->assertTrue($this->mediaType->access('update', $this->testUser), 'User should have update access after conditions are cleared.');
  }

  /**
   * Tests access to the media delete form.
   */
  public function testMediaDeleteAccess(): void {
    // 1. Delete media type, condition not set.
    $this->assertTrue($this->mediaType->access('delete', $this->testUser), 'User should have delete access to their own media with permission.');

    // 2. Apply condition, set to met.
    $this->clearConditionsFromEntityTypeConfig('media_type', $this->mediaType->id());
    $this->applyConditionToEntityTypeConfig('media_type', $this->mediaType->id(), 'test_condition', ['condition_met' => TRUE]);
    $this->mediaType = MediaType::load($this->mediaType->id());
    $this->accessHandler->resetCache();
    $this->assertTrue($this->mediaType->access('delete', $this->testUser), 'User should have delete access when condition is met.');

    // 3. Set condition to not met.
    $this->clearConditionsFromEntityTypeConfig('media_type', $this->mediaType->id());
    $this->applyConditionToEntityTypeConfig('media_type', $this->mediaType->id(), 'test_condition', ['condition_met' => FALSE]);
    $this->mediaType = MediaType::load($this->mediaType->id());
    $this->accessHandler->resetCache();
    $this->assertFalse($this->mediaType->access('delete', $this->testUser), 'User should NOT have delete access when condition is not met.');

    // 4. Clear conditions.
    $this->clearConditionsFromEntityTypeConfig('media_type', $this->mediaType->id());
    $this->mediaType = MediaType::load($this->mediaType->id());
    $this->accessHandler->resetCache();
    $this->assertTrue($this->mediaType->access('delete', $this->testUser), 'User should have delete access after conditions are cleared.');
  }

}

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

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