function ContextualDynamicContextTest::testDifferentPermissions

Tests contextual links with different permissions.

Ensures that contextual link placeholders always exist, even if the user is not allowed to use contextual links.

File

drupal/core/modules/contextual/lib/Drupal/contextual/Tests/ContextualDynamicContextTest.php, line 49
Contains \Drupal\contextual\Tests\ContextualDynamicContextTest.

Class

ContextualDynamicContextTest
Tests accessible links after inaccessible links on dynamic context.

Namespace

Drupal\contextual\Tests

Code

function testDifferentPermissions() {
  $this
    ->drupalLogin($this->editor_user);

  // Create three nodes in the following order:
  // - An article, which should be user-editable.
  // - A page, which should not be user-editable.
  // - A second article, which should also be user-editable.
  $node1 = $this
    ->drupalCreateNode(array(
    'type' => 'article',
    'promote' => 1,
  ));
  $node2 = $this
    ->drupalCreateNode(array(
    'type' => 'page',
    'promote' => 1,
  ));
  $node3 = $this
    ->drupalCreateNode(array(
    'type' => 'article',
    'promote' => 1,
  ));

  // Now, on the front page, all article nodes should have contextual links
  // placeholders, as should the view that contains them.
  $ids = array(
    'node:node:' . $node1->nid . ':',
    'node:node:' . $node2->nid . ':',
    'node:node:' . $node3->nid . ':',
    'views_ui:admin/structure/views/view:frontpage:location=page&name=frontpage&display_id=page_1',
  );

  // Editor user: can access contextual links and can edit articles.
  $this
    ->drupalGet('node');
  for ($i = 0; $i < count($ids); $i++) {
    $this
      ->assertContextualLinkPlaceHolder($ids[$i]);
  }
  $this
    ->renderContextualLinks(array(), 'node');
  $this
    ->assertResponse(400);
  $this
    ->assertRaw('No contextual ids specified.');
  $response = $this
    ->renderContextualLinks($ids, 'node');
  $this
    ->assertResponse(200);
  $json = drupal_json_decode($response);
  $this
    ->assertIdentical($json[$ids[0]], '<ul class="contextual-links"><li class="node-edit odd first last"><a href="' . base_path() . 'node/1/edit?destination=node">Edit</a></li></ul>');
  $this
    ->assertIdentical($json[$ids[1]], '');
  $this
    ->assertIdentical($json[$ids[2]], '<ul class="contextual-links"><li class="node-edit odd first last"><a href="' . base_path() . 'node/3/edit?destination=node">Edit</a></li></ul>');
  $this
    ->assertIdentical($json[$ids[3]], '');

  // Authenticated user: can access contextual links, cannot edit articles.
  $this
    ->drupalLogin($this->authenticated_user);
  $this
    ->drupalGet('node');
  for ($i = 0; $i < count($ids); $i++) {
    $this
      ->assertContextualLinkPlaceHolder($ids[$i]);
  }
  $this
    ->renderContextualLinks(array(), 'node');
  $this
    ->assertResponse(400);
  $this
    ->assertRaw('No contextual ids specified.');
  $response = $this
    ->renderContextualLinks($ids, 'node');
  $this
    ->assertResponse(200);
  $json = drupal_json_decode($response);
  $this
    ->assertIdentical($json[$ids[0]], '');
  $this
    ->assertIdentical($json[$ids[1]], '');
  $this
    ->assertIdentical($json[$ids[2]], '');
  $this
    ->assertIdentical($json[$ids[3]], '');

  // Anonymous user: cannot access contextual links.
  $this
    ->drupalLogin($this->anonymous_user);
  $this
    ->drupalGet('node');
  for ($i = 0; $i < count($ids); $i++) {
    $this
      ->assertContextualLinkPlaceHolder($ids[$i]);
  }
  $this
    ->renderContextualLinks(array(), 'node');
  $this
    ->assertResponse(403);
  $this
    ->renderContextualLinks($ids, 'node');
  $this
    ->assertResponse(403);
}