You are here

public function PathAliasTest::testPathAlias in Multiversion 8

Test creating, loading, updating and deleting aliases.

File

tests/src/Functional/PathAliasTest.php, line 41

Class

PathAliasTest
@group multiversion

Namespace

Drupal\Tests\multiversion\Functional

Code

public function testPathAlias() {

  /** @var \Drupal\Core\Path\AliasStorageInterface $alias_storage */
  $alias_storage = \Drupal::service('path.alias_storage');

  // Create a test workspace type.
  WorkspaceType::create([
    'id' => 'test',
    'label' => 'Test',
  ])
    ->save();

  // Create a live (default) and stage workspace.
  $live = Workspace::create([
    'type' => 'test',
    'machine_name' => 'live',
    'label' => 'Live',
  ]);
  $live
    ->save();
  $stage = Workspace::create([
    'type' => 'test',
    'machine_name' => 'stage',
    'label' => 'Stage',
  ]);
  $stage
    ->save();

  // Set live as the active workspace.
  \Drupal::service('workspace.manager')
    ->setActiveWorkspace($live);
  $alias = '/foo';
  $node1 = $this
    ->drupalCreateNode();
  $node1
    ->get('path')->alias = $alias;
  $node1
    ->save();
  $this
    ->assertEquals($alias, $node1
    ->get('path')->alias);
  $stored_alias = $alias_storage
    ->lookupPathAlias('/' . $node1
    ->toUrl()
    ->getInternalPath(), $node1
    ->language()
    ->getId());
  $this
    ->assertEquals($alias, $stored_alias);

  // Set stage as the active workspace.
  \Drupal::service('workspace.manager')
    ->setActiveWorkspace($stage);
  $stored_alias = $alias_storage
    ->lookupPathAlias('/' . $node1
    ->toUrl()
    ->getInternalPath(), $node1
    ->language()
    ->getId());
  $this
    ->assertFalse($stored_alias);

  // Create a new node on stage workspace with the same alias.
  $node2 = $this
    ->drupalCreateNode();
  $node2
    ->get('path')->alias = $alias;
  $node2
    ->save();
  $this
    ->assertEquals($alias, $node2
    ->get('path')->alias);
  $stored_alias = $alias_storage
    ->lookupPathAlias('/' . $node2
    ->toUrl()
    ->getInternalPath(), $node2
    ->language()
    ->getId());
  $this
    ->assertEquals($alias, $stored_alias);
  $this
    ->drupalGet($alias);
  $web_assert = $this
    ->assertSession();
  $web_assert
    ->statusCodeEquals(200);
  $web_assert
    ->pageTextNotContains($node1
    ->label());
  $web_assert
    ->pageTextContains($node2
    ->label());
  $this
    ->drupalGet('admin/config/search/path');
  $web_assert
    ->statusCodeEquals(200);
  $web_assert
    ->pageTextNotContains('/node/' . $node1
    ->id());
  $web_assert
    ->pageTextContains('/node/' . $node2
    ->id());

  // Set live as the active workspace.
  \Drupal::service('workspace.manager')
    ->setActiveWorkspace($live);
  $this
    ->drupalGet($alias);
  $web_assert
    ->statusCodeEquals(200);
  $web_assert
    ->pageTextNotContains($node2
    ->label());
  $web_assert
    ->pageTextContains($node1
    ->label());
  $this
    ->drupalGet('admin/config/search/path');
  $web_assert
    ->statusCodeEquals(200);
  $web_assert
    ->pageTextNotContains('/node/' . $node2
    ->id());
  $web_assert
    ->pageTextContains('/node/' . $node1
    ->id());

  // Delete node1.
  $node1
    ->delete();
  $this
    ->drupalGet($alias);
  $web_assert
    ->statusCodeEquals(404);
  $this
    ->drupalGet('admin/config/search/path');
  $web_assert
    ->statusCodeEquals(200);
  $web_assert
    ->pageTextNotContains('/node/' . $node2
    ->id());
  $web_assert
    ->pageTextNotContains('/node/' . $node1
    ->id());

  // Set stage as the active workspace.
  \Drupal::service('workspace.manager')
    ->setActiveWorkspace($stage);
  $this
    ->drupalGet($alias);
  $web_assert = $this
    ->assertSession();
  $web_assert
    ->statusCodeEquals(200);
  $web_assert
    ->pageTextNotContains($node1
    ->label());
  $web_assert
    ->pageTextContains($node2
    ->label());
  $this
    ->drupalGet('admin/config/search/path');
  $web_assert
    ->statusCodeEquals(200);
  $web_assert
    ->pageTextNotContains('/node/' . $node1
    ->id());
  $web_assert
    ->pageTextContains('/node/' . $node2
    ->id());

  //Set a new alias for node2.
  $alias2 = '/bar';
  $node2
    ->get('path')->alias = $alias2;
  $node2
    ->save();
  $this
    ->assertEquals($alias2, $node2
    ->get('path')->alias);
  $stored_alias = $alias_storage
    ->lookupPathAlias('/' . $node2
    ->toUrl()
    ->getInternalPath(), $node2
    ->language()
    ->getId());
  $this
    ->assertEquals($alias2, $stored_alias);
  $this
    ->drupalGet('admin/config/search/path');
  $web_assert
    ->statusCodeEquals(200);
  $web_assert
    ->pageTextNotContains('/node/' . $node1
    ->id());
  $web_assert
    ->pageTextContains('/node/' . $node2
    ->id());
  $web_assert
    ->pageTextContains($alias2);
  $session = $this
    ->getSession();
  $page = $session
    ->getPage();
  $page
    ->clickLink('Delete');
  $web_assert
    ->pageTextContains('Are you sure you want to delete path alias ' . $alias2 . '?');
  $page
    ->pressButton('Confirm');
  $this
    ->drupalGet($alias2);
  $web_assert = $this
    ->assertSession();
  $web_assert
    ->statusCodeEquals(404);
  $this
    ->drupalGet('admin/config/search/path');
  $web_assert
    ->statusCodeEquals(200);
  $web_assert
    ->pageTextNotContains('/node/' . $node2
    ->id());
  $web_assert
    ->pageTextNotContains('/node/' . $node1
    ->id());
  $stored_alias = $alias_storage
    ->lookupPathAlias('/' . $node2
    ->toUrl()
    ->getInternalPath(), $node2
    ->language()
    ->getId());
  $this
    ->assertFalse($stored_alias);

  // Set live as the active workspace.
  \Drupal::service('workspace.manager')
    ->setActiveWorkspace($live);

  // Add an alias that should be accessible from all workspaces.
  $alias3 = '/aliases';
  $edit = [
    'source' => '/admin/config/search/path',
    'alias' => $alias3,
  ];
  $this
    ->drupalPostForm('admin/config/search/path/add', $edit, t('Save'));
  $this
    ->drupalGet('admin/config/search/path');
  $web_assert
    ->statusCodeEquals(200);
  $web_assert
    ->pageTextContains($alias3);

  // Set stage as the active workspace.
  \Drupal::service('workspace.manager')
    ->setActiveWorkspace($stage);
  $this
    ->drupalGet('admin/config/search/path');
  $web_assert
    ->statusCodeEquals(200);
  $web_assert
    ->pageTextContains($alias3);

  // Delete alias3.
  $session = $this
    ->getSession();
  $page = $session
    ->getPage();
  $page
    ->clickLink('Delete');
  $web_assert
    ->pageTextContains('Are you sure you want to delete path alias ' . $alias3 . '?');
  $page
    ->pressButton('Confirm');
  $this
    ->drupalGet('admin/config/search/path');
  $web_assert
    ->statusCodeEquals(200);
  $web_assert
    ->pageTextNotContains($alias3);

  // Set live as the active workspace.
  \Drupal::service('workspace.manager')
    ->setActiveWorkspace($live);
  $this
    ->drupalGet('admin/config/search/path');
  $web_assert
    ->statusCodeEquals(200);
  $web_assert
    ->pageTextNotContains($alias3);
}