function WorkspaceMergerTest::testWorkspaceMerger

Same name in other branches
  1. 9 core/modules/workspaces/tests/src/Kernel/WorkspaceMergerTest.php \Drupal\Tests\workspaces\Kernel\WorkspaceMergerTest::testWorkspaceMerger()
  2. 8.9.x core/modules/workspaces/tests/src/Kernel/WorkspaceMergerTest.php \Drupal\Tests\workspaces\Kernel\WorkspaceMergerTest::testWorkspaceMerger()
  3. 10 core/modules/workspaces/tests/src/Kernel/WorkspaceMergerTest.php \Drupal\Tests\workspaces\Kernel\WorkspaceMergerTest::testWorkspaceMerger()

Tests workspace merging.

@covers ::merge @covers ::getNumberOfChangesOnSource @covers ::getNumberOfChangesOnTarget @covers ::getDifferringRevisionIdsOnSource @covers ::getDifferringRevisionIdsOnTarget

File

core/modules/workspaces/tests/src/Kernel/WorkspaceMergerTest.php, line 81

Class

WorkspaceMergerTest
Tests workspace merging.

Namespace

Drupal\Tests\workspaces\Kernel

Code

public function testWorkspaceMerger() : void {
    $this->initializeWorkspacesModule();
    $this->createWorkspaceHierarchy();
    // Generate content in the workspace hierarchy with the following structure:
    // Live:
    // - Test article 1 - live
    //
    // Stage:
    // - Test article 2 - stage
    //
    // Dev:
    // - Test article 2 - stage
    // - Test article 3 - dev
    //
    // Local 1:
    // - Test article 2 - stage
    // - Test article 3 - dev
    // - Test article 4 - local_1
    //
    // Local 2:
    // - Test article 2 - stage
    // - Test article 3 - dev
    //
    // Note that the contents of each workspace are inherited automatically in
    // each of its descendants.
    $this->createNode([
        'title' => 'Test article 1 - live',
        'type' => 'article',
    ]);
    // This creates revisions 2 and 3. Revision 2 is an unpublished default
    // revision (which is also available in Live), and revision 3 is a published
    // pending revision that is available in Stage and all its descendants.
    $this->switchToWorkspace('stage');
    $this->createNode([
        'title' => 'Test article 2 - stage',
        'type' => 'article',
    ]);
    $expected_workspace_association = [
        'stage' => [
            3,
        ],
        'dev' => [
            3,
        ],
        'local_1' => [
            3,
        ],
        'local_2' => [
            3,
        ],
        'qa' => [],
    ];
    $this->assertWorkspaceAssociation($expected_workspace_association, 'node');
    // Create the second test article in Dev. This creates revisions 4 and 5.
    // Revision 4 is default and unpublished, and revision 5 is now being
    // tracked in Dev and its descendants.
    $this->switchToWorkspace('dev');
    $this->createNode([
        'title' => 'Test article 3 - dev',
        'type' => 'article',
    ]);
    $expected_workspace_association = [
        'stage' => [
            3,
        ],
        'dev' => [
            3,
            5,
        ],
        'local_1' => [
            3,
            5,
        ],
        'local_2' => [
            3,
            5,
        ],
        'qa' => [],
    ];
    $this->assertWorkspaceAssociation($expected_workspace_association, 'node');
    // Create the third article in Local 1. This creates revisions 6 and 7.
    // Revision 6 is default and unpublished, and revision 7 is now being
    // tracked in the Local 1.
    $this->switchToWorkspace('local_1');
    $this->createNode([
        'title' => 'Test article 4 - local_1',
        'type' => 'article',
    ]);
    $expected_workspace_association = [
        'stage' => [
            3,
        ],
        'dev' => [
            3,
            5,
        ],
        'local_1' => [
            3,
            5,
            7,
        ],
        'local_2' => [
            3,
            5,
        ],
        'qa' => [],
    ];
    $this->assertWorkspaceAssociation($expected_workspace_association, 'node');
    
    /** @var \Drupal\workspaces\WorkspaceMergerInterface $workspace_merger */
    $workspace_merger = \Drupal::service('workspaces.operation_factory')->getMerger($this->workspaces['local_1'], $this->workspaces['dev']);
    // Check that there is no content in Dev that's not also in Local 1.
    $this->assertEmpty($workspace_merger->getDifferringRevisionIdsOnTarget());
    $this->assertEquals(0, $workspace_merger->getNumberOfChangesOnTarget());
    // Check that there is only one node in Local 1 that's not available in Dev,
    // revision 7 created above for the fourth test article.
    $expected = [
        'node' => [
            7 => 4,
        ],
    ];
    $this->assertEquals($expected, $workspace_merger->getDifferringRevisionIdsOnSource());
    $this->assertEquals(1, $workspace_merger->getNumberOfChangesOnSource());
    // Merge the contents of Local 1 into Dev, and check that Dev, Local 1 and
    // Local 2 have the same content.
    $workspace_merger->merge();
    $this->assertEmpty($workspace_merger->getDifferringRevisionIdsOnTarget());
    $this->assertEquals(0, $workspace_merger->getNumberOfChangesOnTarget());
    $this->assertEmpty($workspace_merger->getDifferringRevisionIdsOnSource());
    $this->assertEquals(0, $workspace_merger->getNumberOfChangesOnSource());
    $this->switchToWorkspace('dev');
    $expected_workspace_association = [
        'stage' => [
            3,
        ],
        'dev' => [
            3,
            5,
            7,
        ],
        'local_1' => [
            3,
            5,
            7,
        ],
        'local_2' => [
            3,
            5,
            7,
        ],
        'qa' => [],
    ];
    $this->assertWorkspaceAssociation($expected_workspace_association, 'node');
    $workspace_merger = \Drupal::service('workspaces.operation_factory')->getMerger($this->workspaces['local_1'], $this->workspaces['stage']);
    // Check that there is no content in Stage that's not also in Local 1.
    $this->assertEmpty($workspace_merger->getDifferringRevisionIdsOnTarget());
    $this->assertEquals(0, $workspace_merger->getNumberOfChangesOnTarget());
    // Check that the difference between Local 1 and Stage are the two revisions
    // for 'Test article 3 - dev' and 'Test article 4 - local_1'.
    $expected = [
        'node' => [
            5 => 3,
            7 => 4,
        ],
    ];
    $this->assertEquals($expected, $workspace_merger->getDifferringRevisionIdsOnSource());
    $this->assertEquals(2, $workspace_merger->getNumberOfChangesOnSource());
    // Check that Local 1 can not be merged directly into Stage, since it can
    // only be merged into its direct parent.
    $this->expectException(\InvalidArgumentException::class);
    $this->expectExceptionMessage('The contents of a workspace can only be merged into its parent workspace.');
    $workspace_merger->merge();
}

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