ErrorHandlerMiddlewareTest.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <?php
  2. /**
  3. * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
  4. * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
  5. *
  6. * Licensed under The MIT License
  7. * For full copyright and license information, please see the LICENSE.txt
  8. * Redistributions of files must retain the above copyright notice.
  9. *
  10. * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
  11. * @link http://cakephp.org CakePHP(tm) Project
  12. * @since 3.3.0
  13. * @license http://www.opensource.org/licenses/mit-license.php MIT License
  14. */
  15. namespace Cake\Test\TestCase\Http\Middleware;
  16. use Cake\Core\Configure;
  17. use Cake\Http\Middleware\ErrorHandlerMiddleware;
  18. use Cake\Http\ServerRequestFactory;
  19. use Cake\Network\Response as CakeResponse;
  20. use Cake\TestSuite\TestCase;
  21. use LogicException;
  22. use Zend\Diactoros\Request;
  23. use Zend\Diactoros\Response;
  24. /**
  25. * Test for ErrorHandlerMiddleware
  26. */
  27. class ErrorHandlerMiddlewareTest extends TestCase
  28. {
  29. /**
  30. * Test returning a response works ok.
  31. *
  32. * @return void
  33. */
  34. public function testNoErrorResponse()
  35. {
  36. $request = ServerRequestFactory::fromGlobals();
  37. $response = new Response();
  38. $middleware = new ErrorHandlerMiddleware();
  39. $next = function ($req, $res) {
  40. return $res;
  41. };
  42. $result = $middleware($request, $response, $next);
  43. $this->assertSame($result, $response);
  44. }
  45. /**
  46. * Test an invalid rendering class.
  47. *
  48. * @expectedException Exception
  49. * @expectedExceptionMessage The 'TotallyInvalid' renderer class could not be found
  50. */
  51. public function testInvalidRenderer()
  52. {
  53. $request = ServerRequestFactory::fromGlobals();
  54. $response = new Response();
  55. $middleware = new ErrorHandlerMiddleware('TotallyInvalid');
  56. $next = function ($req, $res) {
  57. throw new \Exception('Something bad');
  58. };
  59. $middleware($request, $response, $next);
  60. }
  61. /**
  62. * Test using a factory method to make a renderer.
  63. *
  64. * @return void
  65. */
  66. public function testRendererFactory()
  67. {
  68. $request = ServerRequestFactory::fromGlobals();
  69. $response = new Response();
  70. $factory = function ($exception) {
  71. $this->assertInstanceOf('LogicException', $exception);
  72. $cakeResponse = new CakeResponse;
  73. $mock = $this->getMock('StdClass', ['render']);
  74. $mock->expects($this->once())
  75. ->method('render')
  76. ->will($this->returnValue($cakeResponse));
  77. return $mock;
  78. };
  79. $middleware = new ErrorHandlerMiddleware($factory);
  80. $next = function ($req, $res) {
  81. throw new LogicException('Something bad');
  82. };
  83. $middleware($request, $response, $next);
  84. }
  85. /**
  86. * Test rendering an error page
  87. *
  88. * @return void
  89. */
  90. public function testHandleException()
  91. {
  92. Configure::write('App.namespace', 'TestApp');
  93. $request = ServerRequestFactory::fromGlobals();
  94. $response = new Response();
  95. $middleware = new ErrorHandlerMiddleware();
  96. $next = function ($req, $res) {
  97. throw new \Cake\Network\Exception\NotFoundException('whoops');
  98. };
  99. $result = $middleware($request, $response, $next);
  100. $this->assertNotSame($result, $response);
  101. $this->assertEquals(404, $result->getStatusCode());
  102. $this->assertContains("was not found", '' . $result->getBody());
  103. }
  104. /**
  105. * Test handling an error and having rendering fail.
  106. *
  107. * @return void
  108. */
  109. public function testHandleExceptionRenderingFails()
  110. {
  111. Configure::write('App.namespace', 'TestApp');
  112. $request = ServerRequestFactory::fromGlobals();
  113. $response = new Response();
  114. $factory = function ($exception) {
  115. $mock = $this->getMock('StdClass', ['render']);
  116. $mock->expects($this->once())
  117. ->method('render')
  118. ->will($this->throwException(new LogicException('Rendering failed')));
  119. return $mock;
  120. };
  121. $middleware = new ErrorHandlerMiddleware($factory);
  122. $next = function ($req, $res) {
  123. throw new \Cake\Network\Exception\ServiceUnavailableException('whoops');
  124. };
  125. $response = $middleware($request, $response, $next);
  126. $this->assertEquals(500, $response->getStatusCode());
  127. $this->assertEquals('An Internal Server Error Occurred', '' . $response->getBody());
  128. }
  129. }