HtmlResponseAttachmentsTest.php

Same filename and directory in other branches
  1. 9 core/modules/system/tests/src/Functional/Render/HtmlResponseAttachmentsTest.php
  2. 8.9.x core/modules/system/tests/src/Functional/Render/HtmlResponseAttachmentsTest.php
  3. 11.x core/modules/system/tests/src/Functional/Render/HtmlResponseAttachmentsTest.php

Namespace

Drupal\Tests\system\Functional\Render

File

core/modules/system/tests/src/Functional/Render/HtmlResponseAttachmentsTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\Tests\system\Functional\Render;

use Drupal\Tests\BrowserTestBase;

/**
 * Functional tests for HtmlResponseAttachmentsProcessor.
 *
 * @group Render
 */
class HtmlResponseAttachmentsTest extends BrowserTestBase {
  
  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'render_attached_test',
  ];
  
  /**
   * {@inheritdoc}
   */
  protected $defaultTheme = 'stark';
  
  /**
   * Tests rendering of ['#attached'].
   */
  public function testAttachments() : void {
    // Test ['#attached']['http_header] = ['Status', $code].
    $this->drupalGet('/render_attached_test/teapot');
    $this->assertSession()
      ->statusCodeEquals(418);
    $this->assertSession()
      ->responseHeaderEquals('X-Drupal-Cache', 'MISS');
    // Repeat for the cache.
    $this->drupalGet('/render_attached_test/teapot');
    $this->assertSession()
      ->statusCodeEquals(418);
    $this->assertSession()
      ->responseHeaderEquals('X-Drupal-Cache', 'HIT');
    // Test ['#attached']['http_header'] with various replacement rules.
    $this->drupalGet('/render_attached_test/header');
    $this->assertTeapotHeaders();
    $this->assertSession()
      ->responseHeaderEquals('X-Drupal-Cache', 'MISS');
    // Repeat for the cache.
    $this->drupalGet('/render_attached_test/header');
    $this->assertSession()
      ->responseHeaderEquals('X-Drupal-Cache', 'HIT');
    // Test ['#attached']['feed'].
    $this->drupalGet('/render_attached_test/feed');
    $this->assertSession()
      ->responseHeaderEquals('X-Drupal-Cache', 'MISS');
    $this->assertFeed();
    // Repeat for the cache.
    $this->drupalGet('/render_attached_test/feed');
    $this->assertSession()
      ->responseHeaderEquals('X-Drupal-Cache', 'HIT');
    // Test ['#attached']['html_head'].
    $this->drupalGet('/render_attached_test/head');
    $this->assertSession()
      ->responseHeaderEquals('X-Drupal-Cache', 'MISS');
    $this->assertHead();
    // Repeat for the cache.
    $this->drupalGet('/render_attached_test/head');
    $this->assertSession()
      ->responseHeaderEquals('X-Drupal-Cache', 'HIT');
    // Test ['#attached']['html_head_link'] when outputted as HTTP header.
    $this->drupalGet('/render_attached_test/html_header_link');
    $expected_link_headers = [
      '</foo?bar=<baz>&baz=false>; rel="alternate"',
      '</foo/bar>; hreflang="nl"; rel="alternate"',
      '</foo/bar>; hreflang="de"; rel="alternate"',
    ];
    $this->assertEquals($expected_link_headers, $this->getSession()
      ->getResponseHeaders()['Link']);
    // Check that duplicate alternate URLs with different hreflang attributes
    // are allowed.
    $this->assertSession()
      ->elementsCount('xpath', '//head/link[@rel="alternate"][@href="/foo/bar"]', 2);
  }
  
  /**
   * Tests caching of ['#attached'].
   */
  public function testRenderCachedBlock() : void {
    // Make sure our test block is visible.
    $this->drupalPlaceBlock('attached_rendering_block', [
      'region' => 'content',
    ]);
    // Get the front page, which should now have our visible block.
    $this->drupalGet('');
    // Make sure our block is visible.
    $this->assertSession()
      ->pageTextContains('Markup from attached_rendering_block.');
    // Test that all our attached items are present.
    $this->assertFeed();
    $this->assertHead();
    $this->assertSession()
      ->statusCodeEquals(418);
    $this->assertTeapotHeaders();
    // Reload the page, to test caching.
    $this->drupalGet('');
    // Make sure our block is visible.
    $this->assertSession()
      ->pageTextContains('Markup from attached_rendering_block.');
    // The header should be present again.
    $this->assertSession()
      ->responseHeaderEquals('X-Test-Teapot', 'Teapot Mode Active');
  }
  
  /**
   * Helper function to make assertions about added HTTP headers.
   *
   * @internal
   */
  protected function assertTeapotHeaders() : void {
    $this->assertSession()
      ->responseHeaderEquals('X-Test-Teapot', 'Teapot Mode Active');
    $this->assertSession()
      ->responseHeaderEquals('X-Test-Teapot-Replace', 'Teapot replaced');
    $this->assertSession()
      ->responseHeaderEquals('X-Test-Teapot-No-Replace', 'This value is not replaced');
  }
  
  /**
   * Helper function to make assertions about the presence of an RSS feed.
   *
   * @internal
   */
  protected function assertFeed() : void {
    // Discover the DOM element for the feed link.
    $test_meta = $this->xpath('//head/link[@href="test://url"]');
    $this->assertCount(1, $test_meta, 'Link has URL.');
    // Reconcile the other attributes.
    $test_meta_attributes = [
      'href' => 'test://url',
      'rel' => 'alternate',
      'type' => 'application/rss+xml',
      'title' => 'Your RSS feed.',
    ];
    $test_meta = reset($test_meta);
    if (empty($test_meta)) {
      $this->fail('Unable to find feed link.');
    }
    else {
      foreach ($test_meta_attributes as $attribute => $value) {
        $this->assertEquals($value, $test_meta->getAttribute($attribute));
      }
    }
  }
  
  /**
   * Helper function to make assertions about HTML head elements.
   *
   * @internal
   */
  protected function assertHead() : void {
    // Discover the DOM element for the meta link.
    $test_meta = $this->xpath('//head/meta[@test-attribute="test_value"]');
    $this->assertCount(1, $test_meta, 'There\'s only one test attribute.');
    // Grab the only DOM element.
    $test_meta = reset($test_meta);
    if (empty($test_meta)) {
      $this->fail('Unable to find the head meta.');
    }
    else {
      $this->assertEquals('test_value', $test_meta->getAttribute('test-attribute'));
    }
  }

}

Classes

Title Deprecated Summary
HtmlResponseAttachmentsTest Functional tests for HtmlResponseAttachmentsProcessor.

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