Fast404Test.php

Same filename and directory in other branches
  1. 9 core/tests/Drupal/FunctionalTests/EventSubscriber/Fast404Test.php
  2. 10 core/tests/Drupal/FunctionalTests/EventSubscriber/Fast404Test.php

Namespace

Drupal\FunctionalTests\EventSubscriber

File

core/tests/Drupal/FunctionalTests/EventSubscriber/Fast404Test.php

View source
<?php

declare (strict_types=1);
namespace Drupal\FunctionalTests\EventSubscriber;

use Drupal\file\Entity\File;
use Drupal\Tests\BrowserTestBase;

/**
 * Tests the fast 404 functionality.
 *
 * @group EventSubscriber
 *
 * @see \Drupal\Core\EventSubscriber\Fast404ExceptionHtmlSubscriber
 */
class Fast404Test extends BrowserTestBase {
  
  /**
   * {@inheritdoc}
   */
  protected $defaultTheme = 'stark';
  
  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'file',
  ];
  
  /**
   * Tests the fast 404 functionality.
   */
  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');
  }
  
  /**
   * Tests the fast 404 functionality.
   */
  public function testFast404PrivateFiles() : void {
    $admin = $this->createUser([], NULL, TRUE);
    $this->drupalLogin($admin);
    $file_url = 'system/files/test/private-file-test.txt';
    $this->drupalGet($file_url);
    $this->assertSession()
      ->statusCodeEquals(404);
    $this->drupalGet($file_url);
    $this->assertSession()
      ->statusCodeEquals(404);
    // Create a private file for testing accessible by the admin user.
    \Drupal::service('file_system')->mkdir($this->privateFilesDirectory . '/test');
    $filepath = 'private://test/private-file-test.txt';
    $contents = "file_put_contents() doesn't seem to appreciate empty strings so let's put in some data.";
    file_put_contents($filepath, $contents);
    $file = File::create([
      'uri' => $filepath,
      'uid' => $admin->id(),
    ]);
    $file->save();
    $this->drupalGet($file_url);
    $this->assertSession()
      ->statusCodeEquals(200);
    $this->assertSession()
      ->pageTextContains($contents);
  }

}

Classes

Title Deprecated Summary
Fast404Test Tests the fast 404 functionality.

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