4 * This file is part of the Symfony package.
6 * (c) Fabien Potencier <fabien@symfony.com>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Symfony\Component\HttpKernel\Tests\Fragment;
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\HttpFoundation\RequestStack;
16 use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
17 use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
18 use Symfony\Component\HttpKernel\Controller\ControllerReference;
19 use Symfony\Component\HttpKernel\HttpKernel;
20 use Symfony\Component\HttpKernel\Fragment\InlineFragmentRenderer;
21 use Symfony\Component\HttpKernel\KernelEvents;
22 use Symfony\Component\HttpFoundation\Request;
23 use Symfony\Component\HttpFoundation\Response;
24 use Symfony\Component\EventDispatcher\EventDispatcher;
26 class InlineFragmentRendererTest extends TestCase
28 private $originalTrustedHeaderName;
30 protected function setUp()
32 $this->originalTrustedHeaderName = Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP);
35 protected function tearDown()
37 Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, $this->originalTrustedHeaderName);
40 public function testRender()
42 $strategy = new InlineFragmentRenderer($this->getKernel($this->returnValue(new Response('foo'))));
44 $this->assertEquals('foo', $strategy->render('/', Request::create('/'))->getContent());
47 public function testRenderWithControllerReference()
49 $strategy = new InlineFragmentRenderer($this->getKernel($this->returnValue(new Response('foo'))));
51 $this->assertEquals('foo', $strategy->render(new ControllerReference('main_controller', array(), array()), Request::create('/'))->getContent());
54 public function testRenderWithObjectsAsAttributes()
56 $object = new \stdClass();
58 $subRequest = Request::create('/_fragment?_path=_format%3Dhtml%26_locale%3Den%26_controller%3Dmain_controller');
59 $subRequest->attributes->replace(array('object' => $object, '_format' => 'html', '_controller' => 'main_controller', '_locale' => 'en'));
60 $subRequest->headers->set('x-forwarded-for', array('127.0.0.1'));
61 $subRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
63 $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($subRequest));
65 $this->assertSame('foo', $strategy->render(new ControllerReference('main_controller', array('object' => $object), array()), Request::create('/'))->getContent());
71 public function testRenderWithObjectsAsAttributesPassedAsObjectsInTheControllerLegacy()
73 $resolver = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver')->setMethods(array('getController'))->getMock();
75 ->expects($this->once())
76 ->method('getController')
77 ->will($this->returnValue(function (\stdClass $object, Bar $object1) {
78 return new Response($object1->getBar());
82 $kernel = new HttpKernel(new EventDispatcher(), $resolver, new RequestStack());
83 $renderer = new InlineFragmentRenderer($kernel);
85 $response = $renderer->render(new ControllerReference('main_controller', array('object' => new \stdClass(), 'object1' => new Bar()), array()), Request::create('/'));
86 $this->assertEquals('bar', $response->getContent());
92 public function testRenderWithObjectsAsAttributesPassedAsObjectsInTheController()
94 $resolver = $this->getMockBuilder(ControllerResolverInterface::class)->getMock();
96 ->expects($this->once())
97 ->method('getController')
98 ->will($this->returnValue(function (\stdClass $object, Bar $object1) {
99 return new Response($object1->getBar());
103 $kernel = new HttpKernel(new EventDispatcher(), $resolver, new RequestStack(), new ArgumentResolver());
104 $renderer = new InlineFragmentRenderer($kernel);
106 $response = $renderer->render(new ControllerReference('main_controller', array('object' => new \stdClass(), 'object1' => new Bar()), array()), Request::create('/'));
107 $this->assertEquals('bar', $response->getContent());
110 public function testRenderWithTrustedHeaderDisabled()
112 Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, '');
114 $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest(Request::create('/')));
115 $this->assertSame('foo', $strategy->render('/', Request::create('/'))->getContent());
119 * @expectedException \RuntimeException
121 public function testRenderExceptionNoIgnoreErrors()
123 $dispatcher = $this->getMockBuilder('Symfony\Component\EventDispatcher\EventDispatcherInterface')->getMock();
124 $dispatcher->expects($this->never())->method('dispatch');
126 $strategy = new InlineFragmentRenderer($this->getKernel($this->throwException(new \RuntimeException('foo'))), $dispatcher);
128 $this->assertEquals('foo', $strategy->render('/', Request::create('/'))->getContent());
131 public function testRenderExceptionIgnoreErrors()
133 $dispatcher = $this->getMockBuilder('Symfony\Component\EventDispatcher\EventDispatcherInterface')->getMock();
134 $dispatcher->expects($this->once())->method('dispatch')->with(KernelEvents::EXCEPTION);
136 $strategy = new InlineFragmentRenderer($this->getKernel($this->throwException(new \RuntimeException('foo'))), $dispatcher);
138 $this->assertEmpty($strategy->render('/', Request::create('/'), array('ignore_errors' => true))->getContent());
141 public function testRenderExceptionIgnoreErrorsWithAlt()
143 $strategy = new InlineFragmentRenderer($this->getKernel($this->onConsecutiveCalls(
144 $this->throwException(new \RuntimeException('foo')),
145 $this->returnValue(new Response('bar'))
148 $this->assertEquals('bar', $strategy->render('/', Request::create('/'), array('ignore_errors' => true, 'alt' => '/foo'))->getContent());
151 private function getKernel($returnValue)
153 $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
155 ->expects($this->any())
163 public function testExceptionInSubRequestsDoesNotMangleOutputBuffers()
165 $controllerResolver = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface')->getMock();
167 ->expects($this->once())
168 ->method('getController')
169 ->will($this->returnValue(function () {
172 throw new \RuntimeException();
176 $argumentResolver = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolverInterface')->getMock();
178 ->expects($this->once())
179 ->method('getArguments')
180 ->will($this->returnValue(array()))
183 $kernel = new HttpKernel(new EventDispatcher(), $controllerResolver, new RequestStack(), $argumentResolver);
184 $renderer = new InlineFragmentRenderer($kernel);
186 // simulate a main request with output buffering
190 // simulate a sub-request with output buffering and an exception
191 $renderer->render('/', Request::create('/'), array('ignore_errors' => true));
193 $this->assertEquals('Foo', ob_get_clean());
196 public function testESIHeaderIsKeptInSubrequest()
198 $expectedSubRequest = Request::create('/');
199 $expectedSubRequest->headers->set('Surrogate-Capability', 'abc="ESI/1.0"');
201 if (Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP)) {
202 $expectedSubRequest->headers->set('x-forwarded-for', array('127.0.0.1'));
203 $expectedSubRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
206 $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($expectedSubRequest));
208 $request = Request::create('/');
209 $request->headers->set('Surrogate-Capability', 'abc="ESI/1.0"');
210 $strategy->render('/', $request);
213 public function testESIHeaderIsKeptInSubrequestWithTrustedHeaderDisabled()
215 $trustedHeaderName = Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP);
216 Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, '');
218 $this->testESIHeaderIsKeptInSubrequest();
220 Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, $trustedHeaderName);
223 public function testHeadersPossiblyResultingIn304AreNotAssignedToSubrequest()
225 $expectedSubRequest = Request::create('/');
226 if (Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP)) {
227 $expectedSubRequest->headers->set('x-forwarded-for', array('127.0.0.1'));
228 $expectedSubRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
231 $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($expectedSubRequest));
232 $request = Request::create('/', 'GET', array(), array(), array(), array('HTTP_IF_MODIFIED_SINCE' => 'Fri, 01 Jan 2016 00:00:00 GMT', 'HTTP_IF_NONE_MATCH' => '*'));
233 $strategy->render('/', $request);
237 * Creates a Kernel expecting a request equals to $request
238 * Allows delta in comparison in case REQUEST_TIME changed by 1 second.
240 private function getKernelExpectingRequest(Request $request, $strict = false)
242 $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
244 ->expects($this->once())
246 ->with($this->equalTo($request, 1))
247 ->willReturn(new Response('foo'));
257 public function getBar()