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.');
}
}
