function Fast404Test::testFast404

Same name and namespace in other branches
  1. 9 core/tests/Drupal/FunctionalTests/EventSubscriber/Fast404Test.php \Drupal\FunctionalTests\EventSubscriber\Fast404Test::testFast404()
  2. 11.x core/tests/Drupal/FunctionalTests/EventSubscriber/Fast404Test.php \Drupal\FunctionalTests\EventSubscriber\Fast404Test::testFast404()

Tests the fast 404 functionality.

File

core/tests/Drupal/FunctionalTests/EventSubscriber/Fast404Test.php, line 32

Class

Fast404Test
Tests the fast 404 functionality.

Namespace

Drupal\FunctionalTests\EventSubscriber

Code

public function testFast404() : void {
  $this->drupalGet('does-not-exist');
  $this->assertSession()
    ->statusCodeEquals(404);
  // Regular 404s will contain CSS from the system module.
  $this->assertSession()
    ->responseContains('modules/system/css/');
  $this->drupalGet('does-not-exist.txt');
  $this->assertSession()
    ->statusCodeEquals(404);
  // Fast 404s do not have any CSS.
  $this->assertSession()
    ->responseNotContains('modules/system/css/');
  $this->assertSession()
    ->responseHeaderContains('X-Drupal-Cache', 'Miss');
  // Fast 404s can be cached.
  $this->drupalGet('does-not-exist.txt');
  $this->assertSession()
    ->statusCodeEquals(404);
  $this->assertSession()
    ->responseHeaderContains('X-Drupal-Cache', 'Hit');
  $this->assertSession()
    ->pageTextNotContains('Oops I did it again!');
  // Changing configuration should invalidate the cache.
  $this->config('system.performance')
    ->set('fast_404.html', '<!DOCTYPE html><html><head><title>404 Not Found</title></head><body><h1>Oops I did it again!</h1><p>The requested URL "@path" was not found on this server.</p></body></html>')
    ->save();
  $this->drupalGet('does-not-exist.txt');
  $this->assertSession()
    ->responseNotContains('modules/system/css/');
  $this->assertSession()
    ->statusCodeEquals(404);
  $this->assertSession()
    ->responseHeaderContains('X-Drupal-Cache', 'Miss');
  $this->assertSession()
    ->pageTextContains('Oops I did it again!');
  // Ensure disabling works.
  $this->config('system.performance')
    ->set('fast_404.enabled', FALSE)
    ->save();
  $this->drupalGet('does-not-exist.txt');
  $this->assertSession()
    ->responseContains('modules/system/css/');
  $this->assertSession()
    ->statusCodeEquals(404);
  $this->assertSession()
    ->responseHeaderContains('X-Drupal-Cache', 'Miss');
  $this->assertSession()
    ->pageTextNotContains('Oops I did it again!');
  // Ensure settings.php can override settings.
  $settings['config']['system.performance']['fast_404']['enabled'] = (object) [
    'value' => TRUE,
    'required' => TRUE,
  ];
  $this->writeSettings($settings);
  // Changing settings using an override means we need to rebuild everything.
  $this->rebuildAll();
  $this->drupalGet('does-not-exist.txt');
  $this->assertSession()
    ->statusCodeEquals(404);
  $this->assertSession()
    ->responseNotContains('modules/system/css/');
  // Fast 404s returned via the exception subscriber still have the
  // X-Generator header.
  $this->assertSession()
    ->responseHeaderContains('X-Generator', 'Drupal');
}

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