function PageCacheTest::testConditionalRequests

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

Tests support of requests with If-Modified-Since and If-None-Match headers.

File

core/modules/page_cache/tests/src/Functional/PageCacheTest.php, line 163

Class

PageCacheTest
Enables the page cache and tests it with various HTTP requests.

Namespace

Drupal\Tests\page_cache\Functional

Code

public function testConditionalRequests() : void {
    $this->enablePageCaching();
    // Fill the cache.
    $this->drupalGet('');
    // Verify the page is not printed twice when the cache is cold.
    $this->assertSession()
        ->responseNotMatches('#<html.*<html#');
    $this->drupalGet('');
    $this->assertSession()
        ->responseHeaderEquals('X-Drupal-Cache', 'HIT');
    $etag = $this->getSession()
        ->getResponseHeader('ETag');
    $last_modified = $this->getSession()
        ->getResponseHeader('Last-Modified');
    // Ensure a conditional request returns 304 Not Modified.
    $this->drupalGet('', [], [
        'If-Modified-Since' => $last_modified,
        'If-None-Match' => $etag,
    ]);
    $this->assertSession()
        ->statusCodeEquals(304);
    // Ensure a conditional request with obsolete If-Modified-Since date
    // returns 304 Not Modified.
    $this->drupalGet('', [], [
        'If-Modified-Since' => gmdate(DATE_RFC822, strtotime($last_modified)),
        'If-None-Match' => $etag,
    ]);
    $this->assertSession()
        ->statusCodeEquals(304);
    // Ensure a conditional request with obsolete If-Modified-Since date
    // returns 304 Not Modified.
    $this->drupalGet('', [], [
        'If-Modified-Since' => gmdate(DATE_RFC850, strtotime($last_modified)),
        'If-None-Match' => $etag,
    ]);
    $this->assertSession()
        ->statusCodeEquals(304);
    // Ensure a conditional request without If-None-Match returns 200 OK.
    $this->drupalGet('', [], [
        'If-Modified-Since' => $last_modified,
        'If-None-Match' => '',
    ]);
    // Verify the page is not printed twice when the cache is warm.
    $this->assertSession()
        ->responseNotMatches('#<html.*<html#');
    $this->assertSession()
        ->statusCodeEquals(200);
    $this->assertSession()
        ->responseHeaderEquals('X-Drupal-Cache', 'HIT');
    // Ensure a conditional request with If-Modified-Since newer than
    // Last-Modified returns 200 OK.
    $this->drupalGet('', [], [
        'If-Modified-Since' => gmdate(DateTimePlus::RFC7231, strtotime($last_modified) + 1),
        'If-None-Match' => $etag,
    ]);
    $this->assertSession()
        ->statusCodeEquals(200);
    $this->assertSession()
        ->responseHeaderEquals('X-Drupal-Cache', 'HIT');
    // Ensure a conditional request by an authenticated user returns 200 OK.
    $user = $this->drupalCreateUser();
    $this->drupalLogin($user);
    $this->drupalGet('', [], [
        'If-Modified-Since' => $last_modified,
        'If-None-Match' => $etag,
    ]);
    $this->assertSession()
        ->statusCodeEquals(200);
    // Verify that absence of Page was not cached.
    $this->assertSession()
        ->responseHeaderEquals('X-Drupal-Cache', 'UNCACHEABLE (request policy)');
    $this->drupalLogout();
}

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