ErrorHandlerMiddlewareTest.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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\Error\Middleware;
  16. use Cake\Core\Configure;
  17. use Cake\Error\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->getMockBuilder('StdClass')
  74. ->setMethods(['render'])
  75. ->getMock();
  76. $mock->expects($this->once())
  77. ->method('render')
  78. ->will($this->returnValue($cakeResponse));
  79. return $mock;
  80. };
  81. $middleware = new ErrorHandlerMiddleware($factory);
  82. $next = function ($req, $res) {
  83. throw new LogicException('Something bad');
  84. };
  85. $middleware($request, $response, $next);
  86. }
  87. /**
  88. * Test rendering an error page
  89. *
  90. * @return void
  91. */
  92. public function testHandleException()
  93. {
  94. Configure::write('App.namespace', 'TestApp');
  95. $request = ServerRequestFactory::fromGlobals();
  96. $response = new Response();
  97. $middleware = new ErrorHandlerMiddleware();
  98. $next = function ($req, $res) {
  99. throw new \Cake\Network\Exception\NotFoundException('whoops');
  100. };
  101. $result = $middleware($request, $response, $next);
  102. $this->assertNotSame($result, $response);
  103. $this->assertEquals(404, $result->getStatusCode());
  104. $this->assertContains("was not found", '' . $result->getBody());
  105. }
  106. /**
  107. * Test handling an error and having rendering fail.
  108. *
  109. * @return void
  110. */
  111. public function testHandleExceptionRenderingFails()
  112. {
  113. Configure::write('App.namespace', 'TestApp');
  114. $request = ServerRequestFactory::fromGlobals();
  115. $response = new Response();
  116. $factory = function ($exception) {
  117. $mock = $this->getMockBuilder('StdClass')
  118. ->setMethods(['render'])
  119. ->getMock();
  120. $mock->expects($this->once())
  121. ->method('render')
  122. ->will($this->throwException(new LogicException('Rendering failed')));
  123. return $mock;
  124. };
  125. $middleware = new ErrorHandlerMiddleware($factory);
  126. $next = function ($req, $res) {
  127. throw new \Cake\Network\Exception\ServiceUnavailableException('whoops');
  128. };
  129. $response = $middleware($request, $response, $next);
  130. $this->assertEquals(500, $response->getStatusCode());
  131. $this->assertEquals('An Internal Server Error Occurred', '' . $response->getBody());
  132. }
  133. }