class NodeOperationAccessTest

Same name and namespace in other branches
  1. 9 core/modules/node/tests/src/Unit/NodeOperationAccessTest.php \Drupal\Tests\node\Unit\NodeOperationAccessTest
  2. 10 core/modules/node/tests/src/Unit/NodeOperationAccessTest.php \Drupal\Tests\node\Unit\NodeOperationAccessTest

Tests node operations.

@coversDefaultClass \Drupal\node\NodeAccessControlHandler @group node

Hierarchy

Expanded class hierarchy of NodeOperationAccessTest

File

core/modules/node/tests/src/Unit/NodeOperationAccessTest.php, line 27

Namespace

Drupal\Tests\node\Unit
View source
class NodeOperationAccessTest extends UnitTestCase {
    
    /**
     * {@inheritdoc}
     */
    protected function setUp() : void {
        parent::setUp();
        // Cache utility calls container directly.
        $cacheContextsManager = $this->getMockBuilder(CacheContextsManager::class)
            ->disableOriginalConstructor()
            ->getMock();
        $cacheContextsManager->method('assertValidTokens')
            ->willReturn(TRUE);
        $container = new ContainerBuilder();
        $container->set('cache_contexts_manager', $cacheContextsManager);
        \Drupal::setContainer($container);
    }
    
    /**
     * Tests revision operations.
     *
     * @param string $operation
     *   A revision operation.
     * @param array $hasPermissionMap
     *   A map of permissions, to whether they should be granted.
     * @param bool|null $assertAccess
     *   Whether the access is allowed or denied.
     * @param bool|null $isDefaultRevision
     *   Whether the node should be default revision, or NULL if not to expect it
     *   to be called.
     *
     * @dataProvider providerTestRevisionOperations
     */
    public function testRevisionOperations($operation, array $hasPermissionMap, $assertAccess, $isDefaultRevision = NULL) : void {
        $account = $this->createMock(AccountInterface::class);
        $account->method('hasPermission')
            ->willReturnMap($hasPermissionMap);
        $entityType = $this->createMock(EntityTypeInterface::class);
        $grants = $this->createMock(NodeGrantDatabaseStorageInterface::class);
        $grants->expects($this->any())
            ->method('access')
            ->willReturn(AccessResult::neutral());
        $language = $this->createMock(LanguageInterface::class);
        $language->expects($this->any())
            ->method('getId')
            ->willReturn('de');
        $nid = 333;
        
        /** @var \Drupal\node\NodeInterface|\PHPUnit\Framework\MockObject\MockObject $node */
        $node = $this->createMock(NodeInterface::class);
        $node->expects($this->any())
            ->method('language')
            ->willReturn($language);
        $node->expects($this->any())
            ->method('id')
            ->willReturn($nid);
        $node->expects($this->any())
            ->method('getCacheContexts')
            ->willReturn([]);
        $node->expects($this->any())
            ->method('getCacheTags')
            ->willReturn([]);
        $node->expects($this->any())
            ->method('getCacheMaxAge')
            ->willReturn(-1);
        $node->expects($this->any())
            ->method('getEntityTypeId')
            ->willReturn('node');
        if (isset($isDefaultRevision)) {
            $node->expects($this->atLeastOnce())
                ->method('isDefaultRevision')
                ->willReturn($isDefaultRevision);
        }
        $nodeStorage = $this->createMock(NodeStorageInterface::class);
        $nodeStorage->expects($this->any())
            ->method('load')
            ->with($nid)
            ->willReturn($node);
        $entityTypeManager = $this->createMock(EntityTypeManagerInterface::class);
        $entityTypeManager->expects($this->any())
            ->method('getStorage')
            ->with('node')
            ->willReturn($nodeStorage);
        $moduleHandler = $this->createMock(ModuleHandlerInterface::class);
        $moduleHandler->expects($this->any())
            ->method('invokeAll')
            ->willReturn([]);
        $accessControl = new NodeAccessControlHandler($entityType, $grants, $entityTypeManager);
        $accessControl->setModuleHandler($moduleHandler);
        $access = $accessControl->access($node, $operation, $account, FALSE);
        $this->assertEquals($assertAccess, $access);
    }
    
