/** * @dataProvider dataProvider */ public function testFactory($stack, $extra = []) { $ex = RemoteException::factory($stack); for ($i = 0; $i < count($stack); $i++) { if (!is_array($stack[$i])) { continue; } $this->assertInstanceOf('\\Matryoshka\\Service\\Api\\Exception\\RemoteException', $ex); $this->assertSame(isset($stack[$i]['code']) ? $stack[$i]['code'] : 0, $ex->getCode()); $this->assertSame(isset($stack[$i]['message']) ? $stack[$i]['message'] : '', $ex->getMessage()); if (isset($stack[$i]['trace'])) { $this->assertSame($stack[$i]['trace'], $ex->getRemoteTrace()); } if (isset($stack[$i]['line'])) { $this->assertSame($stack[$i]['line'], $ex->getLine()); } if (isset($stack[$i]['file'])) { $this->assertSame($stack[$i]['file'], $ex->getFile()); } $this->assertSame($extra, $ex->getAdditionalDetails()); $ex = $ex->getPrevious(); } $this->assertNull($ex); }
/** * @param array $bodyDecodeResponse * @param Response $response * @return Exception\ApiProblem\DomainException|Exception\InvalidResponseException */ protected function getInvalidResponseException(array $bodyDecodeResponse, Response $response) { $contentType = $response->getHeaders()->get('Content-Type'); if ($contentType instanceof ContentType && $contentType->match('application/problem+*')) { $apiProblemDefaults = ['type' => $response->getReasonPhrase(), 'title' => '', 'status' => $response->getStatusCode(), 'detail' => '', 'instance' => '']; $bodyDecodeResponse += $apiProblemDefaults; //Setup remote exception $remoteExceptionStack = isset($bodyDecodeResponse['exception_stack']) && is_array($bodyDecodeResponse['exception_stack']) ? $bodyDecodeResponse['exception_stack'] : []; array_unshift($remoteExceptionStack, ['message' => $bodyDecodeResponse['detail'], 'code' => $bodyDecodeResponse['status'], 'trace' => isset($bodyDecodeResponse['trace']) ? $bodyDecodeResponse['trace'] : null]); //Setup exception $exception = new Exception\ApiProblem\DomainException($bodyDecodeResponse['detail'], $bodyDecodeResponse['status'], Exception\RemoteException::factory($remoteExceptionStack)); $exception->setType($bodyDecodeResponse['type']); $exception->setTitle($bodyDecodeResponse['title']); foreach ($apiProblemDefaults as $key => $value) { unset($bodyDecodeResponse[$key]); } $exception->setAdditionalDetails($bodyDecodeResponse); } else { $exception = new Exception\InvalidResponseException($response->getReasonPhrase(), $response->getStatusCode()); $exception->setResponse($response); } return $exception; }