function BlockTest::testBlockCacheTags

Same name and namespace in other branches
  1. 8.9.x core/modules/block/tests/src/Functional/BlockTest.php \Drupal\Tests\block\Functional\BlockTest::testBlockCacheTags()
  2. 10 core/modules/block/tests/src/Functional/BlockTest.php \Drupal\Tests\block\Functional\BlockTest::testBlockCacheTags()
  3. 11.x core/modules/block/tests/src/Functional/BlockTest.php \Drupal\Tests\block\Functional\BlockTest::testBlockCacheTags()

Tests that cache tags are properly set and bubbled up to the page cache.

Verify that invalidation of these cache tags works:

  • "block:<block ID>"
  • "block_plugin:<block plugin ID>"

File

core/modules/block/tests/src/Functional/BlockTest.php, line 403

Class

BlockTest
Tests basic block functionality.

Namespace

Drupal\Tests\block\Functional

Code

public function testBlockCacheTags() {
  // The page cache only works for anonymous users.
  $this->drupalLogout();
  // Enable page caching.
  $config = $this->config('system.performance');
  $config->set('cache.page.max_age', 300);
  $config->save();
  // Place the "Powered by Drupal" block.
  $block = $this->drupalPlaceBlock('system_powered_by_block', [
    'id' => 'powered',
  ]);
  // Prime the page cache.
  $this->drupalGet('<front>');
  $this->assertSession()
    ->responseHeaderEquals('X-Drupal-Cache', 'MISS');
  // Verify a cache hit, but also the presence of the correct cache tags in
  // both the page and block caches.
  $this->drupalGet('<front>');
  $this->assertSession()
    ->responseHeaderEquals('X-Drupal-Cache', 'HIT');
  $cid_parts = [
    Url::fromRoute('<front>', [], [
      'absolute' => TRUE,
    ])->toString(),
    '',
  ];
  $cid = implode(':', $cid_parts);
  $cache_entry = \Drupal::cache('page')->get($cid);
  $expected_cache_tags = [
    'config:block_list',
    'block_view',
    'config:block.block.powered',
    'config:user.role.anonymous',
    'http_response',
    'rendered',
  ];
  sort($expected_cache_tags);
  $keys = \Drupal::service('cache_contexts_manager')->convertTokensToKeys([
    'languages:language_interface',
    'theme',
    'user.permissions',
  ])
    ->getKeys();
  $this->assertSame($expected_cache_tags, $cache_entry->tags);
  $cache_entry = \Drupal::cache('render')->get('entity_view:block:powered:' . implode(':', $keys));
  $expected_cache_tags = [
    'block_view',
    'config:block.block.powered',
    'rendered',
  ];
  sort($expected_cache_tags);
  $this->assertSame($expected_cache_tags, $cache_entry->tags);
  // The "Powered by Drupal" block is modified; verify a cache miss.
  $block->setRegion('content');
  $block->save();
  $this->drupalGet('<front>');
  $this->assertSession()
    ->responseHeaderEquals('X-Drupal-Cache', 'MISS');
  // Now we should have a cache hit again.
  $this->drupalGet('<front>');
  $this->assertSession()
    ->responseHeaderEquals('X-Drupal-Cache', 'HIT');
  // Place the "Powered by Drupal" block another time; verify a cache miss.
  $this->drupalPlaceBlock('system_powered_by_block', [
    'id' => 'powered-2',
  ]);
  $this->drupalGet('<front>');
  $this->assertSession()
    ->responseHeaderEquals('X-Drupal-Cache', 'MISS');
  // Verify a cache hit, but also the presence of the correct cache tags.
  $this->drupalGet('<front>');
  $this->assertSession()
    ->responseHeaderEquals('X-Drupal-Cache', 'HIT');
  $cid_parts = [
    Url::fromRoute('<front>', [], [
      'absolute' => TRUE,
    ])->toString(),
    '',
  ];
  $cid = implode(':', $cid_parts);
  $cache_entry = \Drupal::cache('page')->get($cid);
  $expected_cache_tags = [
    'config:block_list',
    'block_view',
    'config:block.block.powered',
    'config:block.block.powered-2',
    'config:user.role.anonymous',
    'http_response',
    'rendered',
  ];
  sort($expected_cache_tags);
  $this->assertEquals($expected_cache_tags, $cache_entry->tags);
  $expected_cache_tags = [
    'block_view',
    'config:block.block.powered',
    'rendered',
  ];
  sort($expected_cache_tags);
  $keys = \Drupal::service('cache_contexts_manager')->convertTokensToKeys([
    'languages:language_interface',
    'theme',
    'user.permissions',
  ])
    ->getKeys();
  $cache_entry = \Drupal::cache('render')->get('entity_view:block:powered:' . implode(':', $keys));
  $this->assertSame($expected_cache_tags, $cache_entry->tags);
  $expected_cache_tags = [
    'block_view',
    'config:block.block.powered-2',
    'rendered',
  ];
  sort($expected_cache_tags);
  $keys = \Drupal::service('cache_contexts_manager')->convertTokensToKeys([
    'languages:language_interface',
    'theme',
    'user.permissions',
  ])
    ->getKeys();
  $cache_entry = \Drupal::cache('render')->get('entity_view:block:powered-2:' . implode(':', $keys));
  $this->assertSame($expected_cache_tags, $cache_entry->tags);
  // Now we should have a cache hit again.
  $this->drupalGet('<front>');
  $this->assertSession()
    ->responseHeaderEquals('X-Drupal-Cache', 'HIT');
  // Delete the "Powered by Drupal" blocks; verify a cache miss.
  $block_storage = \Drupal::entityTypeManager()->getStorage('block');
  $block_storage->load('powered')
    ->delete();
  $block_storage->load('powered-2')
    ->delete();
  $this->drupalGet('<front>');
  $this->assertSession()
    ->responseHeaderEquals('X-Drupal-Cache', 'MISS');
}

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