|
7 | 7 | namespace ZFTest\ApiProblem\Listener; |
8 | 8 |
|
9 | 9 | use PHPUnit_Framework_TestCase as TestCase; |
| 10 | +use RuntimeException; |
| 11 | +use TypeError; |
10 | 12 | use Zend\Http\Request; |
11 | 13 | use Zend\Http\Response; |
12 | 14 | use Zend\Mvc\Application; |
@@ -56,4 +58,93 @@ public function testOnRenderErrorCreatesAnApiProblemResponse() |
56 | 58 | $this->assertContains('www.w3.org', $content['describedBy']); |
57 | 59 | $this->assertContains('accept', $content['detail']); |
58 | 60 | } |
| 61 | + |
| 62 | + public function testOnRenderErrorCreatesAnApiProblemResponseFromException() |
| 63 | + { |
| 64 | + $response = new Response(); |
| 65 | + $request = new Request(); |
| 66 | + $request->getHeaders()->addHeaderLine('Accept', 'application/json'); |
| 67 | + |
| 68 | + $event = new MvcEvent(); |
| 69 | + $event->setError(Application::ERROR_EXCEPTION); |
| 70 | + $event->setParam('exception', new RuntimeException('exception', 400)); |
| 71 | + $event->setRequest($request); |
| 72 | + $event->setResponse($response); |
| 73 | + |
| 74 | + $this->listener->setDisplayExceptions(true); |
| 75 | + $this->listener->onRenderError($event); |
| 76 | + |
| 77 | + $this->assertTrue($event->propagationIsStopped()); |
| 78 | + $this->assertSame($response, $event->getResponse()); |
| 79 | + |
| 80 | + $this->assertEquals(400, $response->getStatusCode()); |
| 81 | + $headers = $response->getHeaders(); |
| 82 | + $this->assertTrue($headers->has('Content-Type')); |
| 83 | + $this->assertEquals(ApiProblem::CONTENT_TYPE, $headers->get('content-type')->getFieldValue()); |
| 84 | + $content = json_decode($response->getContent(), true); |
| 85 | + $this->assertArrayHasKey('status', $content); |
| 86 | + $this->assertArrayHasKey('title', $content); |
| 87 | + $this->assertArrayHasKey('describedBy', $content); |
| 88 | + $this->assertArrayHasKey('detail', $content); |
| 89 | + $this->assertArrayHasKey('details', $content); |
| 90 | + |
| 91 | + $this->assertEquals(400, $content['status']); |
| 92 | + $this->assertEquals('Unexpected error', $content['title']); |
| 93 | + $this->assertContains('www.w3.org', $content['describedBy']); |
| 94 | + $this->assertEquals('exception', $content['detail']); |
| 95 | + |
| 96 | + $this->assertInternalType('array', $content['details']); |
| 97 | + $details = $content['details']; |
| 98 | + $this->assertArrayHasKey('code', $details); |
| 99 | + $this->assertArrayHasKey('message', $details); |
| 100 | + $this->assertArrayHasKey('trace', $details); |
| 101 | + $this->assertEquals(400, $details['code']); |
| 102 | + $this->assertEquals('exception', $details['message']); |
| 103 | + } |
| 104 | + |
| 105 | + /** |
| 106 | + * @requires PHP 7.0 |
| 107 | + */ |
| 108 | + public function testOnRenderErrorCreatesAnApiProblemResponseFromThrowable() |
| 109 | + { |
| 110 | + $response = new Response(); |
| 111 | + $request = new Request(); |
| 112 | + $request->getHeaders()->addHeaderLine('Accept', 'application/json'); |
| 113 | + |
| 114 | + $event = new MvcEvent(); |
| 115 | + $event->setError(Application::ERROR_EXCEPTION); |
| 116 | + $event->setParam('exception', new TypeError('throwable', 400)); |
| 117 | + $event->setRequest($request); |
| 118 | + $event->setResponse($response); |
| 119 | + |
| 120 | + $this->listener->setDisplayExceptions(true); |
| 121 | + $this->listener->onRenderError($event); |
| 122 | + |
| 123 | + $this->assertTrue($event->propagationIsStopped()); |
| 124 | + $this->assertSame($response, $event->getResponse()); |
| 125 | + |
| 126 | + $this->assertEquals(400, $response->getStatusCode()); |
| 127 | + $headers = $response->getHeaders(); |
| 128 | + $this->assertTrue($headers->has('Content-Type')); |
| 129 | + $this->assertEquals(ApiProblem::CONTENT_TYPE, $headers->get('content-type')->getFieldValue()); |
| 130 | + $content = json_decode($response->getContent(), true); |
| 131 | + $this->assertArrayHasKey('status', $content); |
| 132 | + $this->assertArrayHasKey('title', $content); |
| 133 | + $this->assertArrayHasKey('describedBy', $content); |
| 134 | + $this->assertArrayHasKey('detail', $content); |
| 135 | + $this->assertArrayHasKey('details', $content); |
| 136 | + |
| 137 | + $this->assertEquals(400, $content['status']); |
| 138 | + $this->assertEquals('Unexpected error', $content['title']); |
| 139 | + $this->assertContains('www.w3.org', $content['describedBy']); |
| 140 | + $this->assertEquals('throwable', $content['detail']); |
| 141 | + |
| 142 | + $this->assertInternalType('array', $content['details']); |
| 143 | + $details = $content['details']; |
| 144 | + $this->assertArrayHasKey('code', $details); |
| 145 | + $this->assertArrayHasKey('message', $details); |
| 146 | + $this->assertArrayHasKey('trace', $details); |
| 147 | + $this->assertEquals(400, $details['code']); |
| 148 | + $this->assertEquals('throwable', $details['message']); |
| 149 | + } |
59 | 150 | } |
0 commit comments