PageRenderTime 31ms CodeModel.GetById 8ms RepoModel.GetById 1ms app.codeStats 0ms

/vendor/symfony/http-kernel/Tests/Fragment/InlineFragmentRendererTest.php

https://gitlab.com/wormen/client.mastodont-engine
PHP | 239 lines | 168 code | 48 blank | 23 comment | 1 complexity | 34a5bd9a5d416c577df34ad27d926d78 MD5 | raw file
  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\HttpFoundation\RequestStack;
  12. use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
  13. use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
  14. use Symfony\Component\HttpKernel\Controller\ControllerReference;
  15. use Symfony\Component\HttpKernel\HttpKernel;
  16. use Symfony\Component\HttpKernel\Fragment\InlineFragmentRenderer;
  17. use Symfony\Component\HttpKernel\KernelEvents;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\EventDispatcher\EventDispatcher;
  21. class InlineFragmentRendererTest extends \PHPUnit_Framework_TestCase
  22. {
  23. public function testRender()
  24. {
  25. $strategy = new InlineFragmentRenderer($this->getKernel($this->returnValue(new Response('foo'))));
  26. $this->assertEquals('foo', $strategy->render('/', Request::create('/'))->getContent());
  27. }
  28. public function testRenderWithControllerReference()
  29. {
  30. $strategy = new InlineFragmentRenderer($this->getKernel($this->returnValue(new Response('foo'))));
  31. $this->assertEquals('foo', $strategy->render(new ControllerReference('main_controller', array(), array()), Request::create('/'))->getContent());
  32. }
  33. public function testRenderWithObjectsAsAttributes()
  34. {
  35. $object = new \stdClass();
  36. $subRequest = Request::create('/_fragment?_path=_format%3Dhtml%26_locale%3Den%26_controller%3Dmain_controller');
  37. $subRequest->attributes->replace(array('object' => $object, '_format' => 'html', '_controller' => 'main_controller', '_locale' => 'en'));
  38. $subRequest->headers->set('x-forwarded-for', array('127.0.0.1'));
  39. $subRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
  40. $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($subRequest));
  41. $strategy->render(new ControllerReference('main_controller', array('object' => $object), array()), Request::create('/'));
  42. }
  43. /**
  44. * @group legacy
  45. */
  46. public function testRenderWithObjectsAsAttributesPassedAsObjectsInTheControllerLegacy()
  47. {
  48. $resolver = $this->getMock('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver', array('getController'));
  49. $resolver
  50. ->expects($this->once())
  51. ->method('getController')
  52. ->will($this->returnValue(function (\stdClass $object, Bar $object1) {
  53. return new Response($object1->getBar());
  54. }))
  55. ;
  56. $kernel = new HttpKernel(new EventDispatcher(), $resolver, new RequestStack());
  57. $renderer = new InlineFragmentRenderer($kernel);
  58. $response = $renderer->render(new ControllerReference('main_controller', array('object' => new \stdClass(), 'object1' => new Bar()), array()), Request::create('/'));
  59. $this->assertEquals('bar', $response->getContent());
  60. }
  61. /**
  62. * @group legacy
  63. */
  64. public function testRenderWithObjectsAsAttributesPassedAsObjectsInTheController()
  65. {
  66. $resolver = $this->getMock(ControllerResolverInterface::class);
  67. $resolver
  68. ->expects($this->once())
  69. ->method('getController')
  70. ->will($this->returnValue(function (\stdClass $object, Bar $object1) {
  71. return new Response($object1->getBar());
  72. }))
  73. ;
  74. $kernel = new HttpKernel(new EventDispatcher(), $resolver, new RequestStack(), new ArgumentResolver());
  75. $renderer = new InlineFragmentRenderer($kernel);
  76. $response = $renderer->render(new ControllerReference('main_controller', array('object' => new \stdClass(), 'object1' => new Bar()), array()), Request::create('/'));
  77. $this->assertEquals('bar', $response->getContent());
  78. }
  79. public function testRenderWithTrustedHeaderDisabled()
  80. {
  81. $trustedHeaderName = Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP);
  82. Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, '');
  83. $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest(Request::create('/')));
  84. $strategy->render('/', Request::create('/'));
  85. Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, $trustedHeaderName);
  86. }
  87. /**
  88. * @expectedException \RuntimeException
  89. */
  90. public function testRenderExceptionNoIgnoreErrors()
  91. {
  92. $dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
  93. $dispatcher->expects($this->never())->method('dispatch');
  94. $strategy = new InlineFragmentRenderer($this->getKernel($this->throwException(new \RuntimeException('foo'))), $dispatcher);
  95. $this->assertEquals('foo', $strategy->render('/', Request::create('/'))->getContent());
  96. }
  97. public function testRenderExceptionIgnoreErrors()
  98. {
  99. $dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
  100. $dispatcher->expects($this->once())->method('dispatch')->with(KernelEvents::EXCEPTION);
  101. $strategy = new InlineFragmentRenderer($this->getKernel($this->throwException(new \RuntimeException('foo'))), $dispatcher);
  102. $this->assertEmpty($strategy->render('/', Request::create('/'), array('ignore_errors' => true))->getContent());
  103. }
  104. public function testRenderExceptionIgnoreErrorsWithAlt()
  105. {
  106. $strategy = new InlineFragmentRenderer($this->getKernel($this->onConsecutiveCalls(
  107. $this->throwException(new \RuntimeException('foo')),
  108. $this->returnValue(new Response('bar'))
  109. )));
  110. $this->assertEquals('bar', $strategy->render('/', Request::create('/'), array('ignore_errors' => true, 'alt' => '/foo'))->getContent());
  111. }
  112. private function getKernel($returnValue)
  113. {
  114. $kernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
  115. $kernel
  116. ->expects($this->any())
  117. ->method('handle')
  118. ->will($returnValue)
  119. ;
  120. return $kernel;
  121. }
  122. /**
  123. * Creates a Kernel expecting a request equals to $request
  124. * Allows delta in comparison in case REQUEST_TIME changed by 1 second.
  125. */
  126. private function getKernelExpectingRequest(Request $request)
  127. {
  128. $kernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
  129. $kernel
  130. ->expects($this->any())
  131. ->method('handle')
  132. ->with($this->equalTo($request, 1))
  133. ;
  134. return $kernel;
  135. }
  136. public function testExceptionInSubRequestsDoesNotMangleOutputBuffers()
  137. {
  138. $controllerResolver = $this->getMock('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface');
  139. $controllerResolver
  140. ->expects($this->once())
  141. ->method('getController')
  142. ->will($this->returnValue(function () {
  143. ob_start();
  144. echo 'bar';
  145. throw new \RuntimeException();
  146. }))
  147. ;
  148. $argumentResolver = $this->getMock('Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolverInterface');
  149. $argumentResolver
  150. ->expects($this->once())
  151. ->method('getArguments')
  152. ->will($this->returnValue(array()))
  153. ;
  154. $kernel = new HttpKernel(new EventDispatcher(), $controllerResolver, new RequestStack(), $argumentResolver);
  155. $renderer = new InlineFragmentRenderer($kernel);
  156. // simulate a main request with output buffering
  157. ob_start();
  158. echo 'Foo';
  159. // simulate a sub-request with output buffering and an exception
  160. $renderer->render('/', Request::create('/'), array('ignore_errors' => true));
  161. $this->assertEquals('Foo', ob_get_clean());
  162. }
  163. public function testESIHeaderIsKeptInSubrequest()
  164. {
  165. $expectedSubRequest = Request::create('/');
  166. $expectedSubRequest->headers->set('Surrogate-Capability', 'abc="ESI/1.0"');
  167. if (Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP)) {
  168. $expectedSubRequest->headers->set('x-forwarded-for', array('127.0.0.1'));
  169. $expectedSubRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
  170. }
  171. $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($expectedSubRequest));
  172. $request = Request::create('/');
  173. $request->headers->set('Surrogate-Capability', 'abc="ESI/1.0"');
  174. $strategy->render('/', $request);
  175. }
  176. public function testESIHeaderIsKeptInSubrequestWithTrustedHeaderDisabled()
  177. {
  178. $trustedHeaderName = Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP);
  179. Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, '');
  180. $this->testESIHeaderIsKeptInSubrequest();
  181. Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, $trustedHeaderName);
  182. }
  183. }
  184. class Bar
  185. {
  186. public $bar = 'bar';
  187. public function getBar()
  188. {
  189. return $this->bar;
  190. }
  191. }