function PageCacheTagsIntegrationTest::testPageCacheTags

Same name and namespace in other branches
  1. 9 core/modules/page_cache/tests/src/Functional/PageCacheTagsIntegrationTest.php \Drupal\Tests\page_cache\Functional\PageCacheTagsIntegrationTest::testPageCacheTags()
  2. 8.9.x core/modules/page_cache/tests/src/Functional/PageCacheTagsIntegrationTest.php \Drupal\Tests\page_cache\Functional\PageCacheTagsIntegrationTest::testPageCacheTags()
  3. 10 core/modules/page_cache/tests/src/Functional/PageCacheTagsIntegrationTest.php \Drupal\Tests\page_cache\Functional\PageCacheTagsIntegrationTest::testPageCacheTags()

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

File

core/modules/page_cache/tests/src/Functional/PageCacheTagsIntegrationTest.php, line 65

Class

PageCacheTagsIntegrationTest
Enables the page cache and tests its cache tags in various scenarios.

Namespace

Drupal\Tests\page_cache\Functional

Code

public function testPageCacheTags() : void {
    $config = $this->config('language.types');
    $config->set('configurable', [
        LanguageInterface::TYPE_INTERFACE,
        LanguageInterface::TYPE_CONTENT,
    ]);
    $config->set('negotiation.language_content.enabled', [
        LanguageNegotiationUrl::METHOD_ID => 0,
        LanguageNegotiationContentEntity::METHOD_ID => 1,
    ]);
    $config->save();
    // Create two filters.
    FilterFormat::create(Yaml::parseFile('core/profiles/standard/config/install/filter.format.basic_html.yml'))->save();
    FilterFormat::create(Yaml::parseFile('core/profiles/standard/config/install/filter.format.full_html.yml'))->save();
    $this->drupalCreateContentType([
        'type' => 'page',
        'title' => 'Basic page',
    ]);
    $this->addDefaultCommentField('node', 'page');
    // To generate search and comment tags.
    $anonymous = Role::load(RoleInterface::ANONYMOUS_ID);
    $anonymous->grantPermission('search content')
        ->grantPermission('access comments');
    $anonymous->save();
    // Create two nodes.
    $author_1 = $this->drupalCreateUser();
    $node_1 = $this->drupalCreateNode([
        'uid' => $author_1->id(),
        'title' => 'Node 1',
        'body' => [
            0 => [
                'value' => 'Body 1',
                'format' => 'basic_html',
            ],
        ],
        'promote' => NodeInterface::PROMOTED,
    ]);
    $author_2 = $this->drupalCreateUser();
    $node_2 = $this->drupalCreateNode([
        'uid' => $author_2->id(),
        'title' => 'Node 2',
        'body' => [
            0 => [
                'value' => 'Body 2',
                'format' => 'full_html',
            ],
        ],
        'promote' => NodeInterface::PROMOTED,
    ]);
    // Place a block, but only make it visible on full node page 2.
    $block = $this->drupalPlaceBlock('views_block:comments_recent-block_1', [
        'visibility' => [
            'request_path' => [
                'pages' => '/node/' . $node_2->id(),
            ],
        ],
    ]);
    $cache_contexts = [
        'languages:' . LanguageInterface::TYPE_INTERFACE,
        'route',
        'theme',
        'timezone',
        // The placed block is only visible on certain URLs through a visibility
        // condition.
'url.path',
        'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT,
        // rel=canonical links and friends have absolute URLs as their values.
'url.site',
        // These two cache contexts are added by BigPipe.
'cookies:big_pipe_nojs',
        'session.exists',
        'user.permissions',
        'user.roles',
    ];
    // Full node page 1.
    $this->assertPageCacheContextsAndTags($node_1->toUrl(), $cache_contexts, [
        'http_response',
        'rendered',
        'block_view',
        'local_task',
        'config:block_list',
        'config:block.block.olivero_site_branding',
        'config:block.block.olivero_breadcrumbs',
        'config:block.block.olivero_content',
        'config:block.block.olivero_help',
        'config:block.block.olivero_search_form_narrow',
        'config:block.block.olivero_search_form_wide',
        'config:block.block.' . $block->id(),
        'config:block.block.olivero_powered',
        'config:block.block.olivero_main_menu',
        'config:block.block.olivero_account_menu',
        'config:block.block.olivero_messages',
        'config:block.block.olivero_primary_local_tasks',
        'config:block.block.olivero_secondary_local_tasks',
        'config:block.block.olivero_syndicate',
        'config:block.block.olivero_primary_admin_actions',
        'config:block.block.olivero_page_title',
        'node_view',
        'CACHE_MISS_IF_UNCACHEABLE_HTTP_METHOD:form',
        'node:' . $node_1->id(),
        'user:' . $author_1->id(),
        'config:filter.format.basic_html',
        'config:search.settings',
        'config:system.menu.account',
        'config:system.menu.main',
        'config:system.site',
        // FinishResponseSubscriber adds this cache tag to responses that have the
        // 'user.permissions' cache context for anonymous users.
'config:user.role.anonymous',
    ]);
    // Render the view block adds the languages cache context.
    $cache_contexts[] = 'languages:' . LanguageInterface::TYPE_CONTENT;
    // Full node page 2.
    $this->assertPageCacheContextsAndTags($node_2->toUrl(), $cache_contexts, [
        'http_response',
        'rendered',
        'block_view',
        'local_task',
        'config:block_list',
        'config:block.block.olivero_site_branding',
        'config:block.block.olivero_breadcrumbs',
        'config:block.block.olivero_content',
        'config:block.block.olivero_help',
        'config:block.block.olivero_search_form_narrow',
        'config:block.block.olivero_search_form_wide',
        'config:block.block.' . $block->id(),
        'config:block.block.olivero_powered',
        'config:block.block.olivero_main_menu',
        'config:block.block.olivero_account_menu',
        'config:block.block.olivero_messages',
        'config:block.block.olivero_primary_local_tasks',
        'config:block.block.olivero_secondary_local_tasks',
        'config:block.block.olivero_syndicate',
        'config:block.block.olivero_primary_admin_actions',
        'config:block.block.olivero_page_title',
        'node_view',
        'CACHE_MISS_IF_UNCACHEABLE_HTTP_METHOD:form',
        'node:' . $node_2->id(),
        'user:' . $author_2->id(),
        'config:filter.format.full_html',
        'config:search.settings',
        'config:system.menu.account',
        'config:system.menu.main',
        'config:system.site',
        'comment_list',
        'node_list',
        'config:views.view.comments_recent',
        // FinishResponseSubscriber adds this cache tag to responses that have the
        // 'user.permissions' cache context for anonymous users.
'config:user.role.anonymous',
    ]);
}

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