getMessage())->toBe('API Error: Invalid request'); expect($exception->getCode())->toBe(400); expect($exception->getResponse())->toBe($response); }); it('returns response data as array', function () { $response = new ClientResponse( status: Status::BAD_REQUEST, headers: new Headers([]), body: '{"error": "Invalid request", "field": "email"}' ); $exception = new ApiException( message: 'API Error', code: 400, response: $response ); $data = $exception->getResponseData(); expect($data)->toBeArray(); expect($data['error'])->toBe('Invalid request'); expect($data['field'])->toBe('email'); }); it('returns null for invalid JSON response', function () { $response = new ClientResponse( status: Status::INTERNAL_SERVER_ERROR, headers: new Headers([]), body: 'Invalid JSON {' ); $exception = new ApiException( message: 'API Error', code: 500, response: $response ); expect($exception->getResponseData())->toBeNull(); }); it('returns null for empty response body', function () { $response = new ClientResponse( status: Status::NO_CONTENT, headers: new Headers([]), body: '' ); $exception = new ApiException( message: 'API Error', code: 204, response: $response ); expect($exception->getResponseData())->toBeNull(); }); it('extends FrameworkException', function () { $response = new ClientResponse( status: Status::BAD_REQUEST, headers: new Headers([]), body: '{}' ); $exception = new ApiException( message: 'Test', code: 400, response: $response ); expect($exception)->toBeInstanceOf(\App\Framework\Exception\FrameworkException::class); }); });