class TwigExtensionTest in Zircon Profile 8
Same name in this branch
- 8 core/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php \Drupal\Tests\Core\Template\TwigExtensionTest
 - 8 core/modules/system/src/Tests/Theme/TwigExtensionTest.php \Drupal\system\Tests\Theme\TwigExtensionTest
 
Same name and namespace in other branches
- 8.0 core/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php \Drupal\Tests\Core\Template\TwigExtensionTest
 
Tests the twig extension.
@group Template
@coversDefaultClass \Drupal\Core\Template\TwigExtension
Hierarchy
- class \Drupal\Tests\UnitTestCase extends \Drupal\Tests\PHPUnit_Framework_TestCase
- class \Drupal\Tests\Core\Template\TwigExtensionTest
 
 
Expanded class hierarchy of TwigExtensionTest
File
- core/
tests/ Drupal/ Tests/ Core/ Template/ TwigExtensionTest.php, line 25  - Contains \Drupal\Tests\Core\Template\TwigExtensionTest.
 
Namespace
Drupal\Tests\Core\TemplateView source
class TwigExtensionTest extends UnitTestCase {
  /**
   * Tests the escaping
   *
   * @dataProvider providerTestEscaping
   */
  public function testEscaping($template, $expected) {
    $renderer = $this
      ->getMock('\\Drupal\\Core\\Render\\RendererInterface');
    $twig = new \Twig_Environment(NULL, array(
      'debug' => TRUE,
      'cache' => FALSE,
      'autoescape' => 'html',
      'optimizations' => 0,
    ));
    $twig
      ->addExtension((new TwigExtension($renderer))
      ->setUrlGenerator($this
      ->getMock('Drupal\\Core\\Routing\\UrlGeneratorInterface')));
    $nodes = $twig
      ->parse($twig
      ->tokenize($template));
    $this
      ->assertSame($expected, $nodes
      ->getNode('body')
      ->getNode(0)
      ->getNode('expr') instanceof \Twig_Node_Expression_Filter);
  }
  /**
   * Provides tests data for testEscaping
   *
   * @return array
   *   An array of test data each containing of a twig template string and
   *   a boolean expecting whether the path will be safe.
   */
  public function providerTestEscaping() {
    return array(
      array(
        '{{ path("foo") }}',
        FALSE,
      ),
      array(
        '{{ path("foo", {}) }}',
        FALSE,
      ),
      array(
        '{{ path("foo", { foo: "foo" }) }}',
        FALSE,
      ),
      array(
        '{{ path("foo", foo) }}',
        TRUE,
      ),
      array(
        '{{ path("foo", { foo: foo }) }}',
        TRUE,
      ),
      array(
        '{{ path("foo", { foo: ["foo", "bar"] }) }}',
        TRUE,
      ),
      array(
        '{{ path("foo", { foo: "foo", bar: "bar" }) }}',
        TRUE,
      ),
      array(
        '{{ path(name = "foo", parameters = {}) }}',
        FALSE,
      ),
      array(
        '{{ path(name = "foo", parameters = { foo: "foo" }) }}',
        FALSE,
      ),
      array(
        '{{ path(name = "foo", parameters = foo) }}',
        TRUE,
      ),
      array(
        '{{ path(name = "foo", parameters = { foo: ["foo", "bar"] }) }}',
        TRUE,
      ),
      array(
        '{{ path(name = "foo", parameters = { foo: foo }) }}',
        TRUE,
      ),
      array(
        '{{ path(name = "foo", parameters = { foo: "foo", bar: "bar" }) }}',
        TRUE,
      ),
    );
  }
  /**
   * Tests the active_theme function.
   */
  public function testActiveTheme() {
    $renderer = $this
      ->getMock('\\Drupal\\Core\\Render\\RendererInterface');
    $extension = new TwigExtension($renderer);
    $theme_manager = $this
      ->getMock('\\Drupal\\Core\\Theme\\ThemeManagerInterface');
    $active_theme = $this
      ->getMockBuilder('\\Drupal\\Core\\Theme\\ActiveTheme')
      ->disableOriginalConstructor()
      ->getMock();
    $active_theme
      ->expects($this
      ->once())
      ->method('getName')
      ->willReturn('test_theme');
    $theme_manager
      ->expects($this
      ->once())
      ->method('getActiveTheme')
      ->willReturn($active_theme);
    $extension
      ->setThemeManager($theme_manager);
    $loader = new \Twig_Loader_String();
    $twig = new \Twig_Environment($loader);
    $twig
      ->addExtension($extension);
    $result = $twig
      ->render('{{ active_theme() }}');
    $this
      ->assertEquals('test_theme', $result);
  }
  /**
   * Tests the format_date filter.
   */
  public function testFormatDate() {
    $date_formatter = $this
      ->getMockBuilder('\\Drupal\\Core\\Datetime\\DateFormatter')
      ->disableOriginalConstructor()
      ->getMock();
    $date_formatter
      ->expects($this
      ->exactly(2))
      ->method('format')
      ->willReturn('1978-11-19');
    $renderer = $this
      ->getMock('\\Drupal\\Core\\Render\\RendererInterface');
    $extension = new TwigExtension($renderer);
    $extension
      ->setDateFormatter($date_formatter);
    $loader = new StringLoader();
    $twig = new \Twig_Environment($loader);
    $twig
      ->addExtension($extension);
    $result = $twig
      ->render('{{ time|format_date("html_date") }}');
    $this
      ->assertEquals($date_formatter
      ->format('html_date'), $result);
  }
  /**
   * Tests the active_theme_path function.
   */
  public function testActiveThemePath() {
    $renderer = $this
      ->getMock('\\Drupal\\Core\\Render\\RendererInterface');
    $extension = new TwigExtension($renderer);
    $theme_manager = $this
      ->getMock('\\Drupal\\Core\\Theme\\ThemeManagerInterface');
    $active_theme = $this
      ->getMockBuilder('\\Drupal\\Core\\Theme\\ActiveTheme')
      ->disableOriginalConstructor()
      ->getMock();
    $active_theme
      ->expects($this
      ->once())
      ->method('getPath')
      ->willReturn('foo/bar');
    $theme_manager
      ->expects($this
      ->once())
      ->method('getActiveTheme')
      ->willReturn($active_theme);
    $extension
      ->setThemeManager($theme_manager);
    $loader = new \Twig_Loader_String();
    $twig = new \Twig_Environment($loader);
    $twig
      ->addExtension($extension);
    $result = $twig
      ->render('{{ active_theme_path() }}');
    $this
      ->assertEquals('foo/bar', $result);
  }
  /**
   * Tests the escaping of objects implementing MarkupInterface.
   *
   * @covers ::escapeFilter
   */
  public function testSafeStringEscaping() {
    $renderer = $this
      ->getMock('\\Drupal\\Core\\Render\\RendererInterface');
    $twig = new \Twig_Environment(NULL, array(
      'debug' => TRUE,
      'cache' => FALSE,
      'autoescape' => 'html',
      'optimizations' => 0,
    ));
    $twig_extension = new TwigExtension($renderer);
    // By default, TwigExtension will attempt to cast objects to strings.
    // Ensure objects that implement MarkupInterface are unchanged.
    $safe_string = $this
      ->getMock('\\Drupal\\Component\\Render\\MarkupInterface');
    $this
      ->assertSame($safe_string, $twig_extension
      ->escapeFilter($twig, $safe_string, 'html', 'UTF-8', TRUE));
    // Ensure objects that do not implement MarkupInterface are escaped.
    $string_object = new TwigExtensionTestString("<script>alert('here');</script>");
    $this
      ->assertSame('<script>alert('here');</script>', $twig_extension
      ->escapeFilter($twig, $string_object, 'html', 'UTF-8', TRUE));
  }
  /**
   * @covers ::safeJoin
   */
  public function testSafeJoin() {
    $renderer = $this
      ->prophesize(RendererInterface::class);
    $renderer
      ->render([
      '#markup' => '<strong>will be rendered</strong>',
      '#printed' => FALSE,
    ])
      ->willReturn('<strong>will be rendered</strong>');
    $renderer = $renderer
      ->reveal();
    $twig_extension = new TwigExtension($renderer);
    $twig_environment = $this
      ->prophesize(TwigEnvironment::class)
      ->reveal();
    // Simulate t().
    $markup = $this
      ->prophesize(TranslatableMarkup::class);
    $markup
      ->__toString()
      ->willReturn('<em>will be markup</em>');
    $markup = $markup
      ->reveal();
    $items = [
      '<em>will be escaped</em>',
      $markup,
      [
        '#markup' => '<strong>will be rendered</strong>',
      ],
    ];
    $result = $twig_extension
      ->safeJoin($twig_environment, $items, '<br/>');
    $this
      ->assertEquals('<em>will be escaped</em><br/><em>will be markup</em><br/><strong>will be rendered</strong>', $result);
    // Ensure safe_join Twig filter supports Traversable variables.
    $items = new \ArrayObject([
      '<em>will be escaped</em>',
      $markup,
      [
        '#markup' => '<strong>will be rendered</strong>',
      ],
    ]);
    $result = $twig_extension
      ->safeJoin($twig_environment, $items, ', ');
    $this
      ->assertEquals('<em>will be escaped</em>, <em>will be markup</em>, <strong>will be rendered</strong>', $result);
    // Ensure safe_join Twig filter supports empty variables.
    $items = NULL;
    $result = $twig_extension
      ->safeJoin($twig_environment, $items, '<br>');
    $this
      ->assertEmpty($result);
  }
  /**
   * @dataProvider providerTestRenderVar
   */
  public function testRenderVar($result, $input) {
    $renderer = $this
      ->prophesize(RendererInterface::class);
    $renderer
      ->render($result += [
      '#printed' => FALSE,
    ])
      ->willReturn('Rendered output');
    $renderer = $renderer
      ->reveal();
    $twig_extension = new TwigExtension($renderer);
    $this
      ->assertEquals('Rendered output', $twig_extension
      ->renderVar($input));
  }
  public function providerTestRenderVar() {
    $data = [];
    $renderable = $this
      ->prophesize(RenderableInterface::class);
    $render_array = [
      '#type' => 'test',
      '#var' => 'giraffe',
    ];
    $renderable
      ->toRenderable()
      ->willReturn($render_array);
    $data['renderable'] = [
      $render_array,
      $renderable
        ->reveal(),
    ];
    return $data;
  }
}Members
| 
            Name | 
                  Modifiers | Type | Description | Overrides | 
