function WorkspaceEntityRepositoryTest::testGetActive

Tests retrieving active variants in a workspace.

@covers \Drupal\Core\Entity\EntityRepository::getActive
@covers \Drupal\Core\Entity\EntityRepository::getActiveMultiple

File

core/modules/workspaces/tests/src/Kernel/WorkspaceEntityRepositoryTest.php, line 75

Class

WorkspaceEntityRepositoryTest
Tests the entity repository integration for workspaces.

Namespace

Drupal\Tests\workspaces\Kernel

Code

public function testGetActive() : void {
  $en_contexts = [
    'langcode' => 'en',
  ];
  $ro_contexts = [
    'langcode' => 'ro',
  ];
  // Check that the correct active variant is returned for a non-translatable
  // revisionable entity.
  $entity_type_id = 'entity_test_revpub';
  $storage = $this->entityTypeManager
    ->getStorage($entity_type_id);
  $values = [
    'name' => $this->randomString(),
  ];
  $entity = $storage->create($values);
  $storage->save($entity);
  // Create revisions in two workspaces, then another one in Live.
  $this->switchToWorkspace('ham');
  $ham_revision = $storage->createRevision($entity);
  $storage->save($ham_revision);
  $active = $this->entityRepository
    ->getActive($entity_type_id, $entity->id(), $en_contexts);
  $this->assertSame($ham_revision->getLoadedRevisionId(), $active->getLoadedRevisionId());
  // Check that the active variant in Live is still the default revision.
  $this->switchToLive();
  $active = $this->entityRepository
    ->getActive($entity_type_id, $entity->id(), $en_contexts);
  $this->assertSame($entity->getLoadedRevisionId(), $active->getLoadedRevisionId());
  $this->switchToWorkspace('cheese');
  $cheese_revision = $storage->createRevision($entity);
  $storage->save($cheese_revision);
  $active = $this->entityRepository
    ->getActive($entity_type_id, $entity->id(), $en_contexts);
  $this->assertSame($cheese_revision->getLoadedRevisionId(), $active->getLoadedRevisionId());
  $this->switchToLive();
  $live_revision = $storage->createRevision($entity);
  $storage->save($live_revision);
  $active = $this->entityRepository
    ->getActive($entity_type_id, $entity->id(), $en_contexts);
  $this->assertSame($live_revision->getLoadedRevisionId(), $active->getLoadedRevisionId());
  // Switch back to the two workspaces and check that workspace-specific
  // revision are returned even when there's a newer revision in Live.
  $this->switchToWorkspace('ham');
  $active = $this->entityRepository
    ->getActive($entity_type_id, $entity->id(), $en_contexts);
  $this->assertSame($ham_revision->getLoadedRevisionId(), $active->getLoadedRevisionId());
  $this->switchToWorkspace('cheese');
  $active = $this->entityRepository
    ->getActive($entity_type_id, $entity->id(), $en_contexts);
  $this->assertSame($cheese_revision->getLoadedRevisionId(), $active->getLoadedRevisionId());
  // Check that a revision created in a workspace does not leak into other
  // workspaces.
  $entity_2 = $storage->create([
    'name' => $this->randomString(),
  ]);
  $storage->save($entity_2);
  // Create a new revision in a workspace.
  $this->switchToWorkspace('ham');
  $ham_revision = $storage->createRevision($entity_2);
  $storage->save($ham_revision);
  $active = $this->entityRepository
    ->getActive($entity_type_id, $entity_2->id(), $en_contexts);
  $this->assertSame($ham_revision->getLoadedRevisionId(), $active->getLoadedRevisionId());
  // Check that the default revision is returned in another workspace.
  $this->switchToWorkspace('cheese');
  $active = $this->entityRepository
    ->getActive($entity_type_id, $entity_2->id(), $en_contexts);
  $this->assertSame($entity_2->getLoadedRevisionId(), $active->getLoadedRevisionId());
  // Check that the correct active variant is returned for a translatable and
  // revisionable entity.
  $this->switchToLive();
  $entity_type_id = 'entity_test_mulrevpub';
  $storage = $this->entityTypeManager
    ->getStorage($entity_type_id);
  $values = [
    'name' => $this->randomString(),
  ];
  $initial_revision = $storage->create($values);
  $storage->save($initial_revision);
  $revision_translation = $initial_revision->addTranslation('ro', $values);
  $revision_translation = $storage->createRevision($revision_translation);
  $storage->save($revision_translation);
  // Add a translation in a workspace.
  $this->switchToWorkspace('ham');
  $ham_revision_ro = $storage->createRevision($revision_translation);
  $storage->save($ham_revision_ro);
  $active = $this->entityRepository
    ->getActive($entity_type_id, $entity->id(), $ro_contexts);
  $this->assertSame($ham_revision_ro->getLoadedRevisionId(), $active->getLoadedRevisionId());
  $this->assertSame($ham_revision_ro->language()
    ->getId(), $active->language()
    ->getId());
  // Add a new translation in another workspace.
  $this->switchToWorkspace('cheese');
  $cheese_revision_ro = $storage->createRevision($revision_translation);
  $storage->save($cheese_revision_ro);
  $active = $this->entityRepository
    ->getActive($entity_type_id, $entity->id(), $ro_contexts);
  $this->assertSame($cheese_revision_ro->getLoadedRevisionId(), $active->getLoadedRevisionId());
  $this->assertSame($cheese_revision_ro->language()
    ->getId(), $active->language()
    ->getId());
  // Add a new translations in Live.
  $this->switchToLive();
  $live_revision_ro = $storage->createRevision($revision_translation);
  $storage->save($live_revision_ro);
  $active = $this->entityRepository
    ->getActive($entity_type_id, $entity->id(), $ro_contexts);
  $this->assertSame($live_revision_ro->getLoadedRevisionId(), $active->getLoadedRevisionId());
  $this->assertSame($live_revision_ro->language()
    ->getId(), $active->language()
    ->getId());
  $this->switchToWorkspace('ham');
  $active = $this->entityRepository
    ->getActive($entity_type_id, $entity->id(), $ro_contexts);
  $this->assertSame($ham_revision_ro->getLoadedRevisionId(), $active->getLoadedRevisionId());
  $this->assertSame($ham_revision_ro->language()
    ->getId(), $active->language()
    ->getId());
  $this->switchToWorkspace('cheese');
  $active = $this->entityRepository
    ->getActive($entity_type_id, $entity->id(), $ro_contexts);
  $this->assertSame($cheese_revision_ro->getLoadedRevisionId(), $active->getLoadedRevisionId());
  $this->assertSame($cheese_revision_ro->language()
    ->getId(), $active->language()
    ->getId());
}

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