You are here

public function DefaultMenuLinkTreeManipulatorsTest::testCheckNodeAccess in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 core/tests/Drupal/Tests/Core/Menu/DefaultMenuLinkTreeManipulatorsTest.php \Drupal\Tests\Core\Menu\DefaultMenuLinkTreeManipulatorsTest::testCheckNodeAccess()

Tests the optimized node access checking.

@covers ::checkNodeAccess @covers ::collectNodeLinks @covers ::checkAccess

File

core/tests/Drupal/Tests/Core/Menu/DefaultMenuLinkTreeManipulatorsTest.php, line 277
Contains \Drupal\Tests\Core\Menu\DefaultMenuLinkTreeManipulatorsTest.

Class

DefaultMenuLinkTreeManipulatorsTest
Tests the default menu link tree manipulators.

Namespace

Drupal\Tests\Core\Menu

Code

public function testCheckNodeAccess() {
  $links = array(
    1 => MenuLinkMock::create(array(
      'id' => 'node.1',
      'route_name' => 'entity.node.canonical',
      'title' => 'foo',
      'parent' => '',
      'route_parameters' => array(
        'node' => 1,
      ),
    )),
    2 => MenuLinkMock::create(array(
      'id' => 'node.2',
      'route_name' => 'entity.node.canonical',
      'title' => 'bar',
      'parent' => '',
      'route_parameters' => array(
        'node' => 2,
      ),
    )),
    3 => MenuLinkMock::create(array(
      'id' => 'node.3',
      'route_name' => 'entity.node.canonical',
      'title' => 'baz',
      'parent' => 'node.2',
      'route_parameters' => array(
        'node' => 3,
      ),
    )),
    4 => MenuLinkMock::create(array(
      'id' => 'node.4',
      'route_name' => 'entity.node.canonical',
      'title' => 'qux',
      'parent' => 'node.3',
      'route_parameters' => array(
        'node' => 4,
      ),
    )),
    5 => MenuLinkMock::create(array(
      'id' => 'test.1',
      'route_name' => 'test_route',
      'title' => 'qux',
      'parent' => '',
    )),
    6 => MenuLinkMock::create(array(
      'id' => 'test.2',
      'route_name' => 'test_route',
      'title' => 'qux',
      'parent' => 'test.1',
    )),
  );
  $tree = array();
  $tree[1] = new MenuLinkTreeElement($links[1], FALSE, 1, FALSE, array());
  $tree[2] = new MenuLinkTreeElement($links[2], TRUE, 1, FALSE, array(
    3 => new MenuLinkTreeElement($links[3], TRUE, 2, FALSE, array(
      4 => new MenuLinkTreeElement($links[4], FALSE, 3, FALSE, array()),
    )),
  ));
  $tree[5] = new MenuLinkTreeElement($links[5], TRUE, 1, FALSE, array(
    6 => new MenuLinkTreeElement($links[6], FALSE, 2, FALSE, array()),
  ));
  $query = $this
    ->getMock('Drupal\\Core\\Entity\\Query\\QueryInterface');
  $query
    ->expects($this
    ->at(0))
    ->method('condition')
    ->with('nid', array(
    1,
    2,
    3,
    4,
  ));
  $query
    ->expects($this
    ->at(1))
    ->method('condition')
    ->with('status', NODE_PUBLISHED);
  $query
    ->expects($this
    ->once())
    ->method('execute')
    ->willReturn(array(
    1,
    2,
    4,
  ));
  $this->queryFactory
    ->expects($this
    ->once())
    ->method('get')
    ->with('node')
    ->willReturn($query);
  $node_access_result = AccessResult::allowed()
    ->cachePerPermissions()
    ->addCacheContexts([
    'user.node_grants:view',
  ]);
  $tree = $this->defaultMenuTreeManipulators
    ->checkNodeAccess($tree);
  $this
    ->assertEquals($node_access_result, $tree[1]->access);
  $this
    ->assertEquals($node_access_result, $tree[2]->access);

  // Ensure that access denied is set.
  $this
    ->assertEquals(AccessResult::neutral(), $tree[2]->subtree[3]->access);
  $this
    ->assertEquals($node_access_result, $tree[2]->subtree[3]->subtree[4]->access);

  // Ensure that other routes than entity.node.canonical are set as well.
  $this
    ->assertNull($tree[5]->access);
  $this
    ->assertNull($tree[5]->subtree[6]->access);

  // On top of the node access checking now run the ordinary route based
  // access checkers.
  // Ensure that the access manager is just called for the non-node routes.
  $this->accessManager
    ->expects($this
    ->at(0))
    ->method('checkNamedRoute')
    ->with('test_route', [], $this->currentUser, TRUE)
    ->willReturn(AccessResult::allowed());
  $this->accessManager
    ->expects($this
    ->at(1))
    ->method('checkNamedRoute')
    ->with('test_route', [], $this->currentUser, TRUE)
    ->willReturn(AccessResult::neutral());
  $tree = $this->defaultMenuTreeManipulators
    ->checkAccess($tree);
  $this
    ->assertEquals($node_access_result, $tree[1]->access);
  $this
    ->assertEquals($node_access_result, $tree[2]->access);
  $this
    ->assertEquals(AccessResult::neutral(), $tree[2]->subtree[3]->access);
  $this
    ->assertEquals(AccessResult::allowed()
    ->cachePerPermissions(), $tree[5]->access);
  $this
    ->assertEquals(AccessResult::neutral()
    ->cachePerPermissions(), $tree[5]->subtree[6]->access);
}