function DynamicPageCacheIntegrationTest::testDynamicPageCache

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

Tests that Dynamic Page Cache works correctly, and verifies the edge cases.

File

core/modules/dynamic_page_cache/tests/src/Functional/DynamicPageCacheIntegrationTest.php, line 49

Class

DynamicPageCacheIntegrationTest
Enables the Dynamic Page Cache and tests it in various scenarios.

Namespace

Drupal\Tests\dynamic_page_cache\Functional

Code

public function testDynamicPageCache() {
    // Controllers returning plain response objects are ignored by Dynamic Page
    // Cache.
    $url = Url::fromUri('route:dynamic_page_cache_test.response');
    $this->drupalGet($url);
    $this->assertSession()
        ->responseHeaderDoesNotExist(DynamicPageCacheSubscriber::HEADER);
    // Controllers returning CacheableResponseInterface (cacheable response)
    // objects are handled by Dynamic Page Cache.
    $url = Url::fromUri('route:dynamic_page_cache_test.cacheable_response');
    $this->drupalGet($url);
    $this->assertSession()
        ->responseHeaderEquals(DynamicPageCacheSubscriber::HEADER, 'MISS');
    $this->drupalGet($url);
    $this->assertSession()
        ->responseHeaderEquals(DynamicPageCacheSubscriber::HEADER, 'HIT');
    // Controllers returning render arrays, rendered as HTML responses, are
    // handled by Dynamic Page Cache.
    $url = Url::fromUri('route:dynamic_page_cache_test.html');
    $this->drupalGet($url);
    $this->assertSession()
        ->responseHeaderEquals(DynamicPageCacheSubscriber::HEADER, 'MISS');
    $this->drupalGet($url);
    $this->assertSession()
        ->responseHeaderEquals(DynamicPageCacheSubscriber::HEADER, 'HIT');
    // The above is the simple case, where the render array returned by the
    // response contains no cache contexts. So let's now test a route/controller
    // that *does* vary by a cache context whose value we can easily control: it
    // varies by the 'animal' query argument.
    foreach ([
        'llama',
        'piggy',
        'unicorn',
        'kitten',
    ] as $animal) {
        $url = Url::fromUri('route:dynamic_page_cache_test.html.with_cache_contexts', [
            'query' => [
                'animal' => $animal,
            ],
        ]);
        $this->drupalGet($url);
        $this->assertSession()
            ->pageTextContains($animal);
        $this->assertSession()
            ->responseHeaderEquals(DynamicPageCacheSubscriber::HEADER, 'MISS');
        $this->drupalGet($url);
        $this->assertSession()
            ->pageTextContains($animal);
        $this->assertSession()
            ->responseHeaderEquals(DynamicPageCacheSubscriber::HEADER, 'HIT');
        // Finally, let's also verify that the 'dynamic_page_cache_test.html'
        // route continued to see cache hits if we specify a query argument,
        // because it *should* ignore it and continue to provide Dynamic Page
        // Cache hits.
        $url = Url::fromUri('route:dynamic_page_cache_test.html', [
            'query' => [
                'animal' => 'piglet',
            ],
        ]);
        $this->drupalGet($url);
        $this->assertSession()
            ->responseHeaderEquals(DynamicPageCacheSubscriber::HEADER, 'HIT');
    }
    // Controllers returning render arrays, rendered as anything except an HTML
    // response, are ignored by Dynamic Page Cache (but only because those
    // wrapper formats' responses do not implement CacheableResponseInterface).
    $this->drupalGet('dynamic-page-cache-test/html', [
        'query' => [
            MainContentViewSubscriber::WRAPPER_FORMAT => 'drupal_ajax',
        ],
    ]);
    $this->assertSession()
        ->responseHeaderDoesNotExist(DynamicPageCacheSubscriber::HEADER);
    $this->drupalGet('dynamic-page-cache-test/html', [
        'query' => [
            MainContentViewSubscriber::WRAPPER_FORMAT => 'drupal_dialog',
        ],
    ]);
    $this->assertSession()
        ->responseHeaderDoesNotExist(DynamicPageCacheSubscriber::HEADER);
    $this->drupalGet('dynamic-page-cache-test/html', [
        'query' => [
            MainContentViewSubscriber::WRAPPER_FORMAT => 'drupal_modal',
        ],
    ]);
    $this->assertSession()
        ->responseHeaderDoesNotExist(DynamicPageCacheSubscriber::HEADER);
    // Admin routes are ignored by Dynamic Page Cache.
    $this->drupalGet('dynamic-page-cache-test/html/admin');
    $this->assertSession()
        ->responseHeaderDoesNotExist(DynamicPageCacheSubscriber::HEADER);
    $this->drupalGet('dynamic-page-cache-test/response/admin');
    $this->assertSession()
        ->responseHeaderDoesNotExist(DynamicPageCacheSubscriber::HEADER);
    $this->drupalGet('dynamic-page-cache-test/cacheable-response/admin');
    $this->assertSession()
        ->responseHeaderDoesNotExist(DynamicPageCacheSubscriber::HEADER);
    // Max-age = 0 responses are ignored by Dynamic Page Cache.
    $this->drupalGet('dynamic-page-cache-test/html/uncacheable/max-age');
    $this->assertSession()
        ->responseHeaderEquals(DynamicPageCacheSubscriber::HEADER, 'UNCACHEABLE');
    // 'user' cache context responses are ignored by Dynamic Page Cache.
    $this->drupalGet('dynamic-page-cache-test/html/uncacheable/contexts');
    $this->assertSession()
        ->responseHeaderEquals(DynamicPageCacheSubscriber::HEADER, 'UNCACHEABLE');
    // 'current-temperature' cache tag responses are ignored by Dynamic Page
    // Cache.
    $this->drupalGet('dynamic-page-cache-test/html/uncacheable/tags');
    $this->assertSession()
        ->responseHeaderEquals(DynamicPageCacheSubscriber::HEADER, 'MISS');
}

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