|---|---|---|---|---|
| 
            TwigExtensionTest:: | 
                  public | function | Provides tests data for testEscaping | |
| 
            TwigExtensionTest:: | 
                  public | function | ||
| 
            TwigExtensionTest:: | 
                  public | function | Tests the active_theme function. | |
| 
            TwigExtensionTest:: | 
                  public | function | Tests the active_theme_path function. | |
| 
            TwigExtensionTest:: | 
                  public | function | Tests the escaping | |
| 
            TwigExtensionTest:: | 
                  public | function | Tests the format_date filter. | |
| 
            TwigExtensionTest:: | 
                  public | function | @dataProvider providerTestRenderVar | |
| 
            TwigExtensionTest:: | 
                  public | function | @covers ::safeJoin | |
| 
            TwigExtensionTest:: | 
                  public | function | Tests the escaping of objects implementing MarkupInterface. | |
| 
            UnitTestCase:: | 
                  protected | property | The random generator. | |
| 
            UnitTestCase:: | 
                  protected | property | The app root. | |
| 
            UnitTestCase:: | 
                  protected | function | Asserts if two arrays are equal by sorting them first. | |
| 
            UnitTestCase:: | 
                  protected | function | Mocks a block with a block plugin. | |
| 
            UnitTestCase:: | 
                  protected | function | Returns a stub class resolver. | |
| 
            UnitTestCase:: | 
                  public | function | Returns a stub config factory that behaves according to the passed in array. | |
| 
            UnitTestCase:: | 
                  public | function | Returns a stub config storage that returns the supplied configuration. | |
| 
            UnitTestCase:: | 
                  protected | function | Sets up a container with a cache tags invalidator. | |
| 
            UnitTestCase:: | 
                  protected | function | Gets the random generator for the utility methods. | |
| 
            UnitTestCase:: | 
                  public | function | Returns a stub translation manager that just returns the passed string. | |
| 
            UnitTestCase:: | 
                  public | function | Generates a unique random string containing letters and numbers. | |
| 
            UnitTestCase:: | 
                  protected | function | 259 |