InlineFragmentRendererTest.php 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Component\HttpKernel\Tests\Fragment;
  11. use Symfony\Component\HttpKernel\Controller\ControllerReference;
  12. use Symfony\Component\HttpKernel\HttpKernel;
  13. use Symfony\Component\HttpKernel\Fragment\InlineFragmentRenderer;
  14. use Symfony\Component\HttpKernel\KernelEvents;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\EventDispatcher\EventDispatcher;
  18. class InlineFragmentRendererTest extends \PHPUnit_Framework_TestCase
  19. {
  20. public function testRender()
  21. {
  22. $strategy = new InlineFragmentRenderer($this->getKernel($this->returnValue(new Response('foo'))));
  23. $this->assertEquals('foo', $strategy->render('/', Request::create('/'))->getContent());
  24. }
  25. public function testRenderWithControllerReference()
  26. {
  27. $strategy = new InlineFragmentRenderer($this->getKernel($this->returnValue(new Response('foo'))));
  28. $this->assertEquals('foo', $strategy->render(new ControllerReference('main_controller', array(), array()), Request::create('/'))->getContent());
  29. }
  30. public function testRenderWithObjectsAsAttributes()
  31. {
  32. $object = new \stdClass();
  33. $subRequest = Request::create('/_fragment?_path=_format%3Dhtml%26_locale%3Den%26_controller%3Dmain_controller');
  34. $subRequest->attributes->replace(array('object' => $object, '_format' => 'html', '_controller' => 'main_controller', '_locale' => 'en'));
  35. $subRequest->headers->set('x-forwarded-for', array('127.0.0.1'));
  36. $subRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
  37. $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($subRequest));
  38. $strategy->render(new ControllerReference('main_controller', array('object' => $object), array()), Request::create('/'));
  39. }
  40. public function testRenderWithObjectsAsAttributesPassedAsObjectsInTheController()
  41. {
  42. $resolver = $this->getMock('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver', array('getController'));
  43. $resolver
  44. ->expects($this->once())
  45. ->method('getController')
  46. ->will($this->returnValue(function (\stdClass $object, Bar $object1) {
  47. return new Response($object1->getBar());
  48. }))
  49. ;
  50. $kernel = new HttpKernel(new EventDispatcher(), $resolver);
  51. $renderer = new InlineFragmentRenderer($kernel);
  52. $response = $renderer->render(new ControllerReference('main_controller', array('object' => new \stdClass(), 'object1' => new Bar()), array()), Request::create('/'));
  53. $this->assertEquals('bar', $response->getContent());
  54. }
  55. public function testRenderWithTrustedHeaderDisabled()
  56. {
  57. $trustedHeaderName = Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP);
  58. Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, '');
  59. $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest(Request::create('/')));
  60. $strategy->render('/', Request::create('/'));
  61. Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, $trustedHeaderName);
  62. }
  63. /**
  64. * @expectedException \RuntimeException
  65. */
  66. public function testRenderExceptionNoIgnoreErrors()
  67. {
  68. $dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
  69. $dispatcher->expects($this->never())->method('dispatch');
  70. $strategy = new InlineFragmentRenderer($this->getKernel($this->throwException(new \RuntimeException('foo'))), $dispatcher);
  71. $this->assertEquals('foo', $strategy->render('/', Request::create('/'))->getContent());
  72. }
  73. public function testRenderExceptionIgnoreErrors()
  74. {
  75. $dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
  76. $dispatcher->expects($this->once())->method('dispatch')->with(KernelEvents::EXCEPTION);
  77. $strategy = new InlineFragmentRenderer($this->getKernel($this->throwException(new \RuntimeException('foo'))), $dispatcher);
  78. $this->assertEmpty($strategy->render('/', Request::create('/'), array('ignore_errors' => true))->getContent());
  79. }
  80. public function testRenderExceptionIgnoreErrorsWithAlt()
  81. {
  82. $strategy = new InlineFragmentRenderer($this->getKernel($this->onConsecutiveCalls(
  83. $this->throwException(new \RuntimeException('foo')),
  84. $this->returnValue(new Response('bar'))
  85. )));
  86. $this->assertEquals('bar', $strategy->render('/', Request::create('/'), array('ignore_errors' => true, 'alt' => '/foo'))->getContent());
  87. }
  88. private function getKernel($returnValue)
  89. {
  90. $kernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
  91. $kernel
  92. ->expects($this->any())
  93. ->method('handle')
  94. ->will($returnValue)
  95. ;
  96. return $kernel;
  97. }
  98. /**
  99. * Creates a Kernel expecting a request equals to $request
  100. * Allows delta in comparison in case REQUEST_TIME changed by 1 second.
  101. */
  102. private function getKernelExpectingRequest(Request $request)
  103. {
  104. $kernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
  105. $kernel
  106. ->expects($this->any())
  107. ->method('handle')
  108. ->with($this->equalTo($request, 1))
  109. ;
  110. return $kernel;
  111. }
  112. public function testExceptionInSubRequestsDoesNotMangleOutputBuffers()
  113. {
  114. $resolver = $this->getMock('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface');
  115. $resolver
  116. ->expects($this->once())
  117. ->method('getController')
  118. ->will($this->returnValue(function () {
  119. ob_start();
  120. echo 'bar';
  121. throw new \RuntimeException();
  122. }))
  123. ;
  124. $resolver
  125. ->expects($this->once())
  126. ->method('getArguments')
  127. ->will($this->returnValue(array()))
  128. ;
  129. $kernel = new HttpKernel(new EventDispatcher(), $resolver);
  130. $renderer = new InlineFragmentRenderer($kernel);
  131. // simulate a main request with output buffering
  132. ob_start();
  133. echo 'Foo';
  134. // simulate a sub-request with output buffering and an exception
  135. $renderer->render('/', Request::create('/'), array('ignore_errors' => true));
  136. $this->assertEquals('Foo', ob_get_clean());
  137. }
  138. public function testESIHeaderIsKeptInSubrequest()
  139. {
  140. $expectedSubRequest = Request::create('/');
  141. $expectedSubRequest->headers->set('Surrogate-Capability', 'abc="ESI/1.0"');
  142. if (Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP)) {
  143. $expectedSubRequest->headers->set('x-forwarded-for', array('127.0.0.1'));
  144. $expectedSubRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
  145. }
  146. $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($expectedSubRequest));
  147. $request = Request::create('/');
  148. $request->headers->set('Surrogate-Capability', 'abc="ESI/1.0"');
  149. $strategy->render('/', $request);
  150. }
  151. public function testESIHeaderIsKeptInSubrequestWithTrustedHeaderDisabled()
  152. {
  153. $trustedHeaderName = Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP);
  154. Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, '');
  155. $this->testESIHeaderIsKeptInSubrequest();
  156. Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, $trustedHeaderName);
  157. }
  158. public function testHeadersPossiblyResultingIn304AreNotAssignedToSubrequest()
  159. {
  160. $expectedSubRequest = Request::create('/');
  161. if (Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP)) {
  162. $expectedSubRequest->headers->set('x-forwarded-for', array('127.0.0.1'));
  163. $expectedSubRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
  164. }
  165. $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($expectedSubRequest));
  166. $request = Request::create('/', 'GET', array(), array(), array(), array('HTTP_IF_MODIFIED_SINCE' => 'Fri, 01 Jan 2016 00:00:00 GMT', 'HTTP_IF_NONE_MATCH' => '*'));
  167. $strategy->render('/', $request);
  168. }
  169. }
  170. class Bar
  171. {
  172. public $bar = 'bar';
  173. public function getBar()
  174. {
  175. return $this->bar;
  176. }
  177. }