@Test public void doesNotHandleNonJsonMediaTypes() { assertThat(decode(MediaType.TEXT_PLAIN, STATUS_500, SERIALIZED_EXCEPTION)).isEmpty(); assertThat(decode(MediaType.TEXT_HTML, STATUS_500, SERIALIZED_EXCEPTION)).isEmpty(); assertThat(decode(MediaType.MULTIPART_FORM_DATA, STATUS_500, SERIALIZED_EXCEPTION)).isEmpty(); }
@Test public void doesNotHandleNullBody() { assertThat(decode(MediaType.APPLICATION_JSON, STATUS_500, null)).isEmpty(); }
@Test public void doesNotHandleUnparseableBody() { assertThat(decode(MediaType.APPLICATION_JSON, STATUS_500, "not json")).isEmpty(); }
private static Optional<RemoteException> encodeAndDecode(Exception exception) { Preconditions.checkArgument(!(exception instanceof ServiceException), "Use SerializableError#forException"); Object error = SerializableError.builder() .errorCode(exception.getClass().getName()) .errorName(exception.getMessage()) .build(); String json; try { json = SERVER_MAPPER.writeValueAsString(error); } catch (JsonProcessingException e) { throw new RuntimeException(e); } int status = (exception instanceof WebApplicationException) ? ((WebApplicationException) exception).getResponse().getStatus() : 400; return decode(MediaType.APPLICATION_JSON, status, json); }
@Test public void extractsRemoteExceptionForAllErrorCodes() throws Exception { for (int code : ImmutableList.of(300, 400, 404, 500)) { RemoteException exception = decode(MediaType.APPLICATION_JSON, code, SERIALIZED_EXCEPTION).get(); assertThat(exception.getCause()).isNull(); assertThat(exception.getStatus()).isEqualTo(code); assertThat(exception.getError().errorCode()).isEqualTo(ErrorType.FAILED_PRECONDITION.code().name()); assertThat(exception.getError().errorName()).isEqualTo(ErrorType.FAILED_PRECONDITION.name()); assertThat(exception.getMessage()).isEqualTo( "RemoteException: " + ErrorType.FAILED_PRECONDITION.code().name() + " (" + ErrorType.FAILED_PRECONDITION.name() + ") with instance ID " + SERVICE_EXCEPTION.getErrorInstanceId()); } }