JAMES-2292 Filter delayed messages
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/60b743a2 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/60b743a2 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/60b743a2 Branch: refs/heads/master Commit: 60b743a291df597f4577deebf50fac14cb2df420 Parents: 3a01417 Author: Antoine Duprat <[email protected]> Authored: Tue Jan 23 16:41:04 2018 +0100 Committer: benwa <[email protected]> Committed: Thu Jan 25 11:46:05 2018 +0700 ---------------------------------------------------------------------- .../james/webadmin/routes/MailQueueRoutes.java | 35 ++++++++--- .../webadmin/routes/MailQueueRoutesTest.java | 51 +++++++++++++++ .../routes/MailQueueRoutesUnitTest.java | 65 ++++++++++++++++++++ 3 files changed, 142 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/60b743a2/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java index c44ee91..bcaee97 100644 --- a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java +++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java @@ -22,6 +22,7 @@ package org.apache.james.webadmin.routes; import static org.apache.james.webadmin.Constants.SEPARATOR; import java.util.List; +import java.util.Optional; import javax.inject.Inject; import javax.ws.rs.GET; @@ -64,6 +65,9 @@ public class MailQueueRoutes implements Routes { @VisibleForTesting static final String BASE_URL = "/mailQueues"; @VisibleForTesting static final String MAIL_QUEUE_NAME = ":mailQueueName"; @VisibleForTesting static final String MESSAGES = "/messages"; + + private static final String DELAYED_QUERY_PARAM = "delayed"; + private static final Logger LOGGER = LoggerFactory.getLogger(MailQueueRoutes.class); private final MailQueueFactory<ManageableMailQueue> mailQueueFactory; @@ -150,7 +154,8 @@ public class MailQueueRoutes implements Routes { @GET @Path("/{mailQueueName}/messages") @ApiImplicitParams({ - @ApiImplicitParam(required = true, dataType = "string", name = "mailQueueName", paramType = "path") + @ApiImplicitParam(required = true, dataType = "string", name = "mailQueueName", paramType = "path"), + @ApiImplicitParam(required = false, dataType = "boolean", name = DELAYED_QUERY_PARAM, paramType = "query") }) @ApiOperation( value = "List the messages of the MailQueue" @@ -168,19 +173,26 @@ public class MailQueueRoutes implements Routes { private List<MailQueueItemDTO> listMessages(Request request) { String mailQueueName = request.params(MAIL_QUEUE_NAME); - return mailQueueFactory.getQueue(mailQueueName).map(this::listMessages) - .orElseThrow( - () -> ErrorResponder.builder() - .message(String.format("%s can not be found", mailQueueName)) - .statusCode(HttpStatus.NOT_FOUND_404) - .type(ErrorResponder.ErrorType.NOT_FOUND) - .haltError()); + return mailQueueFactory.getQueue(mailQueueName) + .map(name -> listMessages(name, isDelayed(request.queryParams(DELAYED_QUERY_PARAM)))) + .orElseThrow( + () -> ErrorResponder.builder() + .message(String.format("%s can not be found", mailQueueName)) + .statusCode(HttpStatus.NOT_FOUND_404) + .type(ErrorResponder.ErrorType.NOT_FOUND) + .haltError()); + } + + @VisibleForTesting Optional<Boolean> isDelayed(String delayedAsString) { + return Optional.ofNullable(delayedAsString) + .map(Boolean::parseBoolean); } - private List<MailQueueItemDTO> listMessages(ManageableMailQueue queue) { + private List<MailQueueItemDTO> listMessages(ManageableMailQueue queue, Optional<Boolean> isDelayed) { try { return Iterators.toStream(queue.browse()) .map(Throwing.function(MailQueueItemDTO::from)) + .filter(item -> filter(item, isDelayed)) .collect(Guavate.toImmutableList()); } catch (MailQueueException e) { LOGGER.info("Invalid request for getting the mail queue " + queue, e); @@ -192,4 +204,9 @@ public class MailQueueRoutes implements Routes { .haltError(); } } + + private boolean filter(MailQueueItemDTO item, Optional<Boolean> isDelayed) { + return isDelayed.map(delayed -> delayed == item.isDelayed()) + .orElse(true); + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/60b743a2/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java index 44fc597..1e0f942 100644 --- a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java +++ b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java @@ -30,6 +30,7 @@ import static org.hamcrest.Matchers.hasSize; import java.nio.charset.StandardCharsets; import java.util.List; +import java.util.concurrent.TimeUnit; import org.apache.james.core.MailAddress; import org.apache.james.metrics.api.NoopMetricFactory; @@ -44,6 +45,7 @@ import org.apache.mailet.base.test.FakeMail; import org.eclipse.jetty.http.HttpStatus; import org.junit.After; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import com.github.steveash.guavate.Guavate; @@ -215,4 +217,53 @@ public class MailQueueRoutesTest { .body(firstMessage + ".recipients", equalTo(expectedRecipients)) .body(firstMessage + ".delayed", equalTo(false)); } + + @Test + public void listMessagesShouldReturnEmptyWhenNoDelayedMessagesAndAskFor() throws Exception { + MemoryMailQueue queue = mailQueueFactory.createQueue(FIRST_QUEUE); + FakeMail mail = Mails.defaultMail().build(); + queue.enQueue(mail); + + RestAssured.given() + .param("delayed", "true") + .when() + .get(FIRST_QUEUE + "/messages") + .then() + .statusCode(HttpStatus.OK_200) + .contentType(ContentType.JSON) + .body(".", empty()); + } + + @Test + public void listMessagesShouldReturnCurrentMessagesWhenMessagesAndAskForNotDelayed() throws Exception { + MemoryMailQueue queue = mailQueueFactory.createQueue(FIRST_QUEUE); + FakeMail mail = Mails.defaultMail().build(); + queue.enQueue(mail); + + RestAssured.given() + .param("delayed", "false") + .when() + .get(FIRST_QUEUE + "/messages") + .then() + .statusCode(HttpStatus.OK_200) + .contentType(ContentType.JSON) + .body(".", hasSize(1)); + } + + @Ignore("MemoryMailQueueFactory doesn't support delay") + @Test + public void listMessagesShouldReturnDelayedMessagesAndAskFor() throws Exception { + MemoryMailQueue queue = mailQueueFactory.createQueue(FIRST_QUEUE); + FakeMail mail = Mails.defaultMail().build(); + queue.enQueue(mail, 10, TimeUnit.MINUTES); + + RestAssured.given() + .param("delayed", "true") + .when() + .get(FIRST_QUEUE + "/messages") + .then() + .statusCode(HttpStatus.OK_200) + .contentType(ContentType.JSON) + .body(".", hasSize(1)); + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/60b743a2/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesUnitTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesUnitTest.java b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesUnitTest.java new file mode 100644 index 0000000..859f52e --- /dev/null +++ b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesUnitTest.java @@ -0,0 +1,65 @@ +/**************************************************************** + * 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 org.assertj.core.api.Assertions.assertThat; + +import java.util.Optional; + +import org.apache.james.queue.api.MailQueueFactory; +import org.apache.james.queue.api.ManageableMailQueue; +import org.apache.james.webadmin.utils.JsonTransformer; +import org.junit.Before; +import org.junit.Test; + +public class MailQueueRoutesUnitTest { + + MailQueueRoutes testee; + + @Before + public void setup() { + MailQueueFactory<ManageableMailQueue> mailQueueFactory = null; + testee = new MailQueueRoutes(mailQueueFactory, new JsonTransformer()); + } + + @Test + public void isDelayedShouldReturnEmptyWhenNull() { + Optional<Boolean> delayed = testee.isDelayed(null); + assertThat(delayed).isEmpty(); + } + + @Test + public void isDelayedShouldBeEqualsToTrueWhenTrue() { + Optional<Boolean> delayed = testee.isDelayed("true"); + assertThat(delayed).contains(true); + } + + @Test + public void isDelayedShouldBeEqualsToFalseWhenFalse() { + Optional<Boolean> delayed = testee.isDelayed("false"); + assertThat(delayed).contains(false); + } + + @Test + public void isDelayedShouldBeEqualsToFalseWhenOtherValue() { + Optional<Boolean> delayed = testee.isDelayed("abc"); + assertThat(delayed).contains(false); + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
