class NodeOperationAccessTest
Tests node operations.
Attributes
#[CoversClass(NodeAccessControlHandler::class)]
#[Group('node')]
  Hierarchy
- class \Drupal\Tests\UnitTestCase uses \Drupal\Tests\PhpUnitCompatibilityTrait, \Prophecy\PhpUnit\ProphecyTrait, \Drupal\TestTools\Extension\DeprecationBridge\ExpectDeprecationTrait, \Drupal\Tests\RandomGeneratorTrait extends \PHPUnit\Framework\TestCase- class \Drupal\Tests\node\Unit\NodeOperationAccessTest extends \Drupal\Tests\UnitTestCase
 
Expanded class hierarchy of NodeOperationAccessTest
File
- 
              core/modules/ node/ tests/ src/ Unit/ NodeOperationAccessTest.php, line 27 
Namespace
Drupal\Tests\node\UnitView 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.
   */
  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::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::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::setDebugDumpHandler | public static | function | Registers the dumper CLI handler when the DebugDump extension is enabled. | |
| UnitTestCase::setupMockIterator | protected | function | Set up a traversable class mock to return specific items when iterated. | 
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.
