This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 293a9938b08a2656a82f5a47febb2fc6d3e22550 Author: Benoit Tellier <btell...@linagora.com> AuthorDate: Mon Dec 16 14:38:45 2019 +0700 JAMES-2993 Implement recompute all JMAP message preview request to task --- .../protocols/webadmin/webadmin-data-jmap/pom.xml | 5 + .../james/webadmin/data/jmap/Constants.java} | 35 +- .../jmap/MessageFastViewProjectionCorrector.java | 48 ++- ...teAllFastViewProjectionItemsRequestToTask.java} | 36 +-- .../data/jmap/RecomputeAllPreviewsTask.java | 29 -- ...llFastViewProjectionItemsRequestToTaskTest.java | 353 +++++++++++++++++++++ ...llPreviewsTaskAdditionalInformationDTOTest.java | 6 - .../RecomputeAllPreviewsTaskSerializationTest.java | 7 - .../json/recomputeAll.additionalInformation.json | 2 +- .../src/test/resources/json/recomputeAll.task.json | 2 +- 10 files changed, 412 insertions(+), 111 deletions(-) diff --git a/server/protocols/webadmin/webadmin-data-jmap/pom.xml b/server/protocols/webadmin/webadmin-data-jmap/pom.xml index e42b17e..7c9330f 100644 --- a/server/protocols/webadmin/webadmin-data-jmap/pom.xml +++ b/server/protocols/webadmin/webadmin-data-jmap/pom.xml @@ -96,6 +96,11 @@ </dependency> <dependency> <groupId>${james.groupId}</groupId> + <artifactId>metrics-tests</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>${james.groupId}</groupId> <artifactId>testing-base</artifactId> <scope>test</scope> </dependency> diff --git a/server/protocols/webadmin/webadmin-data-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllPreviewsTaskSerializationTest.java b/server/protocols/webadmin/webadmin-data-jmap/src/main/java/org/apache/james/webadmin/data/jmap/Constants.java similarity index 54% copy from server/protocols/webadmin/webadmin-data-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllPreviewsTaskSerializationTest.java copy to server/protocols/webadmin/webadmin-data-jmap/src/main/java/org/apache/james/webadmin/data/jmap/Constants.java index e56432a..b076804 100644 --- a/server/protocols/webadmin/webadmin-data-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllPreviewsTaskSerializationTest.java +++ b/server/protocols/webadmin/webadmin-data-jmap/src/main/java/org/apache/james/webadmin/data/jmap/Constants.java @@ -19,35 +19,8 @@ package org.apache.james.webadmin.data.jmap; -import static org.mockito.Mockito.mock; +import org.apache.james.webadmin.tasks.TaskRegistrationKey; -import org.apache.james.JsonSerializationVerifier; -import org.apache.james.util.ClassLoaderUtils; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import nl.jqno.equalsverifier.EqualsVerifier; - -class RecomputeAllPreviewsTaskSerializationTest { - MessageFastViewProjectionCorrector corrector; - - @BeforeEach - void setUp() { - corrector = mock(MessageFastViewProjectionCorrector.class); - } - - @Test - void shouldMatchJsonSerializationContract() throws Exception { - JsonSerializationVerifier.dtoModule(RecomputeAllPreviewsTask.module(corrector)) - .bean(new RecomputeAllPreviewsTask(corrector)) - .json(ClassLoaderUtils.getSystemResourceAsString("json/recomputeAll.task.json")) - .verify(); - } - - @Test - void shouldMatchBeanContract() { - EqualsVerifier.forClass(RecomputeAllPreviewsTask.class) - .withIgnoredFields("corrector", "progress") - .verify(); - } -} \ No newline at end of file +public interface Constants { + TaskRegistrationKey TASK_REGISTRATION_KEY = TaskRegistrationKey.of("recomputeFastViewProjectionItems"); +} diff --git a/server/protocols/webadmin/webadmin-data-jmap/src/main/java/org/apache/james/webadmin/data/jmap/MessageFastViewProjectionCorrector.java b/server/protocols/webadmin/webadmin-data-jmap/src/main/java/org/apache/james/webadmin/data/jmap/MessageFastViewProjectionCorrector.java index 6fc4c86..0eb7f08 100644 --- a/server/protocols/webadmin/webadmin-data-jmap/src/main/java/org/apache/james/webadmin/data/jmap/MessageFastViewProjectionCorrector.java +++ b/server/protocols/webadmin/webadmin-data-jmap/src/main/java/org/apache/james/webadmin/data/jmap/MessageFastViewProjectionCorrector.java @@ -19,6 +19,7 @@ package org.apache.james.webadmin.data.jmap; +import java.io.IOException; import java.util.concurrent.atomic.AtomicLong; import javax.inject.Inject; @@ -32,7 +33,10 @@ import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.MessageManager; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.model.FetchGroup; +import org.apache.james.mailbox.model.MailboxMetaData; +import org.apache.james.mailbox.model.MessageId; import org.apache.james.mailbox.model.MessageRange; +import org.apache.james.mailbox.model.MessageResult; import org.apache.james.mailbox.model.search.MailboxQuery; import org.apache.james.user.api.UsersRepository; import org.apache.james.user.api.UsersRepositoryException; @@ -111,8 +115,8 @@ public class MessageFastViewProjectionCorrector { private Mono<Void> correctUsersProjectionItems(Progress progress, Username username) { try { MailboxSession session = mailboxManager.createSystemSession(username); - return Flux.fromIterable(mailboxManager.search(MailboxQuery.privateMailboxesBuilder(session).build(), session)) - .concatMap(mailboxMetadata -> Mono.fromCallable(() -> mailboxManager.getMailbox(mailboxMetadata.getId(), session))) + return listUsersMailboxes(session) + .concatMap(mailboxMetadata -> retrieveMailbox(session, mailboxMetadata)) .concatMap(Throwing.function(messageManager -> correctMailboxProjectionItems(progress, messageManager, session))) .doOnComplete(progress.processedUserCount::incrementAndGet) .onErrorContinue((error, o) -> { @@ -128,10 +132,10 @@ public class MessageFastViewProjectionCorrector { } private Mono<Void> correctMailboxProjectionItems(Progress progress, MessageManager messageManager, MailboxSession session) throws MailboxException { - return Iterators.toFlux(messageManager.getMessages(MessageRange.all(), FetchGroup.MINIMAL, session)) - .concatMap(Throwing.function(messageResult -> Iterators.toFlux(messageManager.getMessages(MessageRange.all(), FetchGroup.BODY_CONTENT, session)))) - .map(Throwing.function(messageResult -> Pair.of(messageResult.getMessageId(), projectionItemFactory.from(messageResult)))) - .concatMap(pair -> Mono.from(messageFastViewProjection.store(pair.getKey(), pair.getValue())) + return listAllMailboxMessages(messageManager, session) + .concatMap(messageResult -> retrieveContent(messageManager, session, messageResult)) + .map(this::computeProjectionEntry) + .concatMap(pair -> storeProjectionEntry(pair) .doOnSuccess(any -> progress.processedMessageCount.incrementAndGet())) .onErrorContinue((error, triggeringValue) -> { LOGGER.error("JMAP preview re-computation aborted for {} - {}", session.getUser(), triggeringValue, error); @@ -139,4 +143,36 @@ public class MessageFastViewProjectionCorrector { }) .then(); } + + private Flux<MailboxMetaData> listUsersMailboxes(MailboxSession session) throws MailboxException { + return Flux.fromIterable(mailboxManager.search(MailboxQuery.privateMailboxesBuilder(session).build(), session)); + } + + private Mono<MessageManager> retrieveMailbox(MailboxSession session, MailboxMetaData mailboxMetadata) { + return Mono.fromCallable(() -> mailboxManager.getMailbox(mailboxMetadata.getId(), session)); + } + + private Flux<MessageResult> listAllMailboxMessages(MessageManager messageManager, MailboxSession session) throws MailboxException { + return Iterators.toFlux(messageManager.getMessages(MessageRange.all(), FetchGroup.MINIMAL, session)); + } + + private Flux<MessageResult> retrieveContent(MessageManager messageManager, MailboxSession session, MessageResult messageResult) { + try { + return Iterators.toFlux(messageManager.getMessages(MessageRange.one(messageResult.getUid()), FetchGroup.FULL_CONTENT, session)); + } catch (MailboxException e) { + return Flux.error(e); + } + } + + private Pair<MessageId, MessageFastViewPrecomputedProperties> computeProjectionEntry(MessageResult messageResult) { + try { + return Pair.of(messageResult.getMessageId(), projectionItemFactory.from(messageResult)); + } catch (MailboxException | IOException e) { + throw new RuntimeException(e); + } + } + + private Mono<Void> storeProjectionEntry(Pair<MessageId, MessageFastViewPrecomputedProperties> pair) { + return Mono.from(messageFastViewProjection.store(pair.getKey(), pair.getValue())); + } } diff --git a/server/protocols/webadmin/webadmin-data-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllPreviewsTaskSerializationTest.java b/server/protocols/webadmin/webadmin-data-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTask.java similarity index 55% copy from server/protocols/webadmin/webadmin-data-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllPreviewsTaskSerializationTest.java copy to server/protocols/webadmin/webadmin-data-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTask.java index e56432a..a5810e1 100644 --- a/server/protocols/webadmin/webadmin-data-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllPreviewsTaskSerializationTest.java +++ b/server/protocols/webadmin/webadmin-data-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTask.java @@ -19,35 +19,11 @@ package org.apache.james.webadmin.data.jmap; -import static org.mockito.Mockito.mock; +import org.apache.james.webadmin.tasks.TaskFromRequestRegistry; -import org.apache.james.JsonSerializationVerifier; -import org.apache.james.util.ClassLoaderUtils; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import nl.jqno.equalsverifier.EqualsVerifier; - -class RecomputeAllPreviewsTaskSerializationTest { - MessageFastViewProjectionCorrector corrector; - - @BeforeEach - void setUp() { - corrector = mock(MessageFastViewProjectionCorrector.class); - } - - @Test - void shouldMatchJsonSerializationContract() throws Exception { - JsonSerializationVerifier.dtoModule(RecomputeAllPreviewsTask.module(corrector)) - .bean(new RecomputeAllPreviewsTask(corrector)) - .json(ClassLoaderUtils.getSystemResourceAsString("json/recomputeAll.task.json")) - .verify(); - } - - @Test - void shouldMatchBeanContract() { - EqualsVerifier.forClass(RecomputeAllPreviewsTask.class) - .withIgnoredFields("corrector", "progress") - .verify(); +public class RecomputeAllFastViewProjectionItemsRequestToTask extends TaskFromRequestRegistry.TaskRegistration { + public RecomputeAllFastViewProjectionItemsRequestToTask(MessageFastViewProjectionCorrector corrector) { + super(Constants.TASK_REGISTRATION_KEY, + request -> new RecomputeAllPreviewsTask(corrector)); } -} \ No newline at end of file +} diff --git a/server/protocols/webadmin/webadmin-data-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllPreviewsTask.java b/server/protocols/webadmin/webadmin-data-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllPreviewsTask.java index bacf8ad..99b5b8d 100644 --- a/server/protocols/webadmin/webadmin-data-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllPreviewsTask.java +++ b/server/protocols/webadmin/webadmin-data-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllPreviewsTask.java @@ -82,25 +82,6 @@ public class RecomputeAllPreviewsTask implements Task { public Instant timestamp() { return timestamp; } - - @Override - public final boolean equals(Object o) { - if (o instanceof AdditionalInformation) { - AdditionalInformation that = (AdditionalInformation) o; - - return Objects.equals(this.processedUserCount, that.processedUserCount) - && Objects.equals(this.processedMessageCount, that.processedMessageCount) - && Objects.equals(this.failedUserCount, that.failedUserCount) - && Objects.equals(this.failedMessageCount, that.failedMessageCount) - && Objects.equals(this.timestamp, that.timestamp); - } - return false; - } - - @Override - public final int hashCode() { - return Objects.hash(processedUserCount, processedMessageCount, failedUserCount, failedMessageCount, timestamp); - } } public static class RecomputeAllPreviousTaskDTO implements TaskDTO { @@ -155,14 +136,4 @@ public class RecomputeAllPreviewsTask implements Task { public Optional<TaskExecutionDetails.AdditionalInformation> details() { return Optional.of(AdditionalInformation.from(progress)); } - - @Override - public final boolean equals(Object o) { - return o instanceof RecomputeAllPreviewsTask; - } - - @Override - public final int hashCode() { - return Objects.hash(RecomputeAllPreviewsTask.class); - } } \ No newline at end of file diff --git a/server/protocols/webadmin/webadmin-data-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTaskTest.java b/server/protocols/webadmin/webadmin-data-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTaskTest.java new file mode 100644 index 0000000..a351095 --- /dev/null +++ b/server/protocols/webadmin/webadmin-data-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTaskTest.java @@ -0,0 +1,353 @@ +/**************************************************************** + * 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.data.jmap; + +import static io.restassured.RestAssured.given; +import static io.restassured.RestAssured.when; +import static io.restassured.RestAssured.with; +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; + +import java.util.Optional; + +import org.apache.james.core.Username; +import org.apache.james.domainlist.api.DomainList; +import org.apache.james.jmap.api.model.Preview; +import org.apache.james.jmap.api.projections.MessageFastViewPrecomputedProperties; +import org.apache.james.jmap.draft.utils.JsoupHtmlTextExtractor; +import org.apache.james.jmap.memory.projections.MemoryMessageFastViewProjection; +import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MessageManager; +import org.apache.james.mailbox.inmemory.InMemoryMailboxManager; +import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources; +import org.apache.james.mailbox.model.ComposedMessageId; +import org.apache.james.mailbox.model.MailboxId; +import org.apache.james.mailbox.model.MailboxPath; +import org.apache.james.metrics.tests.RecordingMetricFactory; +import org.apache.james.task.Hostname; +import org.apache.james.task.MemoryTaskManager; +import org.apache.james.task.TaskManager; +import org.apache.james.user.memory.MemoryUsersRepository; +import org.apache.james.util.html.HtmlTextExtractor; +import org.apache.james.util.mime.MessageContentExtractor; +import org.apache.james.webadmin.Routes; +import org.apache.james.webadmin.WebAdminServer; +import org.apache.james.webadmin.WebAdminUtils; +import org.apache.james.webadmin.routes.TasksRoutes; +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.Test; + +import io.restassured.RestAssured; +import io.restassured.filter.log.LogDetail; +import spark.Service; + +class RecomputeAllFastViewProjectionItemsRequestToTaskTest { + private final class JMAPRoutes implements Routes { + private final MessageFastViewProjectionCorrector corrector; + private final TaskManager taskManager; + + private JMAPRoutes(MessageFastViewProjectionCorrector corrector, TaskManager taskManager) { + this.corrector = corrector; + this.taskManager = taskManager; + } + + @Override + public String getBasePath() { + return BASE_PATH; + } + + @Override + public void define(Service service) { + service.post(BASE_PATH, + TaskFromRequestRegistry.builder() + .registrations(new RecomputeAllFastViewProjectionItemsRequestToTask(corrector)) + .buildAsRoute(taskManager), + new JsonTransformer()); + } + } + + static final String BASE_PATH = "/mailboxes"; + + + static final MessageFastViewPrecomputedProperties PROJECTION_ITEM = MessageFastViewPrecomputedProperties.builder() + .preview(Preview.from("body")) + .hasAttachment(false) + .build(); + + static final DomainList NO_DOMAIN_LIST = null; + static final Username BOB = Username.of("bob"); + + private WebAdminServer webAdminServer; + private MemoryTaskManager taskManager; + private MemoryMessageFastViewProjection messageFastViewProjection; + private InMemoryMailboxManager mailboxManager; + private MemoryUsersRepository usersRepository; + + @BeforeEach + void setUp() { + JsonTransformer jsonTransformer = new JsonTransformer(); + taskManager = new MemoryTaskManager(new Hostname("foo")); + + messageFastViewProjection = new MemoryMessageFastViewProjection(new RecordingMetricFactory()); + mailboxManager = InMemoryIntegrationResources.defaultResources().getMailboxManager(); + usersRepository = MemoryUsersRepository.withoutVirtualHosting(NO_DOMAIN_LIST); + MessageContentExtractor messageContentExtractor = new MessageContentExtractor(); + HtmlTextExtractor htmlTextExtractor = new JsoupHtmlTextExtractor(); + Preview.Factory previewFactory = new Preview.Factory(messageContentExtractor, htmlTextExtractor); + MessageFastViewPrecomputedProperties.Factory projectionItemFactory = new MessageFastViewPrecomputedProperties.Factory(previewFactory); + webAdminServer = WebAdminUtils.createWebAdminServer( + new TasksRoutes(taskManager, jsonTransformer), + new JMAPRoutes( + new MessageFastViewProjectionCorrector(usersRepository, mailboxManager, messageFastViewProjection, projectionItemFactory), + 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 [recomputeFastViewProjectionItems]")); + } + + @Test + void postShouldFailUponEmptyAction() { + 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 [recomputeFastViewProjectionItems]")); + } + + @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 [recomputeFastViewProjectionItems]")); + } + + @Test + void postShouldCreateANewTask() { + given() + .queryParam("action", "recomputeFastViewProjectionItems") + .post() + .then() + .statusCode(HttpStatus.CREATED_201) + .body("taskId", notNullValue()); + } + + @Test + void recomputeAllShouldCompleteWhenNoUser() { + String taskId = with() + .queryParam("action", "recomputeFastViewProjectionItems") + .post() + .jsonPath() + .get("taskId"); + + given() + .basePath(TasksRoutes.BASE) + .when() + .get(taskId + "/await") + .then() + .body("status", is("completed")) + .body("taskId", is(taskId)) + .body("type", is("RecomputeAllPreviewsTask")) + .body("additionalInformation.processedUserCount", is(0)) + .body("additionalInformation.processedMessageCount", is(0)) + .body("additionalInformation.failedUserCount", is(0)) + .body("additionalInformation.failedMessageCount", is(0)) + .body("startedDate", is(notNullValue())) + .body("submitDate", is(notNullValue())) + .body("completedDate", is(notNullValue())); + } + + @Test + void recomputeAllShouldCompleteWhenUserWithNoMailbox()throws Exception { + usersRepository.addUser(BOB, "pass"); + + String taskId = with() + .queryParam("action", "recomputeFastViewProjectionItems") + .post() + .jsonPath() + .get("taskId"); + + given() + .basePath(TasksRoutes.BASE) + .when() + .get(taskId + "/await") + .then() + .body("status", is("completed")) + .body("taskId", is(taskId)) + .body("type", is("RecomputeAllPreviewsTask")) + .body("additionalInformation.processedUserCount", is(1)) + .body("additionalInformation.processedMessageCount", is(0)) + .body("additionalInformation.failedUserCount", is(0)) + .body("additionalInformation.failedMessageCount", is(0)) + .body("startedDate", is(notNullValue())) + .body("submitDate", is(notNullValue())) + .body("completedDate", is(notNullValue())); + } + + @Test + void recomputeAllShouldCompleteWhenUserWithNoMessage()throws Exception { + usersRepository.addUser(BOB, "pass"); + mailboxManager.createMailbox(MailboxPath.inbox(BOB), mailboxManager.createSystemSession(BOB)); + + String taskId = with() + .queryParam("action", "recomputeFastViewProjectionItems") + .post() + .jsonPath() + .get("taskId"); + + given() + .basePath(TasksRoutes.BASE) + .when() + .get(taskId + "/await") + .then() + .body("status", is("completed")) + .body("taskId", is(taskId)) + .body("type", is("RecomputeAllPreviewsTask")) + .body("additionalInformation.processedUserCount", is(1)) + .body("additionalInformation.processedMessageCount", is(0)) + .body("additionalInformation.failedUserCount", is(0)) + .body("additionalInformation.failedMessageCount", is(0)) + .body("startedDate", is(notNullValue())) + .body("submitDate", is(notNullValue())) + .body("completedDate", is(notNullValue())); + } + + @Test + void recomputeAllShouldCompleteWhenOneMessage()throws Exception { + usersRepository.addUser(BOB, "pass"); + MailboxSession session = mailboxManager.createSystemSession(BOB); + Optional<MailboxId> mailboxId = mailboxManager.createMailbox(MailboxPath.inbox(BOB), session); + mailboxManager.getMailbox(mailboxId.get(), session).appendMessage( + MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"), + session); + + String taskId = with() + .queryParam("action", "recomputeFastViewProjectionItems") + .post() + .jsonPath() + .get("taskId"); + + given() + .basePath(TasksRoutes.BASE) + .when() + .get(taskId + "/await") + .then() + .body("status", is("completed")) + .body("taskId", is(taskId)) + .body("type", is("RecomputeAllPreviewsTask")) + .body("additionalInformation.processedUserCount", is(1)) + .body("additionalInformation.processedMessageCount", is(1)) + .body("additionalInformation.failedUserCount", is(0)) + .body("additionalInformation.failedMessageCount", is(0)) + .body("startedDate", is(notNullValue())) + .body("submitDate", is(notNullValue())) + .body("completedDate", is(notNullValue())); + } + + @Test + void recomputeAllShouldUpdateProjection()throws Exception { + usersRepository.addUser(BOB, "pass"); + MailboxSession session = mailboxManager.createSystemSession(BOB); + Optional<MailboxId> mailboxId = mailboxManager.createMailbox(MailboxPath.inbox(BOB), session); + ComposedMessageId messageId = mailboxManager.getMailbox(mailboxId.get(), session).appendMessage( + MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"), + session); + + String taskId = with() + .queryParam("action", "recomputeFastViewProjectionItems") + .post() + .jsonPath() + .get("taskId"); + + with() + .basePath(TasksRoutes.BASE) + .get(taskId + "/await"); + + assertThat(messageFastViewProjection.retrieve(messageId.getMessageId()).block()) + .isEqualTo(PROJECTION_ITEM); + } + + @Test + void recomputeAllShouldBeIdempotent()throws Exception { + usersRepository.addUser(BOB, "pass"); + MailboxSession session = mailboxManager.createSystemSession(BOB); + Optional<MailboxId> mailboxId = mailboxManager.createMailbox(MailboxPath.inbox(BOB), session); + ComposedMessageId messageId = mailboxManager.getMailbox(mailboxId.get(), session).appendMessage( + MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"), + session); + + String taskId1 = with() + .queryParam("action", "recomputeFastViewProjectionItems") + .post() + .jsonPath() + .get("taskId"); + with() + .basePath(TasksRoutes.BASE) + .get(taskId1 + "/await"); + + String taskId2 = with() + .queryParam("action", "recomputeFastViewProjectionItems") + .post() + .jsonPath() + .get("taskId"); + with() + .basePath(TasksRoutes.BASE) + .get(taskId2 + "/await"); + + assertThat(messageFastViewProjection.retrieve(messageId.getMessageId()).block()) + .isEqualTo(PROJECTION_ITEM); + } +} \ No newline at end of file diff --git a/server/protocols/webadmin/webadmin-data-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllPreviewsTaskAdditionalInformationDTOTest.java b/server/protocols/webadmin/webadmin-data-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllPreviewsTaskAdditionalInformationDTOTest.java index 125464f..5fad6d9 100644 --- a/server/protocols/webadmin/webadmin-data-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllPreviewsTaskAdditionalInformationDTOTest.java +++ b/server/protocols/webadmin/webadmin-data-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllPreviewsTaskAdditionalInformationDTOTest.java @@ -38,10 +38,4 @@ class RecomputeAllPreviewsTaskAdditionalInformationDTOTest { .json(ClassLoaderUtils.getSystemResourceAsString("json/recomputeAll.additionalInformation.json")) .verify(); } - - @Test - void shouldMatchBeanContract() { - EqualsVerifier.forClass(RecomputeAllPreviewsTask.AdditionalInformation.class) - .verify(); - } } \ No newline at end of file diff --git a/server/protocols/webadmin/webadmin-data-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllPreviewsTaskSerializationTest.java b/server/protocols/webadmin/webadmin-data-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllPreviewsTaskSerializationTest.java index e56432a..177a2b6 100644 --- a/server/protocols/webadmin/webadmin-data-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllPreviewsTaskSerializationTest.java +++ b/server/protocols/webadmin/webadmin-data-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllPreviewsTaskSerializationTest.java @@ -43,11 +43,4 @@ class RecomputeAllPreviewsTaskSerializationTest { .json(ClassLoaderUtils.getSystemResourceAsString("json/recomputeAll.task.json")) .verify(); } - - @Test - void shouldMatchBeanContract() { - EqualsVerifier.forClass(RecomputeAllPreviewsTask.class) - .withIgnoredFields("corrector", "progress") - .verify(); - } } \ No newline at end of file diff --git a/server/protocols/webadmin/webadmin-data-jmap/src/test/resources/json/recomputeAll.additionalInformation.json b/server/protocols/webadmin/webadmin-data-jmap/src/test/resources/json/recomputeAll.additionalInformation.json index bc3d81f..6d130f9 100644 --- a/server/protocols/webadmin/webadmin-data-jmap/src/test/resources/json/recomputeAll.additionalInformation.json +++ b/server/protocols/webadmin/webadmin-data-jmap/src/test/resources/json/recomputeAll.additionalInformation.json @@ -1,5 +1,5 @@ { - "type":"RecomputeAllPreviewsTask", + "type":"RecomputeAllFastViewProjectionItemsTask", "timestamp":"2007-12-03T10:15:30Z", "processedUserCount":1, "processedMessageCount":2, diff --git a/server/protocols/webadmin/webadmin-data-jmap/src/test/resources/json/recomputeAll.task.json b/server/protocols/webadmin/webadmin-data-jmap/src/test/resources/json/recomputeAll.task.json index a447293..a76c799 100644 --- a/server/protocols/webadmin/webadmin-data-jmap/src/test/resources/json/recomputeAll.task.json +++ b/server/protocols/webadmin/webadmin-data-jmap/src/test/resources/json/recomputeAll.task.json @@ -1 +1 @@ -{"type":"RecomputeAllPreviewsTask"} \ No newline at end of file +{"type":"RecomputeAllFastViewProjectionItemsTask"} \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org