/** * Returns a {@link RiposteUnhandledErrorHandler} that uses the given {@link ProjectApiErrors}. */ public static RiposteUnhandledErrorHandler defaultUnhandledErrorHandler(ProjectApiErrors projectApiErrors, ApiExceptionHandlerUtils utils) { return new RiposteUnhandledExceptionHandler(projectApiErrors, utils); }
@Override public ErrorResponseInfo handleError(Throwable error, RequestInfo<?> requestInfo) { com.nike.backstopper.handler.ErrorResponseInfo<ErrorResponseBody> backstopperErrorResponseInfo = handleException(error, new RequestInfoForLoggingRiposteAdapter(requestInfo)); return new ErrorResponseInfoImpl(backstopperErrorResponseInfo); }
@Test public void prepareFrameworkResponseUsesErrorResponseBodyNettyAdapterWrapper() { RiposteUnhandledExceptionHandler myAdapter = new RiposteUnhandledExceptionHandler(projectApiErrors, utils); DefaultErrorContractDTO errorContract = new DefaultErrorContractDTO(UUID.randomUUID().toString(), Arrays.asList(projectApiErrors.getUnauthorizedApiError(), projectApiErrors.getMalformedRequestApiError())); ErrorResponseBody result = myAdapter.prepareFrameworkRepresentation(errorContract, 42, null, null, null); assertThat(result, instanceOf(ErrorResponseBodyImpl.class)); ErrorResponseBodyImpl adapterResult = (ErrorResponseBodyImpl)result; assertThat(adapterResult.error_id, is(errorContract.error_id)); assertThat(adapterResult.errors, is(errorContract.errors)); }
@Test public void handleErrorFromNettyInterfaceWrapsRequestInfoWithAdapterBeforeContinuing() { com.nike.backstopper.handler.ErrorResponseInfo<ErrorResponseBody> backstopperResponse = new ErrorResponseInfo<>(42, mock(ErrorResponseBody.class), Collections.emptyMap()); doReturn(backstopperResponse).when(adapterSpy).handleException(any(Throwable.class), any(RequestInfoForLogging.class)); RequestInfo requestInfoMock = mock(RequestInfo.class); adapterSpy.handleError(new Exception(), requestInfoMock); ArgumentCaptor<RequestInfoForLogging> requestInfoForLoggingArgumentCaptor = ArgumentCaptor.forClass(RequestInfoForLogging.class); verify(adapterSpy).handleException(any(Throwable.class), requestInfoForLoggingArgumentCaptor.capture()); RequestInfoForLogging passedArg = requestInfoForLoggingArgumentCaptor.getValue(); assertThat(passedArg, instanceOf(RequestInfoForLoggingRiposteAdapter.class)); RequestInfo embeddedRequestInfoInWrapper = (RequestInfo) Whitebox.getInternalState(passedArg, "request"); assertThat(embeddedRequestInfoInWrapper, sameInstance(requestInfoMock)); }
@Override protected ErrorResponseBody prepareFrameworkRepresentation( final DefaultErrorContractDTO errorContractDTO, final int httpStatusCode, final Collection<ApiError> rawFilteredApiErrors, final Throwable originalException, final RequestInfoForLogging request ) { Throwable cause = originalException.getCause(); if (cause instanceof BlankPayloadErrorContractException) { return handleBlankErrorContract(); } if (cause instanceof DelegatedErrorContractException) { return handleDelegatedErrorContract((DelegatedErrorContractException) originalException.getCause()); } if (cause instanceof StringErrorContractException) { return handleStringErrorContract((StringErrorContractException) originalException.getCause()); } return super.prepareFrameworkRepresentation(errorContractDTO, httpStatusCode, rawFilteredApiErrors, originalException, request); }
@Test public void handleErrorFromNettyInterfaceReturnsWrapperAroundBackstopperHandleExceptionReturnValue() { ErrorResponseBody errorResponseBodyMock = mock(ErrorResponseBody.class); Map<String, List<String>> headersMap = MapBuilder.<String, List<String>>builder().put("headerName", Arrays.asList("hval1", "hval2")).build(); com.nike.backstopper.handler.ErrorResponseInfo<ErrorResponseBody> backstopperResponse = new ErrorResponseInfo<>(42, errorResponseBodyMock, headersMap); doReturn(backstopperResponse).when(adapterSpy).handleException(any(Throwable.class), any(RequestInfoForLogging.class)); com.nike.riposte.server.error.handler.ErrorResponseInfo riposteErrorResponseInfo = adapterSpy.handleError(new Exception(), mock(RequestInfo.class)); assertThat(riposteErrorResponseInfo, instanceOf(ErrorResponseInfoImpl.class)); assertThat(riposteErrorResponseInfo.getErrorHttpStatusCode(), is(backstopperResponse.httpStatusCode)); assertThat(riposteErrorResponseInfo.getErrorResponseBody(), is(errorResponseBodyMock)); assertThat(riposteErrorResponseInfo.getExtraHeadersToAddToResponse(), is(headersMap)); }
@Before public void beforeMethod() { adapterSpy = spy(new RiposteUnhandledExceptionHandler(projectApiErrors, utils)); }
@Test(expected = IllegalArgumentException.class) public void constructorShouldBarfIfPassedNullProjectApiErrors() { new RiposteUnhandledExceptionHandler(null, utils); }
@Test(expected = IllegalArgumentException.class) public void constructorShouldBarfIfPassedNullUtils() { new RiposteUnhandledExceptionHandler(projectApiErrors, null); }
@Test public void constructorWorksIfPassedValidValues() { RiposteUnhandledExceptionHandler myAdapter = new RiposteUnhandledExceptionHandler(projectApiErrors, utils); assertThat(Whitebox.getInternalState(myAdapter, "projectApiErrors"), is(projectApiErrors)); assertThat(Whitebox.getInternalState(myAdapter, "utils"), is(utils)); }