Repository: james-project Updated Branches: refs/heads/master 6c61cdcc7 -> 99549a88e
JAMES-2314 Better handle exceptions in webAdmin Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/99549a88 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/99549a88 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/99549a88 Branch: refs/heads/master Commit: 99549a88ea053723991f0316b984535122ba3bd8 Parents: 6c61cdc Author: duc <trantiendu...@gmail.com> Authored: Thu May 17 16:28:39 2018 +0700 Committer: Matthieu Baechler <matth...@apache.org> Committed: Fri May 25 14:22:36 2018 +0200 ---------------------------------------------------------------------- .../routes/CassandraMigrationRoutesTest.java | 2 +- .../apache/james/webadmin/WebAdminServer.java | 34 +++++++ .../james/webadmin/utils/ErrorResponder.java | 42 ++++++-- .../webadmin/utils/JsonExtractException.java | 2 +- .../james/webadmin/routes/ErrorRoutes.java | 50 ++++++++++ .../james/webadmin/routes/ErrorRoutesTest.java | 100 +++++++++++++++++++ .../webadmin/utils/ErrorResponderTest.java | 2 +- .../webadmin/routes/ForwardRoutesTest.java | 53 ++++------ .../james/webadmin/routes/GroupsRoutesTest.java | 53 ++++------ .../webadmin/routes/DomainQuotaRoutesTest.java | 4 +- .../webadmin/routes/GlobalQuotaRoutesTest.java | 4 +- .../routes/UserMailboxesRoutesTest.java | 68 +++++-------- .../webadmin/routes/UserQuotaRoutesTest.java | 4 +- .../routes/MailRepositoriesRoutesTest.java | 2 +- 14 files changed, 286 insertions(+), 134 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/99549a88/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/CassandraMigrationRoutesTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/CassandraMigrationRoutesTest.java b/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/CassandraMigrationRoutesTest.java index 700b539..b3f1fc9 100644 --- a/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/CassandraMigrationRoutesTest.java +++ b/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/CassandraMigrationRoutesTest.java @@ -169,7 +169,7 @@ public class CassandraMigrationRoutesTest { .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400) .containsEntry("type", "InvalidArgument") .containsEntry("message", "Invalid request for version upgrade") - .containsEntry("cause", "For input string: \"NonInt\""); + .containsEntry("details", "For input string: \"NonInt\""); verifyNoMoreInteractions(schemaVersionDAO); } http://git-wip-us.apache.org/repos/asf/james-project/blob/99549a88/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminServer.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminServer.java b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminServer.java index c21ab8c..3ec06f9 100644 --- a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminServer.java +++ b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminServer.java @@ -19,6 +19,13 @@ package org.apache.james.webadmin; +import static org.apache.james.webadmin.utils.ErrorResponder.ErrorType.INVALID_ARGUMENT; +import static org.apache.james.webadmin.utils.ErrorResponder.ErrorType.NOT_FOUND; +import static org.apache.james.webadmin.utils.ErrorResponder.ErrorType.SERVER_ERROR; +import static org.eclipse.jetty.http.HttpStatus.BAD_REQUEST_400; +import static org.eclipse.jetty.http.HttpStatus.INTERNAL_SERVER_ERROR_500; +import static org.eclipse.jetty.http.HttpStatus.NOT_FOUND_404; + import java.util.Set; import javax.annotation.PreDestroy; @@ -37,6 +44,8 @@ import org.apache.james.webadmin.mdc.MDCFilter; import org.apache.james.webadmin.metric.MetricPostFilter; import org.apache.james.webadmin.metric.MetricPreFilter; import org.apache.james.webadmin.routes.CORSRoute; +import org.apache.james.webadmin.utils.ErrorResponder; +import org.apache.james.webadmin.utils.JsonExtractException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -72,6 +81,7 @@ public class WebAdminServer implements Configurable { public void configure(HierarchicalConfiguration config) throws ConfigurationException { if (configuration.isEnabled()) { service.port(configuration.getPort().get().getValue()); + configureExceptionHanding(); configureHTTPS(); configureCORS(); configureMetrics(); @@ -116,6 +126,30 @@ public class WebAdminServer implements Configurable { } } + private void configureExceptionHanding() { + service.notFound((req, res) -> ErrorResponder.builder() + .statusCode(NOT_FOUND_404) + .type(NOT_FOUND) + .message(String.format("%s %s can not be found", req.requestMethod(), req.pathInfo())) + .asString()); + + service.internalServerError((req, res) -> ErrorResponder.builder() + .statusCode(INTERNAL_SERVER_ERROR_500) + .type(SERVER_ERROR) + .message("WebAdmin encountered an unexpected internal error") + .asString()); + + service.exception(JsonExtractException.class, (ex, req, res) -> { + res.status(BAD_REQUEST_400); + res.body(ErrorResponder.builder() + .statusCode(BAD_REQUEST_400) + .type(INVALID_ARGUMENT) + .message("JSON payload of the request is not valid") + .cause(ex) + .asString()); + }); + } + @PreDestroy public void destroy() { if (configuration.isEnabled()) { http://git-wip-us.apache.org/repos/asf/james-project/blob/99549a88/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/ErrorResponder.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/ErrorResponder.java b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/ErrorResponder.java index b02883d..73dde47 100644 --- a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/ErrorResponder.java +++ b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/ErrorResponder.java @@ -24,6 +24,9 @@ import static spark.Spark.halt; import java.util.Objects; import java.util.Optional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.fasterxml.jackson.core.JsonProcessingException; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; @@ -31,6 +34,9 @@ import com.google.common.base.Preconditions; import spark.HaltException; public class ErrorResponder { + + private static final Logger LOGGER = LoggerFactory.getLogger(ErrorResponder.class); + public enum ErrorType { INVALID_ARGUMENT("InvalidArgument"), NOT_FOUND("notFound"), @@ -86,27 +92,41 @@ public class ErrorResponder { Preconditions.checkNotNull(type, "type must not be null in case of error"); Preconditions.checkNotNull(message, "message must not be null in case of error"); try { - return halt(statusCode, new JsonTransformer().render(new ErrorDetail(statusCode, - type.getType(), - message, - cause.map(e -> Optional.ofNullable(e.getMessage())).orElse(Optional.empty())))); + return halt(statusCode, generateBody()); } catch (JsonProcessingException e) { return halt(statusCode); } } + public String asString() { + try { + return generateBody(); + } catch (JsonProcessingException e) { + LOGGER.error("Failed handling Error response formatting", e); + throw new RuntimeException(e); + } + } + + private String generateBody() throws JsonProcessingException { + return new JsonTransformer().render(new ErrorDetail( + statusCode, + type.getType(), + message, + cause.map(Throwable::getMessage))); + } + static class ErrorDetail { private final int statusCode; private final String type; private final String message; - private final Optional<String> cause; + private final Optional<String> details; @VisibleForTesting - ErrorDetail(int statusCode, String type, String message, Optional<String> cause) { + ErrorDetail(int statusCode, String type, String message, Optional<String> details) { this.statusCode = statusCode; this.type = type; this.message = message; - this.cause = cause; + this.details = details; } public int getStatusCode() { @@ -121,8 +141,8 @@ public class ErrorResponder { return message; } - public Optional<String> getCause() { - return cause; + public Optional<String> getDetails() { + return details; } @Override @@ -133,14 +153,14 @@ public class ErrorResponder { return Objects.equals(this.statusCode, that.statusCode) && Objects.equals(this.type, that.type) && Objects.equals(this.message, that.message) - && Objects.equals(this.cause, that.cause); + && Objects.equals(this.details, that.details); } return false; } @Override public final int hashCode() { - return Objects.hash(statusCode, type, message, cause); + return Objects.hash(statusCode, type, message, details); } } } http://git-wip-us.apache.org/repos/asf/james-project/blob/99549a88/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/JsonExtractException.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/JsonExtractException.java b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/JsonExtractException.java index dc6b578..0ae6065 100644 --- a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/JsonExtractException.java +++ b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/JsonExtractException.java @@ -22,6 +22,6 @@ package org.apache.james.webadmin.utils; public class JsonExtractException extends Exception { public JsonExtractException(Throwable throwable) { - super(throwable); + super(throwable.getMessage(), throwable); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/99549a88/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/routes/ErrorRoutes.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/routes/ErrorRoutes.java b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/routes/ErrorRoutes.java new file mode 100644 index 0000000..76e2c53 --- /dev/null +++ b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/routes/ErrorRoutes.java @@ -0,0 +1,50 @@ +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ + +package org.apache.james.webadmin.routes; + +import org.apache.james.webadmin.Routes; +import org.apache.james.webadmin.utils.JsonExtractor; + +import spark.Service; + +public class ErrorRoutes implements Routes { + + public static final String BASE_URL = "/errors/"; + public static final String INTERNAL_SERVER_ERROR = "internalServerError"; + public static final String JSON_EXTRACT_EXCEPTION = "jsonExtractException"; + + @Override + public void define(Service service) { + defineInternalError(service); + defineJsonExtractException(service); + } + + private void defineInternalError(Service service) { + service.get(BASE_URL + INTERNAL_SERVER_ERROR, + (req, res) -> { + throw new RuntimeException(); + }); + } + + private void defineJsonExtractException(Service service) { + service.get(BASE_URL + JSON_EXTRACT_EXCEPTION, + (req, res) -> new JsonExtractor<>(Long.class).parse("a non valid JSON")); + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/99549a88/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/routes/ErrorRoutesTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/routes/ErrorRoutesTest.java b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/routes/ErrorRoutesTest.java new file mode 100644 index 0000000..ffdb07a --- /dev/null +++ b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/routes/ErrorRoutesTest.java @@ -0,0 +1,100 @@ +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ + +package org.apache.james.webadmin.routes; + +import static com.jayway.restassured.RestAssured.when; +import static org.apache.james.webadmin.WebAdminServer.NO_CONFIGURATION; +import static org.apache.james.webadmin.routes.ErrorRoutes.INTERNAL_SERVER_ERROR; +import static org.apache.james.webadmin.routes.ErrorRoutes.JSON_EXTRACT_EXCEPTION; +import static org.apache.james.webadmin.utils.ErrorResponder.ErrorType.INVALID_ARGUMENT; +import static org.apache.james.webadmin.utils.ErrorResponder.ErrorType.SERVER_ERROR; +import static org.eclipse.jetty.http.HttpStatus.BAD_REQUEST_400; +import static org.eclipse.jetty.http.HttpStatus.INTERNAL_SERVER_ERROR_500; +import static org.eclipse.jetty.http.HttpStatus.NOT_FOUND_404; +import static org.hamcrest.Matchers.equalTo; + +import org.apache.james.metrics.api.NoopMetricFactory; +import org.apache.james.webadmin.WebAdminServer; +import org.apache.james.webadmin.WebAdminUtils; +import org.apache.james.webadmin.utils.ErrorResponder; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import com.jayway.restassured.RestAssured; + +public class ErrorRoutesTest { + private static final String NOT_FOUND = "notFound"; + + private static WebAdminServer webAdminServer; + + @BeforeClass + public static void setUp() throws Exception { + webAdminServer = WebAdminUtils.createWebAdminServer( + new NoopMetricFactory(), + new ErrorRoutes()); + webAdminServer.configure(NO_CONFIGURATION); + webAdminServer.await(); + + RestAssured.requestSpecification = WebAdminUtils.buildRequestSpecification(webAdminServer) + .setBasePath(ErrorRoutes.BASE_URL) + .build(); + RestAssured.enableLoggingOfRequestAndResponseIfValidationFails(); + } + + @AfterClass + public static void tearDown() { + webAdminServer.destroy(); + } + + @Test + public void defineInternalErrorShouldReturnInternalErrorJsonFormat() { + when() + .get(INTERNAL_SERVER_ERROR) + .then() + .statusCode(INTERNAL_SERVER_ERROR_500) + .body("statusCode", equalTo(INTERNAL_SERVER_ERROR_500)) + .body("type", equalTo(SERVER_ERROR.getType())) + .body("message", equalTo("WebAdmin encountered an unexpected internal error")); + } + + @Test + public void defineNotFoundShouldReturnNotFoundJsonFormat() { + when() + .get(NOT_FOUND) + .then() + .statusCode(NOT_FOUND_404) + .body("statusCode", equalTo(NOT_FOUND_404)) + .body("type", equalTo(ErrorResponder.ErrorType.NOT_FOUND.getType())) + .body("message", equalTo("GET /errors/notFound can not be found")); + } + + @Test + public void defineJsonExtractExceptionShouldReturnBadRequestJsonFormat() throws InterruptedException { + when() + .get(JSON_EXTRACT_EXCEPTION) + .then() + .statusCode(BAD_REQUEST_400) + .body("statusCode", equalTo(BAD_REQUEST_400)) + .body("type", equalTo(INVALID_ARGUMENT.getType())) + .body("message", equalTo("JSON payload of the request is not valid")) + .body("details", equalTo("Unrecognized token 'a': was expecting ('true', 'false' or 'null')\n at [Source: a non valid JSON; line: 1, column: 2]")); + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/99549a88/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/utils/ErrorResponderTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/utils/ErrorResponderTest.java b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/utils/ErrorResponderTest.java index 46f2997..53dc91d 100644 --- a/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/utils/ErrorResponderTest.java +++ b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/utils/ErrorResponderTest.java @@ -134,7 +134,7 @@ public class ErrorResponderTest { jsonPath.read("$.statusCode"), jsonPath.read("$.type"), jsonPath.read("$.message"), - Optional.ofNullable(jsonPath.read("$.cause")))); + Optional.ofNullable(jsonPath.read("$.details")))); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/james-project/blob/99549a88/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/ForwardRoutesTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/ForwardRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/ForwardRoutesTest.java index ea00515..27fc7ab 100644 --- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/ForwardRoutesTest.java +++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/ForwardRoutesTest.java @@ -24,7 +24,6 @@ import static com.jayway.restassured.RestAssured.with; import static org.apache.james.webadmin.Constants.SEPARATOR; import static org.apache.james.webadmin.WebAdminServer.NO_CONFIGURATION; import static org.assertj.core.api.Assertions.assertThat; -import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.hasItems; import static org.hamcrest.CoreMatchers.is; import static org.mockito.Matchers.any; @@ -402,7 +401,7 @@ class ForwardRoutesTest { .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400) .containsEntry("type", "InvalidArgument") .containsEntry("message", "The forward is not an email address") - .containsEntry("cause", "Out of data at position 1 in 'not-an-address'"); + .containsEntry("details", "Out of data at position 1 in 'not-an-address'"); } @Test @@ -421,7 +420,7 @@ class ForwardRoutesTest { .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400) .containsEntry("type", "InvalidArgument") .containsEntry("message", "The forward is not an email address") - .containsEntry("cause", "Out of data at position 1 in 'not-an-address'"); + .containsEntry("details", "Out of data at position 1 in 'not-an-address'"); } @Test @@ -429,8 +428,7 @@ class ForwardRoutesTest { when() .put(ALICE_WITH_SLASH + SEPARATOR + "targets" + SEPARATOR + BOB) .then() - .statusCode(HttpStatus.NOT_FOUND_404) - .body(containsString("404 Not found")); + .statusCode(HttpStatus.NOT_FOUND_404); } @Test @@ -438,8 +436,7 @@ class ForwardRoutesTest { when() .put(ALICE + SEPARATOR + "targets" + SEPARATOR + ALICE_WITH_SLASH) .then() - .statusCode(HttpStatus.NOT_FOUND_404) - .body(containsString("404 Not found")); + .statusCode(HttpStatus.NOT_FOUND_404); } @Test @@ -458,7 +455,7 @@ class ForwardRoutesTest { .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400) .containsEntry("type", "InvalidArgument") .containsEntry("message", "The forward is not an email address") - .containsEntry("cause", "Out of data at position 1 in 'not-an-address'"); + .containsEntry("details", "Out of data at position 1 in 'not-an-address'"); } @Test @@ -488,7 +485,7 @@ class ForwardRoutesTest { .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400) .containsEntry("type", "InvalidArgument") .containsEntry("message", "The forward is not an email address") - .containsEntry("cause", "Out of data at position 1 in 'not-an-address'"); + .containsEntry("details", "Out of data at position 1 in 'not-an-address'"); } @Test @@ -507,7 +504,7 @@ class ForwardRoutesTest { .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400) .containsEntry("type", "InvalidArgument") .containsEntry("message", "The forward is not an email address") - .containsEntry("cause", "Out of data at position 1 in 'not-an-address'"); + .containsEntry("details", "Out of data at position 1 in 'not-an-address'"); } @Test @@ -530,8 +527,7 @@ class ForwardRoutesTest { when() .put(ALICE + SEPARATOR + "targets" + SEPARATOR + BOB) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -543,8 +539,7 @@ class ForwardRoutesTest { when() .put(ALICE + SEPARATOR + "targets" + SEPARATOR + BOB) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -556,8 +551,7 @@ class ForwardRoutesTest { when() .put(ALICE + SEPARATOR + "targets" + SEPARATOR + BOB) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -569,8 +563,7 @@ class ForwardRoutesTest { when() .get() .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -582,8 +575,7 @@ class ForwardRoutesTest { when() .get() .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -595,8 +587,7 @@ class ForwardRoutesTest { when() .get() .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -608,8 +599,7 @@ class ForwardRoutesTest { when() .delete(ALICE + SEPARATOR + "targets" + SEPARATOR + BOB) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -621,8 +611,7 @@ class ForwardRoutesTest { when() .delete(ALICE + SEPARATOR + "targets" + SEPARATOR + BOB) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -634,8 +623,7 @@ class ForwardRoutesTest { when() .delete(ALICE + SEPARATOR + "targets" + SEPARATOR + BOB) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -647,8 +635,7 @@ class ForwardRoutesTest { when() .get(ALICE) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -660,8 +647,7 @@ class ForwardRoutesTest { when() .get(ALICE) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -673,8 +659,7 @@ class ForwardRoutesTest { when() .get(ALICE) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/99549a88/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java index 8011720..61fb855 100644 --- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java +++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java @@ -24,7 +24,6 @@ import static com.jayway.restassured.RestAssured.when; import static org.apache.james.webadmin.Constants.SEPARATOR; import static org.apache.james.webadmin.WebAdminServer.NO_CONFIGURATION; import static org.assertj.core.api.Assertions.assertThat; -import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.is; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; @@ -409,7 +408,7 @@ class GroupsRoutesTest { .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400) .containsEntry("type", "InvalidArgument") .containsEntry("message", "The group is not an email address") - .containsEntry("cause", "Out of data at position 1 in 'not-an-address'"); + .containsEntry("details", "Out of data at position 1 in 'not-an-address'"); } @Test @@ -428,7 +427,7 @@ class GroupsRoutesTest { .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400) .containsEntry("type", "InvalidArgument") .containsEntry("message", "The group is not an email address") - .containsEntry("cause", "Out of data at position 1 in 'not-an-address'"); + .containsEntry("details", "Out of data at position 1 in 'not-an-address'"); } @Test @@ -436,8 +435,7 @@ class GroupsRoutesTest { when() .put(GROUP_WITH_SLASH + SEPARATOR + USER_A) .then() - .statusCode(HttpStatus.NOT_FOUND_404) - .body(containsString("404 Not found")); + .statusCode(HttpStatus.NOT_FOUND_404); } @Test @@ -445,8 +443,7 @@ class GroupsRoutesTest { when() .put(GROUP1 + SEPARATOR + USER_WITH_SLASH) .then() - .statusCode(HttpStatus.NOT_FOUND_404) - .body(containsString("404 Not found")); + .statusCode(HttpStatus.NOT_FOUND_404); } @Test @@ -465,7 +462,7 @@ class GroupsRoutesTest { .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400) .containsEntry("type", "InvalidArgument") .containsEntry("message", "The group is not an email address") - .containsEntry("cause", "Out of data at position 1 in 'not-an-address'"); + .containsEntry("details", "Out of data at position 1 in 'not-an-address'"); } @Test @@ -493,7 +490,7 @@ class GroupsRoutesTest { .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400) .containsEntry("type", "InvalidArgument") .containsEntry("message", "The group is not an email address") - .containsEntry("cause", "Out of data at position 1 in 'not-an-address'"); + .containsEntry("details", "Out of data at position 1 in 'not-an-address'"); } @Test @@ -512,7 +509,7 @@ class GroupsRoutesTest { .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400) .containsEntry("type", "InvalidArgument") .containsEntry("message", "The group is not an email address") - .containsEntry("cause", "Out of data at position 1 in 'not-an-address'"); + .containsEntry("details", "Out of data at position 1 in 'not-an-address'"); } @Test @@ -533,8 +530,7 @@ class GroupsRoutesTest { when() .put(GROUP1 + SEPARATOR + GROUP2) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -546,8 +542,7 @@ class GroupsRoutesTest { when() .put(GROUP1 + SEPARATOR + GROUP2) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -559,8 +554,7 @@ class GroupsRoutesTest { when() .put(GROUP1 + SEPARATOR + GROUP2) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -572,8 +566,7 @@ class GroupsRoutesTest { when() .get() .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -585,8 +578,7 @@ class GroupsRoutesTest { when() .get() .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -598,8 +590,7 @@ class GroupsRoutesTest { when() .get() .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -611,8 +602,7 @@ class GroupsRoutesTest { when() .delete(GROUP1 + SEPARATOR + GROUP2) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -624,8 +614,7 @@ class GroupsRoutesTest { when() .delete(GROUP1 + SEPARATOR + GROUP2) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -637,8 +626,7 @@ class GroupsRoutesTest { when() .delete(GROUP1 + SEPARATOR + GROUP2) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -650,8 +638,7 @@ class GroupsRoutesTest { when() .get(GROUP1) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -663,8 +650,7 @@ class GroupsRoutesTest { when() .get(GROUP1) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -676,8 +662,7 @@ class GroupsRoutesTest { when() .get(GROUP1) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/99549a88/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesTest.java index 5c4ae39..1be5ba2 100644 --- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesTest.java +++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesTest.java @@ -146,7 +146,7 @@ class DomainQuotaRoutesTest { .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400) .containsEntry("type", "InvalidArgument") .containsEntry("message", "Invalid quota. Need to be an integer value greater or equal to -1") - .containsEntry("cause", "For input string: \"invalid\""); + .containsEntry("details", "For input string: \"invalid\""); } @Test @@ -262,7 +262,7 @@ class DomainQuotaRoutesTest { .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400) .containsEntry("type", "InvalidArgument") .containsEntry("message", "Invalid quota. Need to be an integer value greater or equal to -1") - .containsEntry("cause", "For input string: \"invalid\""); + .containsEntry("details", "For input string: \"invalid\""); } @Test http://git-wip-us.apache.org/repos/asf/james-project/blob/99549a88/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/GlobalQuotaRoutesTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/GlobalQuotaRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/GlobalQuotaRoutesTest.java index c82cb45..fd81fcf 100644 --- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/GlobalQuotaRoutesTest.java +++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/GlobalQuotaRoutesTest.java @@ -112,7 +112,7 @@ class GlobalQuotaRoutesTest { .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400) .containsEntry("type", "InvalidArgument") .containsEntry("message", "Invalid quota. Need to be an integer value greater or equal to -1") - .containsEntry("cause", "For input string: \"invalid\"")); + .containsEntry("details", "For input string: \"invalid\"")); } @Test @@ -220,7 +220,7 @@ class GlobalQuotaRoutesTest { .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400) .containsEntry("type", "InvalidArgument") .containsEntry("message", "Invalid quota. Need to be an integer value greater or equal to -1") - .containsEntry("cause", "For input string: \"invalid\"")); + .containsEntry("details", "For input string: \"invalid\"")); } @Test http://git-wip-us.apache.org/repos/asf/james-project/blob/99549a88/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java index 68c1cbf..1b457c4 100644 --- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java +++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java @@ -25,7 +25,6 @@ import static org.apache.james.webadmin.Constants.SEPARATOR; import static org.apache.james.webadmin.WebAdminServer.NO_CONFIGURATION; import static org.apache.james.webadmin.routes.UserMailboxesRoutes.USERS_BASE; import static org.assertj.core.api.Assertions.assertThat; -import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.is; import static org.mockito.Matchers.any; import static org.mockito.Mockito.doThrow; @@ -462,8 +461,7 @@ class UserMailboxesRoutesTest { when() .put() .then() - .statusCode(HttpStatus.NOT_FOUND_404) - .body(containsString(HttpStatus.NOT_FOUND_404 + " Not found")); + .statusCode(HttpStatus.NOT_FOUND_404); } @Test @@ -471,8 +469,7 @@ class UserMailboxesRoutesTest { when() .put(SEPARATOR) .then() - .statusCode(HttpStatus.NOT_FOUND_404) - .body(containsString(HttpStatus.NOT_FOUND_404 + " Not found")); + .statusCode(HttpStatus.NOT_FOUND_404); } @Test @@ -747,8 +744,7 @@ class UserMailboxesRoutesTest { when() .put(MAILBOX_NAME) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -758,8 +754,7 @@ class UserMailboxesRoutesTest { when() .put(MAILBOX_NAME) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -785,8 +780,7 @@ class UserMailboxesRoutesTest { when() .delete(MAILBOX_NAME) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -796,8 +790,7 @@ class UserMailboxesRoutesTest { when() .delete(MAILBOX_NAME) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -812,8 +805,7 @@ class UserMailboxesRoutesTest { when() .delete(MAILBOX_NAME) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -823,8 +815,7 @@ class UserMailboxesRoutesTest { when() .delete(MAILBOX_NAME) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -844,8 +835,7 @@ class UserMailboxesRoutesTest { when() .delete() .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -854,9 +844,8 @@ class UserMailboxesRoutesTest { when() .delete() - .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .then() + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @@ -872,8 +861,7 @@ class UserMailboxesRoutesTest { when() .delete() .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -901,8 +889,7 @@ class UserMailboxesRoutesTest { when() .delete() .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -912,8 +899,7 @@ class UserMailboxesRoutesTest { when() .get(MAILBOX_NAME) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -923,8 +909,7 @@ class UserMailboxesRoutesTest { when() .get(MAILBOX_NAME) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -934,8 +919,7 @@ class UserMailboxesRoutesTest { when() .get() .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -945,8 +929,7 @@ class UserMailboxesRoutesTest { when() .get() .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -956,8 +939,7 @@ class UserMailboxesRoutesTest { when() .get() .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -967,8 +949,7 @@ class UserMailboxesRoutesTest { when() .get(MAILBOX_NAME) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -978,8 +959,7 @@ class UserMailboxesRoutesTest { when() .put(MAILBOX_NAME) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -989,8 +969,7 @@ class UserMailboxesRoutesTest { when() .delete(MAILBOX_NAME) .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } @Test @@ -999,9 +978,8 @@ class UserMailboxesRoutesTest { when() .delete() - .then() - .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500) - .body(containsString("500 Internal Server Error")); + .then() + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/99549a88/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java index b3c7204..7c4dd85 100644 --- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java +++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java @@ -191,7 +191,7 @@ class UserQuotaRoutesTest { .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400) .containsEntry("type", "InvalidArgument") .containsEntry("message", "Invalid quota. Need to be an integer value greater or equal to -1") - .containsEntry("cause", "For input string: \"invalid\""); + .containsEntry("details", "For input string: \"invalid\""); } @Test @@ -320,7 +320,7 @@ class UserQuotaRoutesTest { .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400) .containsEntry("type", "InvalidArgument") .containsEntry("message", "Invalid quota. Need to be an integer value greater or equal to -1") - .containsEntry("cause", "For input string: \"invalid\""); + .containsEntry("details", "For input string: \"invalid\""); } @Test http://git-wip-us.apache.org/repos/asf/james-project/blob/99549a88/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java index 6bb564b..f3945bb 100644 --- a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java +++ b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java @@ -240,7 +240,7 @@ public class MailRepositoriesRoutesTest { .body("statusCode", is(500)) .body("type", is(ErrorResponder.ErrorType.SERVER_ERROR.getType())) .body("message", is("Error while listing keys")) - .body("cause", containsString("message")); + .body("details", containsString("message")); } @Test --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org