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\HttpKernel\Controller\ControllerReference;
16 use Symfony\Component\HttpKernel\HttpKernel;
17 use Symfony\Component\HttpKernel\Fragment\InlineFragmentRenderer;
18 use Symfony\Component\HttpKernel\KernelEvents;
19 use Symfony\Component\HttpFoundation\Request;
20 use Symfony\Component\HttpFoundation\Response;
21 use Symfony\Component\EventDispatcher\EventDispatcher;
23 class InlineFragmentRendererTest extends TestCase
25 private $originalTrustedHeaderName;
27 protected function setUp()
29 $this->originalTrustedHeaderName = Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP);
32 protected function tearDown()
34 Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, $this->originalTrustedHeaderName);
37 public function testRender()
39 $strategy = new InlineFragmentRenderer($this->getKernel($this->returnValue(new Response('foo'))));
41 $this->assertEquals('foo', $strategy->render('/', Request::create('/'))->getContent());
44 public function testRenderWithControllerReference()
46 $strategy = new InlineFragmentRenderer($this->getKernel($this->returnValue(new Response('foo'))));
48 $this->assertEquals('foo', $strategy->render(new ControllerReference('main_controller', array(), array()), Request::create('/'))->getContent());
51 public function testRenderWithObjectsAsAttributes()
53 $object = new \stdClass();
55 $subRequest = Request::create('/_fragment?_path=_format%3Dhtml%26_locale%3Den%26_controller%3Dmain_controller');
56 $subRequest->attributes->replace(array('object' => $object, '_format' => 'html', '_controller' => 'main_controller', '_locale' => 'en'));
57 $subRequest->headers->set('x-forwarded-for', array('127.0.0.1'));
58 $subRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
60 $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($subRequest));
62 $this->assertSame('foo', $strategy->render(new ControllerReference('main_controller', array('object' => $object), array()), Request::create('/'))->getContent());
65 public function testRenderWithObjectsAsAttributesPassedAsObjectsInTheController()
67 $resolver = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver')->setMethods(array('getController'))->getMock();
69 ->expects($this->once())
70 ->method('getController')
71 ->will($this->returnValue(function (\stdClass $object, Bar $object1) {
72 return new Response($object1->getBar());
76 $kernel = new HttpKernel(new EventDispatcher(), $resolver);
77 $renderer = new InlineFragmentRenderer($kernel);
79 $response = $renderer->render(new ControllerReference('main_controller', array('object' => new \stdClass(), 'object1' => new Bar()), array()), Request::create('/'));
80 $this->assertEquals('bar', $response->getContent());
83 public function testRenderWithTrustedHeaderDisabled()
85 Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, '');
87 $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest(Request::create('/')));
88 $this->assertSame('foo', $strategy->render('/', Request::create('/'))->getContent());
92 * @expectedException \RuntimeException
94 public function testRenderExceptionNoIgnoreErrors()
96 $dispatcher = $this->getMockBuilder('Symfony\Component\EventDispatcher\EventDispatcherInterface')->getMock();
97 $dispatcher->expects($this->never())->method('dispatch');
99 $strategy = new InlineFragmentRenderer($this->getKernel($this->throwException(new \RuntimeException('foo'))), $dispatcher);
101 $this->assertEquals('foo', $strategy->render('/', Request::create('/'))->getContent());
104 public function testRenderExceptionIgnoreErrors()
106 $dispatcher = $this->getMockBuilder('Symfony\Component\EventDispatcher\EventDispatcherInterface')->getMock();
107 $dispatcher->expects($this->once())->method('dispatch')->with(KernelEvents::EXCEPTION);
109 $strategy = new InlineFragmentRenderer($this->getKernel($this->throwException(new \RuntimeException('foo'))), $dispatcher);
111 $this->assertEmpty($strategy->render('/', Request::create('/'), array('ignore_errors' => true))->getContent());
114 public function testRenderExceptionIgnoreErrorsWithAlt()
116 $strategy = new InlineFragmentRenderer($this->getKernel($this->onConsecutiveCalls(
117 $this->throwException(new \RuntimeException('foo')),
118 $this->returnValue(new Response('bar'))
121 $this->assertEquals('bar', $strategy->render('/', Request::create('/'), array('ignore_errors' => true, 'alt' => '/foo'))->getContent());
124 private function getKernel($returnValue)
126 $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
128 ->expects($this->any())
136 public function testExceptionInSubRequestsDoesNotMangleOutputBuffers()
138 $resolver = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface')->getMock();
140 ->expects($this->once())
141 ->method('getController')
142 ->will($this->returnValue(function () {
145 throw new \RuntimeException();
149 ->expects($this->once())
150 ->method('getArguments')
151 ->will($this->returnValue(array()))
154 $kernel = new HttpKernel(new EventDispatcher(), $resolver);
155 $renderer = new InlineFragmentRenderer($kernel);
157 // simulate a main request with output buffering
161 // simulate a sub-request with output buffering and an exception
162 $renderer->render('/', Request::create('/'), array('ignore_errors' => true));
164 $this->assertEquals('Foo', ob_get_clean());
167 public function testESIHeaderIsKeptInSubrequest()
169 $expectedSubRequest = Request::create('/');
170 $expectedSubRequest->headers->set('Surrogate-Capability', 'abc="ESI/1.0"');
172 if (Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP)) {
173 $expectedSubRequest->headers->set('x-forwarded-for', array('127.0.0.1'));
174 $expectedSubRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
177 $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($expectedSubRequest));
179 $request = Request::create('/');
180 $request->headers->set('Surrogate-Capability', 'abc="ESI/1.0"');
181 $strategy->render('/', $request);
184 public function testESIHeaderIsKeptInSubrequestWithTrustedHeaderDisabled()
186 $trustedHeaderName = Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP);
187 Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, '');
189 $this->testESIHeaderIsKeptInSubrequest();
191 Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, $trustedHeaderName);
194 public function testHeadersPossiblyResultingIn304AreNotAssignedToSubrequest()
196 $expectedSubRequest = Request::create('/');
197 if (Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP)) {
198 $expectedSubRequest->headers->set('x-forwarded-for', array('127.0.0.1'));
199 $expectedSubRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
202 $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($expectedSubRequest));
203 $request = Request::create('/', 'GET', array(), array(), array(), array('HTTP_IF_MODIFIED_SINCE' => 'Fri, 01 Jan 2016 00:00:00 GMT', 'HTTP_IF_NONE_MATCH' => '*'));
204 $strategy->render('/', $request);
208 * Creates a Kernel expecting a request equals to $request
209 * Allows delta in comparison in case REQUEST_TIME changed by 1 second.
211 private function getKernelExpectingRequest(Request $request, $strict = false)
213 $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
215 ->expects($this->once())
217 ->with($this->equalTo($request, 1))
218 ->willReturn(new Response('foo'));
228 public function getBar()