    /**
     * Data provider for revisionOperationsProvider.
     *
     * @return array
     *   Data for testing.
     */
    public static function providerTestRevisionOperations() {
        $data = [];
        // Tests 'bypass node access' never works on revision operations.
        $data['bypass, view all revisions'] = [
            'view all revisions',
            [
                [
                    'access content',
                    TRUE,
                ],
                [
                    'bypass node access',
                    TRUE,
                ],
            ],
            FALSE,
        ];
        $data['bypass, view revision'] = [
            'view revision',
            [
                [
                    'access content',
                    TRUE,
                ],
                [
                    'bypass node access',
                    TRUE,
                ],
            ],
            FALSE,
        ];
        $data['bypass, revert'] = [
            'revert revision',
            [
                [
                    'access content',
                    TRUE,
                ],
                [
                    'bypass node access',
                    TRUE,
                ],
            ],
            FALSE,
        ];
        $data['bypass, delete revision'] = [
            'delete revision',
            [
                [
                    'access content',
                    TRUE,
                ],
                [
                    'bypass node access',
                    TRUE,
                ],
            ],
            FALSE,
        ];
        $data['view all revisions'] = [
            'view all revisions',
            [
                [
                    'access content',
                    TRUE,
                ],
                [
                    'view all revisions',
                    TRUE,
                ],
            ],
            TRUE,
        ];
        $data['view all revisions with view access'] = [
            'view all revisions',
            [
                [
                    'access content',
                    TRUE,
                ],
                [
                    'view all revisions',
                    TRUE,
                ],
                // Bypass for 'view' operation.
[
                    'bypass node access',
                    TRUE,
                ],
            ],
            TRUE,
        ];
        $data['view revision, without view access'] = [
            'view revision',
            [
                [
                    'access content',
                    TRUE,
                ],
                [
                    'view all revisions',
                    TRUE,
                ],
            ],
            FALSE,
        ];
        $data['view revision, with view access'] = [
            'view revision',
            [
                [
                    'access content',
                    TRUE,
                ],
                [
                    'view all revisions',
                    TRUE,
                ],
                // Bypass for 'view' operation.
[
                    'bypass node access',
                    TRUE,
                ],
            ],
            TRUE,
        ];
        // Cannot revert if no update access.
        $data['revert, without update access, non default'] = [
            'revert revision',
            [
                [
                    'access content',
                    TRUE,
                ],
                [
                    'revert all revisions',
                    TRUE,
                ],
            ],
            FALSE,
            FALSE,
        ];
        // Can revert if has update access.
        $data['revert, with update access, non default'] = [
            'revert revision',
            [
                [
                    'access content',
                    TRUE,
                ],
                [
                    'revert all revisions',
                    TRUE,
                ],
                // Bypass for 'update' operation.
[
                    'bypass node access',
                    TRUE,
                ],
            ],
            TRUE,
            FALSE,
        ];
        // Can never revert default revision.
        $data['revert, with update access, default revision'] = [
            'revert revision',
            [
                [
                    'access content',
                    TRUE,
                ],
                [
                    'revert all revisions',
                    TRUE,
                ],
                // Bypass for 'update' operation.
[
                    'bypass node access',
                    TRUE,
                ],
            ],
            FALSE,
            TRUE,
        ];
        // Cannot delete non default revision if no delete access.
        $data['delete revision, without delete access, non default'] = [
            'delete revision',
            [
                [
                    'access content',
                    TRUE,
                ],
                [
                    'delete all revisions',
                    TRUE,
                ],
            ],
            FALSE,
            FALSE,
        ];
        // Can delete non default revision if delete access.
        $data['delete revision, with delete access, non default'] = [
            'delete revision',
            [
                [
                    'access content',
                    TRUE,
                ],
                [
                    'delete all revisions',
                    TRUE,
                ],
                // Bypass for 'delete' operation.
[
                    'bypass node access',
                    TRUE,
                ],
            ],
            TRUE,
            FALSE,
        ];
        return $data;
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title
ExpectDeprecationTrait::expectDeprecation public function Adds an expected deprecation.
ExpectDeprecationTrait::getCallableName private static function Returns a callable as a string suitable for inclusion in a message.
ExpectDeprecationTrait::setUpErrorHandler public function Sets up the test error handler.
ExpectDeprecationTrait::tearDownErrorHandler public function Tears down the test error handler.
NodeOperationAccessTest::providerTestRevisionOperations public static function Data provider for revisionOperationsProvider.
NodeOperationAccessTest::setUp protected function Overrides UnitTestCase::setUp
NodeOperationAccessTest::testRevisionOperations public function Tests revision operations.
RandomGeneratorTrait::getRandomGenerator protected function Gets the random generator for the utility methods.
RandomGeneratorTrait::randomMachineName protected function Generates a unique random string containing letters and numbers.
RandomGeneratorTrait::randomObject public function Generates a random PHP object.
RandomGeneratorTrait::randomString public function Generates a pseudo-random string of ASCII characters of codes 32 to 126.
UnitTestCase::$root protected property The app root.
UnitTestCase::getClassResolverStub protected function Returns a stub class resolver.
UnitTestCase::getConfigFactoryStub public function Returns a stub config factory that behaves according to the passed array.
UnitTestCase::getConfigStorageStub public function Returns a stub config storage that returns the supplied configuration.
UnitTestCase::getContainerWithCacheTagsInvalidator protected function Sets up a container with a cache tags invalidator.
UnitTestCase::getStringTranslationStub public function Returns a stub translation manager that just returns the passed string.
UnitTestCase::setUpBeforeClass public static function

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