WorkspaceInformationTest.php

Same filename and directory in other branches
  1. 10 core/modules/workspaces/tests/src/Kernel/WorkspaceInformationTest.php

Namespace

Drupal\Tests\workspaces\Kernel

File

core/modules/workspaces/tests/src/Kernel/WorkspaceInformationTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\Tests\workspaces\Kernel;

use Drupal\Core\Entity\EntityStorageException;
use Drupal\KernelTests\KernelTestBase;
use Drupal\Tests\user\Traits\UserCreationTrait;
use Drupal\workspaces\Entity\Handler\IgnoredWorkspaceHandler;
use Drupal\workspaces\Entity\Workspace;
use Drupal\workspaces_test\EntityTestRevPubWorkspaceHandler;

/**
 * Tests the workspace information service.
 *
 * @coversDefaultClass \Drupal\workspaces\WorkspaceInformation
 *
 * @group workspaces
 */
class WorkspaceInformationTest extends KernelTestBase {
    use UserCreationTrait;
    use WorkspaceTestTrait;
    
    /**
     * The entity type manager.
     *
     * @var \Drupal\Core\Entity\EntityTypeManagerInterface
     */
    protected $entityTypeManager;
    
    /**
     * The workspace information service.
     *
     * @var \Drupal\wse\Core\WorkspaceInformationInterface
     */
    protected $workspaceInformation;
    
    /**
     * The state store.
     *
     * @var \Drupal\Core\State\StateInterface
     */
    protected $state;
    
    /**
     * {@inheritdoc}
     */
    protected static $modules = [
        'entity_test',
        'user',
        'workspaces',
        'workspaces_test',
    ];
    
    /**
     * {@inheritdoc}
     */
    protected function setUp() : void {
        parent::setUp();
        $this->entityTypeManager = \Drupal::entityTypeManager();
        $this->workspaceInformation = \Drupal::service('workspaces.information');
        $this->state = \Drupal::state();
        $this->installEntitySchema('entity_test');
        $this->installEntitySchema('entity_test_rev');
        $this->installEntitySchema('entity_test_revpub');
        $this->installEntitySchema('workspace');
        $this->installSchema('workspaces', [
            'workspace_association',
        ]);
        // Create a new workspace and activate it.
        Workspace::create([
            'id' => 'stage',
            'label' => 'Stage',
        ])->save();
        $this->switchToWorkspace('stage');
    }
    
    /**
     * Tests fully supported entity types.
     */
    public function testSupportedEntityTypes() : void {
        // Check a supported entity type.
        $entity = $this->entityTypeManager
            ->getStorage('entity_test_revpub')
            ->create();
        $this->assertTrue($this->workspaceInformation
            ->isEntitySupported($entity));
        $this->assertTrue($this->workspaceInformation
            ->isEntityTypeSupported($entity->getEntityType()));
        $this->assertFalse($this->workspaceInformation
            ->isEntityIgnored($entity));
        $this->assertFalse($this->workspaceInformation
            ->isEntityTypeIgnored($entity->getEntityType()));
        // Check that supported entity types are tracked in a workspace. This entity
        // is published by default, so the second revision will be tracked.
        $entity->save();
        $this->assertWorkspaceAssociation([
            'stage' => [
                2,
            ],
        ], 'entity_test_revpub');
    }
    
    /**
     * Tests an entity type with a custom workspace handler.
     */
    public function testCustomSupportEntityTypes() : void {
        $entity_type = clone $this->entityTypeManager
            ->getDefinition('entity_test_revpub');
        $entity_type->setHandlerClass('workspace', EntityTestRevPubWorkspaceHandler::class);
        $this->state
            ->set('entity_test_revpub.entity_type', $entity_type);
        $this->entityTypeManager
            ->clearCachedDefinitions();
        $entity = $this->entityTypeManager
            ->getStorage('entity_test_revpub')
            ->create([
            'type' => 'supported_bundle',
        ]);
        $this->assertTrue($this->workspaceInformation
            ->isEntitySupported($entity));
        $this->assertTrue($this->workspaceInformation
            ->isEntityTypeSupported($entity->getEntityType()));
        $this->assertFalse($this->workspaceInformation
            ->isEntityIgnored($entity));
        $this->assertFalse($this->workspaceInformation
            ->isEntityTypeIgnored($entity->getEntityType()));
        // Check that supported entity types are tracked in a workspace. This entity
        // is published by default, so the second revision will be tracked.
        $entity->save();
        $this->assertWorkspaceAssociation([
            'stage' => [
                2,
            ],
        ], 'entity_test_revpub');
        $entity = $this->entityTypeManager
            ->getStorage('entity_test_revpub')
            ->create([
            'type' => 'ignored_bundle',
        ]);
        $this->assertFalse($this->workspaceInformation
            ->isEntitySupported($entity));
        $this->assertTrue($this->workspaceInformation
            ->isEntityTypeSupported($entity->getEntityType()));
        $this->assertTrue($this->workspaceInformation
            ->isEntityIgnored($entity));
        $this->assertFalse($this->workspaceInformation
            ->isEntityTypeIgnored($entity->getEntityType()));
        // Check that an ignored entity can be saved, but won't be tracked.
        $entity->save();
        $this->assertWorkspaceAssociation([
            'stage' => [
                2,
            ],
        ], 'entity_test_revpub');
    }
    
    /**
     * Tests ignored entity types.
     */
    public function testIgnoredEntityTypes() : void {
        $entity_type = clone $this->entityTypeManager
            ->getDefinition('entity_test_rev');
        $entity_type->setHandlerClass('workspace', IgnoredWorkspaceHandler::class);
        $this->state
            ->set('entity_test_rev.entity_type', $entity_type);
        $this->entityTypeManager
            ->clearCachedDefinitions();
        // Check an ignored entity type. CRUD operations for an ignored entity type
        // are allowed in a workspace, but their revisions are not tracked.
        $entity = $this->entityTypeManager
            ->getStorage('entity_test_rev')
            ->create();
        $this->assertTrue($this->workspaceInformation
            ->isEntityIgnored($entity));
        $this->assertTrue($this->workspaceInformation
            ->isEntityTypeIgnored($entity->getEntityType()));
        $this->assertFalse($this->workspaceInformation
            ->isEntitySupported($entity));
        $this->assertFalse($this->workspaceInformation
            ->isEntityTypeSupported($entity->getEntityType()));
        // Check that ignored entity types are not tracked in a workspace.
        $entity->save();
        $this->assertWorkspaceAssociation([
            'stage' => [],
        ], 'entity_test_rev');
    }
    
    /**
     * Tests unsupported entity types.
     */
    public function testUnsupportedEntityTypes() : void {
        // Check an unsupported entity type.
        $entity_test = $this->entityTypeManager
            ->getDefinition('entity_test');
        $this->assertFalse($entity_test->hasHandlerClass('workspace'));
        $entity = $this->entityTypeManager
            ->getStorage('entity_test')
            ->create();
        $this->assertFalse($this->workspaceInformation
            ->isEntitySupported($entity));
        $this->assertFalse($this->workspaceInformation
            ->isEntityTypeSupported($entity_test));
        $this->assertFalse($this->workspaceInformation
            ->isEntityIgnored($entity));
        $this->assertFalse($this->workspaceInformation
            ->isEntityTypeIgnored($entity_test));
        // Check that unsupported entity types can not be saved in a workspace.
        $this->expectException(EntityStorageException::class);
        $this->expectExceptionMessage('This entity can only be saved in the default workspace.');
        $entity->save();
    }

}

Classes

Title Deprecated Summary
WorkspaceInformationTest Tests the workspace information service.

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