Unverified Commit 37e4d4b3 authored by Alex Pott's avatar Alex Pott
Browse files

Issue #3027598 by amateescu, pmelab, alexpott, larowlan: Omit workspaces...

Issue #3027598 by amateescu, pmelab, alexpott, larowlan: Omit workspaces entity presave and predelete hooks for internal entities
parent a54ef47f
Loading
Loading
Loading
Loading
+29 −6
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@

use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Entity\RevisionableInterface;
use Drupal\Core\Form\FormStateInterface;
@@ -116,9 +117,10 @@ public function entityPreload(array $ids, $entity_type_id) {
  public function entityPresave(EntityInterface $entity) {
    $entity_type = $entity->getEntityType();

    // Only run if this is not an entity type provided by the Workspaces module
    // and we are in a non-default workspace
    if ($entity_type->getProvider() === 'workspaces' || $this->workspaceManager->getActiveWorkspace()->isDefaultWorkspace()) {
    // Only run if we are not dealing with an entity type provided by the
    // Workspaces module, an internal entity type or if we are in a non-default
    // workspace.
    if ($this->shouldSkipPreOperations($entity_type)) {
      return;
    }

@@ -224,9 +226,10 @@ public function entityUpdate(EntityInterface $entity) {
  public function entityPredelete(EntityInterface $entity) {
    $entity_type = $entity->getEntityType();

    // Only run if this is not an entity type provided by the Workspaces module
    // and we are in a non-default workspace
    if ($entity_type->getProvider() === 'workspaces' || $this->workspaceManager->getActiveWorkspace()->isDefaultWorkspace()) {
    // Only run if we are not dealing with an entity type provided by the
    // Workspaces module, an internal entity type or if we are in a non-default
    // workspace.
    if ($this->shouldSkipPreOperations($entity_type)) {
      return;
    }

@@ -340,4 +343,24 @@ public static function entityFormEntityBuild($entity_type_id, RevisionableInterf
    $entity->isDefaultRevision(FALSE);
  }

  /**
   * Determines whether we need to react on pre-save or pre-delete operations.
   *
   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
   *   The entity type to check.
   *
   * @return bool
   *   Returns TRUE if the pre-save or pre-delete entity operations should not
   *   be altered in the current request, FALSE otherwise.
   */
  protected function shouldSkipPreOperations(EntityTypeInterface $entity_type) {
    // We should not react on pre-save and pre-delete entity operations if one
    // of the following conditions are met:
    // - the entity type is provided by the Workspaces module;
    // - the entity type is internal, which means that it should not affect
    //   anything in the default (Live) workspace;
    // - we are in the default workspace.
    return $entity_type->getProvider() === 'workspaces' || $entity_type->isInternal() || $this->workspaceManager->getActiveWorkspace()->isDefaultWorkspace();
  }

}
+90 −22
Original line number Diff line number Diff line
@@ -4,7 +4,6 @@

use Drupal\Core\Entity\EntityStorageException;
use Drupal\Core\Form\FormState;
use Drupal\entity_test\Entity\EntityTestMulRev;
use Drupal\entity_test\Entity\EntityTestMulRevPub;
use Drupal\KernelTests\KernelTestBase;
use Drupal\system\Form\SiteInformationForm;
@@ -75,6 +74,7 @@ protected function setUp() {

    $this->installEntitySchema('entity_test_mulrev');
    $this->installEntitySchema('entity_test_mulrevpub');
    $this->installEntitySchema('entity_test_no_label');
    $this->installEntitySchema('node');
    $this->installEntitySchema('user');

@@ -457,38 +457,106 @@ public function testEntityQueryRelationship() {
  }

  /**
   * Tests CRUD operations for unsupported entity types.
   * Tests CREATE operations for unsupported entity types.
   *
   * @dataProvider providerTestAllowedEntityCrudInNonDefaultWorkspace
   */
  public function testDisallowedEntityCreateInNonDefaultWorkspace($entity_type_id, $allowed) {
    $this->initializeWorkspacesModule();
    /** @var \Drupal\Core\Entity\ContentEntityStorageInterface $storage */
    $storage = $this->entityTypeManager->getStorage($entity_type_id);

    // Switch to a non-default workspace and check whether creating a new entity
    // is allowed.
    $this->switchToWorkspace('stage');

    $entity = $storage->createWithSampleValues($entity_type_id);
    if ($entity_type_id === 'workspace') {
      $entity->id = 'test';
    }

    if (!$allowed) {
      $this->setExpectedException(EntityStorageException::class, 'This entity can only be saved in the default workspace.');
    }
    $entity->save();
  }

  /**
   * Tests UPDATE operations for unsupported entity types.
   *
   * @dataProvider providerTestAllowedEntityCrudInNonDefaultWorkspace
   */
  public function testDisallowedEntityCRUDInNonDefaultWorkspace() {
  public function testDisallowedEntityUpdateInNonDefaultWorkspace($entity_type_id, $allowed) {
    $this->initializeWorkspacesModule();
    /** @var \Drupal\Core\Entity\ContentEntityStorageInterface $storage */
    $storage = $this->entityTypeManager->getStorage($entity_type_id);

    // Create an unsupported entity type in the default workspace.
    // Create the entity in the default workspace.
    $this->switchToWorkspace('live');
    $entity_test = EntityTestMulRev::create([
      'name' => 'live entity_test_mulrev',
    ]);
    $entity_test->save();
    $entity = $storage->createWithSampleValues($entity_type_id);
    if ($entity_type_id === 'workspace') {
      $entity->id = 'test';
    }
    $entity->save();

    // Switch to a non-default workspace and check that any entity type CRUD are
    // not allowed.
    // Switch to a non-default workspace and check whether updating the entity
    // is allowed.
    $this->switchToWorkspace('stage');

    // Check updating an existing entity.
    $entity_test->name->value = 'stage entity_test_mulrev';
    $entity_test->setNewRevision(TRUE);
    $this->setExpectedException(EntityStorageException::class, 'This entity can only be saved in the default workspace.');
    $entity_test->save();
    $entity->created->value = 1;

    // Check saving a new entity.
    $new_entity_test = EntityTestMulRev::create([
      'name' => 'stage entity_test_mulrev',
    ]);
    if (!$allowed) {
      $this->setExpectedException(EntityStorageException::class, 'This entity can only be saved in the default workspace.');
    $new_entity_test->save();
    }
    $entity->save();
  }

  /**
   * Tests DELETE operations for unsupported entity types.
   *
   * @dataProvider providerTestAllowedEntityCrudInNonDefaultWorkspace
   */
  public function testDisallowedEntityDeleteInNonDefaultWorkspace($entity_type_id, $allowed) {
    $this->initializeWorkspacesModule();
    /** @var \Drupal\Core\Entity\ContentEntityStorageInterface $storage */
    $storage = $this->entityTypeManager->getStorage($entity_type_id);

    // Create the entity in the default workspace.
    $this->switchToWorkspace('live');
    $entity = $storage->createWithSampleValues($entity_type_id);
    if ($entity_type_id === 'workspace') {
      $entity->id = 'test';
    }
    $entity->save();

    // Check deleting an existing entity.
    // Switch to a non-default workspace and check whether deleting the entity
    // is allowed.
    $this->switchToWorkspace('stage');

    if (!$allowed) {
      $this->setExpectedException(EntityStorageException::class, 'This entity can only be deleted in the default workspace.');
    $entity_test->delete();
    }
    $entity->delete();
  }

  /**
   * Data provider for allowed entity CRUD operations.
   */
  public function providerTestAllowedEntityCrudInNonDefaultWorkspace() {
    return [
      'workspace-provided non-internal entity type' => [
        'entity_type_id' => 'workspace',
        'allowed' => TRUE,
      ],
      'internal entity type' => [
        'entity_type_id' => 'entity_test_no_label',
        'allowed' => TRUE,
      ],
      'non-internal entity type' => [
        'entity_type_id' => 'entity_test_mulrev',
        'allowed' => FALSE,
      ],
    ];
  }

  /**