InlineFragmentRendererTest.php

Namespace

Symfony\Component\HttpKernel\Fragment\Tests\FragmentRenderer

File

drupal/core/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php
View source
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace Symfony\Component\HttpKernel\Fragment\Tests\FragmentRenderer;

use Symfony\Component\HttpKernel\Controller\ControllerReference;
use Symfony\Component\HttpKernel\HttpKernel;
use Symfony\Component\HttpKernel\Fragment\InlineFragmentRenderer;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\EventDispatcher\EventDispatcher;
class InlineFragmentRendererTest extends \PHPUnit_Framework_TestCase {
  protected function setUp() {
    if (!class_exists('Symfony\\Component\\EventDispatcher\\EventDispatcher')) {
      $this
        ->markTestSkipped('The "EventDispatcher" component is not available');
    }
    if (!class_exists('Symfony\\Component\\HttpFoundation\\Request')) {
      $this
        ->markTestSkipped('The "HttpFoundation" component is not available');
    }
  }
  public function testRender() {
    $strategy = new InlineFragmentRenderer($this
      ->getKernel($this
      ->returnValue(new Response('foo'))));
    $this
      ->assertEquals('foo', $strategy
      ->render('/', Request::create('/'))
      ->getContent());
  }
  public function testRenderWithControllerReference() {
    $strategy = new InlineFragmentRenderer($this
      ->getKernel($this
      ->returnValue(new Response('foo'))));
    $this
      ->assertEquals('foo', $strategy
      ->render(new ControllerReference('main_controller', array(), array()), Request::create('/'))
      ->getContent());
  }
  public function testRenderWithObjectsAsAttributes() {
    $object = new \stdClass();
    $subRequest = Request::create('/_fragment?_path=_format%3Dhtml%26_controller%3Dmain_controller');
    $subRequest->attributes
      ->replace(array(
      'object' => $object,
      '_format' => 'html',
      '_controller' => 'main_controller',
    ));
    $subRequest->headers
      ->set('x-forwarded-for', array(
      '127.0.0.1',
    ));
    $subRequest->server
      ->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
    $kernel = $this
      ->getMock('Symfony\\Component\\HttpKernel\\HttpKernelInterface');
    $kernel
      ->expects($this
      ->any())
      ->method('handle')
      ->with($subRequest);
    $strategy = new InlineFragmentRenderer($kernel);
    $strategy
      ->render(new ControllerReference('main_controller', array(
      'object' => $object,
    ), array()), Request::create('/'));
  }

  /**
   * @expectedException \RuntimeException
   */
  public function testRenderExceptionNoIgnoreErrors() {
    $dispatcher = $this
      ->getMock('Symfony\\Component\\EventDispatcher\\EventDispatcherInterface');
    $dispatcher
      ->expects($this
      ->never())
      ->method('dispatch');
    $strategy = new InlineFragmentRenderer($this
      ->getKernel($this
      ->throwException(new \RuntimeException('foo'))), $dispatcher);
    $this
      ->assertEquals('foo', $strategy
      ->render('/', Request::create('/'))
      ->getContent());
  }
  public function testRenderExceptionIgnoreErrors() {
    $dispatcher = $this
      ->getMock('Symfony\\Component\\EventDispatcher\\EventDispatcherInterface');
    $dispatcher
      ->expects($this
      ->once())
      ->method('dispatch')
      ->with(KernelEvents::EXCEPTION);
    $strategy = new InlineFragmentRenderer($this
      ->getKernel($this
      ->throwException(new \RuntimeException('foo'))), $dispatcher);
    $this
      ->assertEmpty($strategy
      ->render('/', Request::create('/'), array(
      'ignore_errors' => true,
    ))
      ->getContent());
  }
  public function testRenderExceptionIgnoreErrorsWithAlt() {
    $strategy = new InlineFragmentRenderer($this
      ->getKernel($this
      ->onConsecutiveCalls($this
      ->throwException(new \RuntimeException('foo')), $this
      ->returnValue(new Response('bar')))));
    $this
      ->assertEquals('bar', $strategy
      ->render('/', Request::create('/'), array(
      'ignore_errors' => true,
      'alt' => '/foo',
    ))
      ->getContent());
  }
  private function getKernel($returnValue) {
    $kernel = $this
      ->getMock('Symfony\\Component\\HttpKernel\\HttpKernelInterface');
    $kernel
      ->expects($this
      ->any())
      ->method('handle')
      ->will($returnValue);
    return $kernel;
  }
  public function testExceptionInSubRequestsDoesNotMangleOutputBuffers() {
    $resolver = $this
      ->getMock('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface');
    $resolver
      ->expects($this
      ->once())
      ->method('getController')
      ->will($this
      ->returnValue(function () {
      ob_start();
      echo 'bar';
      throw new \RuntimeException();
    }));
    $resolver
      ->expects($this
      ->once())
      ->method('getArguments')
      ->will($this
      ->returnValue(array()));
    $kernel = new HttpKernel(new EventDispatcher(), $resolver);
    $renderer = new InlineFragmentRenderer($kernel);

    // simulate a main request with output buffering
    ob_start();
    echo 'Foo';

    // simulate a sub-request with output buffering and an exception
    $renderer
      ->render('/', Request::create('/'), array(
      'ignore_errors' => true,
    ));
    $this
      ->assertEquals('Foo', ob_get_clean());
  }
  public function testESIHeaderIsKeptInSubrequest() {
    $expectedSubRequest = Request::create('/');
    $expectedSubRequest->headers
      ->set('Surrogate-Capability', 'abc="ESI/1.0"');
    $expectedSubRequest->headers
      ->set('x-forwarded-for', array(
      '127.0.0.1',
    ));
    $expectedSubRequest->server
      ->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
    $kernel = $this
      ->getMock('Symfony\\Component\\HttpKernel\\HttpKernelInterface');
    $kernel
      ->expects($this
      ->any())
      ->method('handle')
      ->with($expectedSubRequest);
    $strategy = new InlineFragmentRenderer($kernel);
    $request = Request::create('/');
    $request->headers
      ->set('Surrogate-Capability', 'abc="ESI/1.0"');
    $strategy
      ->render('/', $request);
  }

}

Classes