You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by rc...@apache.org on 2020/06/23 02:13:29 UTC
[james-project] 01/04: JAMES-3262 Add tests for
SolveMailboxInconsistenciesRequestToTask
This is an automated email from the ASF dual-hosted git repository.
rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit de4aae8994d6c3d8d8723469aa4302f6129f466e
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Mon Jun 22 10:41:43 2020 +0700
JAMES-3262 Add tests for SolveMailboxInconsistenciesRequestToTask
Proves as well that if we omit the `I-KNOW-WHAT-I-M-DOING` we return 500, which is wrong (should return 400)
---
.../task/SolveMailboxInconsistenciesService.java | 4 +-
...lveMailboxInconsistenciesRequestToTaskTest.java | 208 +++++++++++++++++++++
2 files changed, 210 insertions(+), 2 deletions(-)
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesService.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesService.java
index a10fc6d..aa53506 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesService.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesService.java
@@ -174,7 +174,7 @@ public class SolveMailboxInconsistenciesService {
}
}
- static class Context {
+ public static class Context {
static class Builder {
private Optional<Long> processedMailboxEntries;
private Optional<Long> processedMailboxPathEntries;
@@ -366,7 +366,7 @@ public class SolveMailboxInconsistenciesService {
this.versionManager = versionManager;
}
- Mono<Result> fixMailboxInconsistencies(Context context) {
+ public Mono<Result> fixMailboxInconsistencies(Context context) {
assertValidVersion();
return Flux.concat(
processMailboxDaoInconsistencies(context),
diff --git a/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/SolveMailboxInconsistenciesRequestToTaskTest.java b/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/SolveMailboxInconsistenciesRequestToTaskTest.java
new file mode 100644
index 0000000..6cf9cee
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/SolveMailboxInconsistenciesRequestToTaskTest.java
@@ -0,0 +1,208 @@
+/****************************************************************
+ * 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 io.restassured.RestAssured.given;
+import static io.restassured.RestAssured.when;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+
+import org.apache.james.json.DTOConverter;
+import org.apache.james.mailbox.cassandra.mail.task.SolveMailboxInconsistenciesService;
+import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesTaskAdditionalInformationDTO;
+import org.apache.james.task.Hostname;
+import org.apache.james.task.MemoryTaskManager;
+import org.apache.james.task.Task;
+import org.apache.james.task.TaskManager;
+import org.apache.james.webadmin.Routes;
+import org.apache.james.webadmin.WebAdminServer;
+import org.apache.james.webadmin.WebAdminUtils;
+import org.apache.james.webadmin.tasks.TaskFromRequestRegistry;
+import org.apache.james.webadmin.utils.ErrorResponder;
+import org.apache.james.webadmin.utils.JsonTransformer;
+import org.eclipse.jetty.http.HttpStatus;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+
+import io.restassured.RestAssured;
+import io.restassured.filter.log.LogDetail;
+import reactor.core.publisher.Mono;
+import spark.Service;
+
+public class SolveMailboxInconsistenciesRequestToTaskTest {
+ private final class JMAPRoutes implements Routes {
+ private final SolveMailboxInconsistenciesService service;
+ private final TaskManager taskManager;
+
+ private JMAPRoutes(SolveMailboxInconsistenciesService service, TaskManager taskManager) {
+ this.service = service;
+ this.taskManager = taskManager;
+ }
+
+ @Override
+ public String getBasePath() {
+ return BASE_PATH;
+ }
+
+ @Override
+ public void define(Service service) {
+ service.post(BASE_PATH,
+ TaskFromRequestRegistry.builder()
+ .registrations(new SolveMailboxInconsistenciesRequestToTask(this.service))
+ .buildAsRoute(taskManager),
+ new JsonTransformer());
+ }
+ }
+
+ static final String BASE_PATH = "/mailboxes";
+
+ private WebAdminServer webAdminServer;
+ private SolveMailboxInconsistenciesService service;
+ private MemoryTaskManager taskManager;
+
+ @BeforeEach
+ void setUp() {
+ JsonTransformer jsonTransformer = new JsonTransformer();
+ taskManager = new MemoryTaskManager(new Hostname("foo"));
+
+ service = mock(SolveMailboxInconsistenciesService.class);
+ Mockito.when(service.fixMailboxInconsistencies(any())).thenReturn(Mono.just(Task.Result.COMPLETED));
+
+ webAdminServer = WebAdminUtils.createWebAdminServer(
+ new TasksRoutes(taskManager, jsonTransformer, DTOConverter.of(SolveMessageInconsistenciesTaskAdditionalInformationDTO.module())),
+ new JMAPRoutes(
+ service,
+ taskManager))
+ .start();
+
+ RestAssured.requestSpecification = WebAdminUtils.buildRequestSpecification(webAdminServer)
+ .setBasePath(BASE_PATH)
+ .log(LogDetail.URI)
+ .build();
+ }
+
+ @AfterEach
+ void afterEach() {
+ webAdminServer.destroy();
+ taskManager.stop();
+ }
+
+ @Test
+ void actionRequestParameterShouldBeCompulsory() {
+ when()
+ .post()
+ .then()
+ .statusCode(HttpStatus.BAD_REQUEST_400)
+ .body("statusCode", is(400))
+ .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+ .body("message", is("Invalid arguments supplied in the user request"))
+ .body("details", is("'action' query parameter is compulsory. Supported values are [SolveInconsistencies]"));
+ }
+
+ @Test
+ void postShouldFailUponEmptyTask() {
+ given()
+ .queryParam("action", "")
+ .post()
+ .then()
+ .statusCode(HttpStatus.BAD_REQUEST_400)
+ .body("statusCode", is(400))
+ .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+ .body("message", is("Invalid arguments supplied in the user request"))
+ .body("details", is("'action' query parameter cannot be empty or blank. Supported values are [SolveInconsistencies]"));
+ }
+
+ @Test
+ void postShouldFailUponInvalidAction() {
+ given()
+ .queryParam("action", "invalid")
+ .post()
+ .then()
+ .statusCode(HttpStatus.BAD_REQUEST_400)
+ .body("statusCode", is(400))
+ .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+ .body("message", is("Invalid arguments supplied in the user request"))
+ .body("details", is("Invalid value supplied for query parameter 'action': invalid. Supported values are [SolveInconsistencies]"));
+ }
+
+ @Test
+ @Disabled("JAMES-3262 : returns 500, should fix")
+ void postShouldFailWhenIKnowWhatImDoingHeaderIsMissing() {
+ given()
+ .queryParam("action", "SolveInconsistencies")
+ .post()
+ .then()
+ .statusCode(HttpStatus.BAD_REQUEST_400)
+ .body("statusCode", is(400))
+ .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+ .body("message", is("Invalid arguments supplied in the user request"))
+ .body("details", is("Due to concurrency risks, a `I-KNOW-WHAT-I-M-DOING` header should be positioned to " +
+ "`ALL-SERVICES-ARE-OFFLINE` in order to prevent accidental calls. " +
+ "Check the documentation for details."));
+ }
+
+ @Test
+ void postShouldFailWhenIKnowWhatImDoingHeaderIsInvalid() {
+ given()
+ .queryParam("action", "SolveInconsistencies")
+ .header("I-KNOW-WHAT-I-M-DOING", "invalid")
+ .post()
+ .then()
+ .statusCode(HttpStatus.BAD_REQUEST_400)
+ .body("statusCode", is(400))
+ .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+ .body("message", is("Invalid arguments supplied in the user request"))
+ .body("details", is("Due to concurrency risks, a `I-KNOW-WHAT-I-M-DOING` header should be positioned to " +
+ "`ALL-SERVICES-ARE-OFFLINE` in order to prevent accidental calls. " +
+ "Check the documentation for details."));
+ }
+
+ @Test
+ void postShouldFailWhenIKnowWhatImDoingHeaderIsEmpty() {
+ given()
+ .queryParam("action", "SolveInconsistencies")
+ .header("I-KNOW-WHAT-I-M-DOING", "")
+ .post()
+ .then()
+ .statusCode(HttpStatus.BAD_REQUEST_400)
+ .body("statusCode", is(400))
+ .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+ .body("message", is("Invalid arguments supplied in the user request"))
+ .body("details", is("Due to concurrency risks, a `I-KNOW-WHAT-I-M-DOING` header should be positioned to " +
+ "`ALL-SERVICES-ARE-OFFLINE` in order to prevent accidental calls. " +
+ "Check the documentation for details."));
+ }
+
+ @Test
+ void postShouldCreateANewTask() {
+ given()
+ .queryParam("action", "SolveInconsistencies")
+ .header("I-KNOW-WHAT-I-M-DOING", "ALL-SERVICES-ARE-OFFLINE")
+ .post()
+ .then()
+ .statusCode(HttpStatus.CREATED_201)
+ .body("taskId", notNullValue());
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org