diff --git a/src/ApiErrorException.php b/src/ApiErrorException.php index da1c526..e21d3d0 100644 --- a/src/ApiErrorException.php +++ b/src/ApiErrorException.php @@ -3,7 +3,31 @@ namespace OpenPix\PhpSdk; use Exception; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; class ApiErrorException extends Exception { + private RequestInterface $request; + private ResponseInterface $response; + + public static function from(string $errorMessage, RequestInterface $request, ResponseInterface $response) + { + $exception = new self($errorMessage); + + $exception->request = $request; + $exception->response = $response; + + return $exception; + } + + public function getHttpRequest(): RequestInterface + { + return $this->request; + } + + public function getHttpResponse(): ResponseInterface + { + return $this->response; + } } diff --git a/src/RequestTransport.php b/src/RequestTransport.php index ed4b440..cacf982 100644 --- a/src/RequestTransport.php +++ b/src/RequestTransport.php @@ -100,7 +100,7 @@ public function transport($request): array $response = $this->httpClient->sendRequest($request); - return $this->hydrateResponse($response); + return $this->hydrateResponse($request, $response); } /** @@ -127,7 +127,7 @@ private function withRequestDefaultParameters(RequestInterface $request): Reques * * @return array */ - private function hydrateResponse(ResponseInterface $response): array + private function hydrateResponse(RequestInterface $request, ResponseInterface $response): array { $contents = json_decode($response->getBody()->getContents(), true, 512, JSON_THROW_ON_ERROR); @@ -142,7 +142,7 @@ private function hydrateResponse(ResponseInterface $response): array $error = $error["message"]; } - throw new ApiErrorException($error); + throw ApiErrorException::from($error, $request, $response); } return $contents; diff --git a/tests/RequestTransportTest.php b/tests/RequestTransportTest.php index 37e111a..417237f 100644 --- a/tests/RequestTransportTest.php +++ b/tests/RequestTransportTest.php @@ -89,10 +89,15 @@ private function testApiErrorHandlingFor($error): void $requestMock ->method("withAddedHeader") ->willReturn($requestMock); + $requestMock + ->method("getRequestTarget") + ->willReturn("target"); + + $encodedResponse = json_encode(["error" => $error]); $responseMock = $this->createConfiguredMock(ResponseInterface::class, [ "getBody" => $this->createConfiguredMock(StreamInterface::class, [ - "getContents" => json_encode(["error" => $error]), + "getContents" => $encodedResponse, ]), "getStatusCode" => 400, "getReasonPhrase" => "Bad request", @@ -112,6 +117,13 @@ private function testApiErrorHandlingFor($error): void $this->createMock(StreamFactoryInterface::class), ); - $requestTransport->transport($requestMock); + try { + $requestTransport->transport($requestMock); + } catch (ApiErrorException $e) { + $this->assertSame($e->getHttpRequest()->getRequestTarget(), "target"); + $this->assertSame($e->getHttpResponse()->getBody()->getContents(), $encodedResponse); + + throw $e; + } } }