function BlockTest::testBlockCacheTags

Same name and namespace in other branches
  1. 9 core/modules/block/tests/src/Functional/BlockTest.php \Drupal\Tests\block\Functional\BlockTest::testBlockCacheTags()
  2. 8.9.x core/modules/block/tests/src/Functional/BlockTest.php \Drupal\Tests\block\Functional\BlockTest::testBlockCacheTags()
  3. 10 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 429

Class

BlockTest
Tests basic block functionality.

Namespace

Drupal\Tests\block\Functional

Code

public function testBlockCacheTags() : void {
    // 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.