You are here

public function AccessResultTest::testCacheTags in Drupal 10

Same name and namespace in other branches
  1. 8 core/tests/Drupal/Tests/Core/Access/AccessResultTest.php \Drupal\Tests\Core\Access\AccessResultTest::testCacheTags()
  2. 9 core/tests/Drupal/Tests/Core/Access/AccessResultTest.php \Drupal\Tests\Core\Access\AccessResultTest::testCacheTags()

@covers ::addCacheTags @covers ::addCacheableDependency @covers ::getCacheTags @covers ::resetCacheTags

File

core/tests/Drupal/Tests/Core/Access/AccessResultTest.php, line 480
Contains \Drupal\Tests\Core\Access\AccessResultTest.

Class

AccessResultTest
@coversDefaultClass \Drupal\Core\Access\AccessResult @group Access

Namespace

Drupal\Tests\Core\Access

Code

public function testCacheTags() {
  $verify = function (AccessResult $access, array $tags, array $contexts = [], $max_age = Cache::PERMANENT) {
    $this
      ->assertFalse($access
      ->isAllowed());
    $this
      ->assertFalse($access
      ->isForbidden());
    $this
      ->assertTrue($access
      ->isNeutral());
    $this
      ->assertSame($max_age, $access
      ->getCacheMaxAge());
    $this
      ->assertEqualsCanonicalizing($contexts, $access
      ->getCacheContexts());
    $this
      ->assertEqualsCanonicalizing($tags, $access
      ->getCacheTags());
  };
  $access = AccessResult::neutral()
    ->addCacheTags([
    'foo:bar',
  ]);
  $verify($access, [
    'foo:bar',
  ]);

  // Verify resetting works.
  $access
    ->resetCacheTags();
  $verify($access, []);

  // Verify idempotency.
  $access
    ->addCacheTags([
    'foo:bar',
  ])
    ->addCacheTags([
    'foo:bar',
  ]);
  $verify($access, [
    'foo:bar',
  ]);

  // Verify same values in different call order yields the same result.
  $access
    ->resetCacheTags()
    ->addCacheTags([
    'bar:baz',
  ])
    ->addCacheTags([
    'bar:qux',
  ])
    ->addCacheTags([
    'foo:bar',
  ])
    ->addCacheTags([
    'foo:baz',
  ]);
  $verify($access, [
    'bar:baz',
    'bar:qux',
    'foo:bar',
    'foo:baz',
  ]);
  $access
    ->resetCacheTags()
    ->addCacheTags([
    'foo:bar',
  ])
    ->addCacheTags([
    'bar:qux',
  ])
    ->addCacheTags([
    'foo:baz',
  ])
    ->addCacheTags([
    'bar:baz',
  ]);
  $verify($access, [
    'bar:baz',
    'bar:qux',
    'foo:bar',
    'foo:baz',
  ]);

  // ::addCacheableDependency() convenience method.
  $node = $this
    ->createMock('\\Drupal\\node\\NodeInterface');
  $node
    ->expects($this
    ->any())
    ->method('getCacheTags')
    ->will($this
    ->returnValue([
    'node:20011988',
  ]));
  $node
    ->expects($this
    ->any())
    ->method('getCacheMaxAge')
    ->willReturn(600);
  $node
    ->expects($this
    ->any())
    ->method('getCacheContexts')
    ->willReturn([
    'user',
  ]);
  $tags = [
    'node:20011988',
  ];
  $a = AccessResult::neutral()
    ->addCacheTags($tags);
  $verify($a, $tags);
  $b = AccessResult::neutral()
    ->addCacheableDependency($node);
  $verify($b, $tags, [
    'user',
  ], 600);
  $non_cacheable_dependency = new \stdClass();
  $non_cacheable = AccessResult::neutral()
    ->addCacheableDependency($non_cacheable_dependency);
  $verify($non_cacheable, [], [], 0);
}