HttpKernelTest.php 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien.potencier@symfony-project.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\Tests\Component\HttpKernel;
  11. use Symfony\Component\HttpKernel\HttpKernel;
  12. use Symfony\Component\HttpKernel\HttpKernelInterface;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\EventDispatcher\EventDispatcher;
  16. class HttpKernelTest extends \PHPUnit_Framework_TestCase
  17. {
  18. /**
  19. * @expectedException RuntimeException
  20. */
  21. public function testHandleWhenControllerThrowsAnExceptionAndRawIsTrue()
  22. {
  23. $kernel = new HttpKernel(new EventDispatcher(), $this->getResolver(function () { throw new \RuntimeException(); }));
  24. $kernel->handle(new Request(), HttpKernelInterface::MASTER_REQUEST, true);
  25. }
  26. /**
  27. * @expectedException RuntimeException
  28. */
  29. public function testHandleWhenControllerThrowsAnExceptionAndRawIsFalseAndNoListenerIsRegistered()
  30. {
  31. $kernel = new HttpKernel(new EventDispatcher(), $this->getResolver(function () { throw new \RuntimeException(); }));
  32. $kernel->handle(new Request(), HttpKernelInterface::MASTER_REQUEST, false);
  33. }
  34. public function testHandleWhenControllerThrowsAnExceptionAndRawIsFalse()
  35. {
  36. $dispatcher = new EventDispatcher();
  37. $dispatcher->connect('core.exception', function ($event)
  38. {
  39. $event->setReturnValue(new Response($event->get('exception')->getMessage()));
  40. return true;
  41. });
  42. $kernel = new HttpKernel($dispatcher, $this->getResolver(function () { throw new \RuntimeException('foo'); }));
  43. $this->assertEquals('foo', $kernel->handle(new Request())->getContent());
  44. }
  45. public function testHandleWhenAListenerReturnsAResponse()
  46. {
  47. $dispatcher = new EventDispatcher();
  48. $dispatcher->connect('core.request', function ($event)
  49. {
  50. $event->setReturnValue(new Response('hello'));
  51. return true;
  52. });
  53. $kernel = new HttpKernel($dispatcher, $this->getResolver());
  54. $this->assertEquals('hello', $kernel->handle(new Request())->getContent());
  55. }
  56. /**
  57. * @expectedException Symfony\Component\HttpKernel\Exception\NotFoundHttpException
  58. */
  59. public function testHandleWhenNoControllerIsFound()
  60. {
  61. $dispatcher = new EventDispatcher();
  62. $kernel = new HttpKernel($dispatcher, $this->getResolver(false));
  63. $kernel->handle(new Request());
  64. }
  65. /**
  66. * @expectedException LogicException
  67. */
  68. public function testHandleWhenNoControllerIsNotACallable()
  69. {
  70. $dispatcher = new EventDispatcher();
  71. $kernel = new HttpKernel($dispatcher, $this->getResolver('foobar'));
  72. $kernel->handle(new Request());
  73. }
  74. /**
  75. * @expectedException RuntimeException
  76. */
  77. public function testHandleWhenControllerDoesNotReturnAResponse()
  78. {
  79. $dispatcher = new EventDispatcher();
  80. $kernel = new HttpKernel($dispatcher, $this->getResolver(function () { return 'foo'; }));
  81. $kernel->handle(new Request());
  82. }
  83. public function testHandleWhenControllerDoesNotReturnAResponseButAViewIsRegistered()
  84. {
  85. $dispatcher = new EventDispatcher();
  86. $dispatcher->connect('core.view', function ($event, $retval)
  87. {
  88. return new Response($retval);
  89. });
  90. $kernel = new HttpKernel($dispatcher, $this->getResolver(function () { return 'foo'; }));
  91. $this->assertEquals('foo', $kernel->handle(new Request())->getContent());
  92. }
  93. /**
  94. * @expectedException RuntimeException
  95. */
  96. public function testHandleWhenAViewDoesNotReturnAResponse()
  97. {
  98. $dispatcher = new EventDispatcher();
  99. $dispatcher->connect('core.view', function ($event, $retval)
  100. {
  101. return $retval;
  102. });
  103. $kernel = new HttpKernel($dispatcher, $this->getResolver(function () { return 'foo'; }));
  104. $kernel->handle(new Request());
  105. }
  106. /**
  107. * @expectedException RuntimeException
  108. */
  109. public function testHandleWhenAResponseListenerDoesNotReturnAResponse()
  110. {
  111. $dispatcher = new EventDispatcher();
  112. $dispatcher->connect('core.response', function ($event, $response)
  113. {
  114. return 'foo';
  115. });
  116. $kernel = new HttpKernel($dispatcher, $this->getResolver());
  117. $kernel->handle(new Request());
  118. }
  119. public function testHandleWithAResponseListener()
  120. {
  121. $dispatcher = new EventDispatcher();
  122. $dispatcher->connect('core.response', function ($event, $response)
  123. {
  124. return new Response('foo');
  125. });
  126. $kernel = new HttpKernel($dispatcher, $this->getResolver());
  127. $this->assertEquals('foo', $kernel->handle(new Request())->getContent());
  128. }
  129. /**
  130. * @testdox A master request should be set on the kernel for the duration of handle(), then unset
  131. */
  132. public function testHandleSetsTheCurrentRequest()
  133. {
  134. $dispatcher = new EventDispatcher();
  135. $resolver = $this->getMock('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface');
  136. $kernel = new HttpKernel($dispatcher, $resolver);
  137. $request = new Request();
  138. $expected = new Response();
  139. $testCase = $this;
  140. $controller = function() use($expected, $kernel, $testCase, $request)
  141. {
  142. $testCase->assertSame($request, $kernel->getRequest(), '->handle() sets the current request when there is no parent request');
  143. return $expected;
  144. };
  145. $resolver->expects($this->once())
  146. ->method('getController')
  147. ->with($request)
  148. ->will($this->returnValue($controller));
  149. $resolver->expects($this->once())
  150. ->method('getArguments')
  151. ->with($request, $controller)
  152. ->will($this->returnValue(array()));
  153. $actual = $kernel->handle($request);
  154. $this->assertSame($expected, $actual, '->handle() returns the response');
  155. $this->assertNull($kernel->getRequest(), '->handle() restores the parent (null) request');
  156. }
  157. /**
  158. * @testdox The parent request is restored following a sub request
  159. * @dataProvider provideRequestTypes
  160. */
  161. public function testHandleRestoresThePreviousRequest($requestType)
  162. {
  163. $dispatcher = new EventDispatcher();
  164. $resolver = $this->getMock('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface');
  165. $kernel = new HttpKernel($dispatcher, $resolver);
  166. $parentRequest = new Request(array('name' => 'parent_request'));
  167. $request = new Request(array('name' => 'current_request'));
  168. $expected = new Response();
  169. // sets a parent request to emulate a subrequest
  170. $reflProp = new \ReflectionProperty($kernel, 'request');
  171. $reflProp->setAccessible(true);
  172. $reflProp->setValue($kernel, $parentRequest);
  173. $testCase = $this;
  174. $controller = function() use($expected, $kernel, $testCase, $request)
  175. {
  176. $testCase->assertSame($request, $kernel->getRequest(), '->handle() sets the current request when there is a parent request');
  177. return $expected;
  178. };
  179. $resolver->expects($this->once())
  180. ->method('getController')
  181. ->with($request)
  182. ->will($this->returnValue($controller));
  183. $resolver->expects($this->once())
  184. ->method('getArguments')
  185. ->with($request, $controller)
  186. ->will($this->returnValue(array()));
  187. // the behavior should be the same, regardless of request type
  188. $actual = $kernel->handle($request, $requestType);
  189. $this->assertSame($expected, $actual, '->handle() returns the response');
  190. $this->assertSame($parentRequest, $kernel->getRequest(), '->handle() restores the parent request');
  191. }
  192. public function provideRequestTypes()
  193. {
  194. return array(
  195. array(HttpKernelInterface::MASTER_REQUEST),
  196. array(HttpKernelInterface::SUB_REQUEST),
  197. );
  198. }
  199. public function testHandleRestoresThePreviousRequestOnException()
  200. {
  201. $dispatcher = new EventDispatcher();
  202. $resolver = $this->getMock('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface');
  203. $kernel = new HttpKernel($dispatcher, $resolver);
  204. $request = new Request();
  205. $expected = new \Exception();
  206. $controller = function() use ($expected)
  207. {
  208. throw $expected;
  209. };
  210. $resolver->expects($this->once())
  211. ->method('getController')
  212. ->with($request)
  213. ->will($this->returnValue($controller));
  214. $resolver->expects($this->once())
  215. ->method('getArguments')
  216. ->with($request, $controller)
  217. ->will($this->returnValue(array()));
  218. try {
  219. $kernel->handle($request);
  220. $this->fail('->handle() suppresses the controller exception');
  221. } catch (\Exception $actual) {
  222. $this->assertSame($expected, $actual, '->handle() throws the controller exception');
  223. }
  224. $this->assertNull($kernel->getRequest(), '->handle() restores the parent (null) request when the controller throws an exception');
  225. }
  226. protected function getResolver($controller = null)
  227. {
  228. if (null === $controller) {
  229. $controller = function() { return new Response('Hello'); };
  230. }
  231. $resolver = $this->getMock('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface');
  232. $resolver->expects($this->any())
  233. ->method('getController')
  234. ->will($this->returnValue($controller));
  235. $resolver->expects($this->any())
  236. ->method('getArguments')
  237. ->will($this->returnValue(array()));
  238. return $resolver;
  239. }
  240. }