JAMES-2106 JMAP support sort by subject, from, to and size
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/a3dced9c Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/a3dced9c Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/a3dced9c Branch: refs/heads/master Commit: a3dced9c203db1bf06321afd4b640eebe5dd38ae Parents: 533af6a Author: quynhn <qngu...@linagora.com> Authored: Mon Jul 31 16:41:58 2017 +0700 Committer: benwa <btell...@linagora.com> Committed: Tue Aug 8 10:40:42 2017 +0700 ---------------------------------------------------------------------- .../integration/GetMessageListMethodTest.java | 226 +++++++++++++++++++ .../apache/james/jmap/utils/SortConverter.java | 12 +- .../james/jmap/utils/SortConverterTest.java | 24 ++ 3 files changed, 259 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/a3dced9c/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java index 562e1ea..06bf60b 100644 --- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java +++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java @@ -847,6 +847,232 @@ public abstract class GetMessageListMethodTest { .body(ARGUMENTS + ".messageIds", contains(message1.getMessageId().serialize(), message2.getMessageId().serialize())); } + @Test + public void getMessageListShouldSortMessagesWhenSortedBySubjectAsc() throws Exception { + mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox"); + + LocalDate date = LocalDate.now(); + ComposedMessageId message1 = mailboxProbe.appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"), + new ByteArrayInputStream("Date: Fri, 02 Jun 2017 13:54:59 +0200\r\nSubject: a subject\r\n\r\ntestmail".getBytes()), convertToDate(date), false, new Flags()); + ComposedMessageId message2 = mailboxProbe.appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"), + new ByteArrayInputStream("Date: Fri, 02 Jun 2017 14:54:59 +0200\r\nSubject: b subject\r\n\r\ntestmail".getBytes()), convertToDate(date), false, new Flags()); + await(); + + given() + .header("Authorization", accessToken.serialize()) + .body("[[\"getMessageList\", {\"sort\":[\"subject asc\"]}, \"#0\"]]") + .when() + .post("/jmap") + .then() + .statusCode(200) + .body(NAME, equalTo("messageList")) + .body(ARGUMENTS + ".messageIds", contains(message1.getMessageId().serialize(), message2.getMessageId().serialize())); + } + + @Test + public void getMessageListShouldSortMessagesWhenSortedBySubjectDesc() throws Exception { + mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox"); + + LocalDate date = LocalDate.now(); + ComposedMessageId message1 = mailboxProbe.appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"), + new ByteArrayInputStream("Date: Fri, 02 Jun 2017 13:54:59 +0200\r\nSubject: a subject\r\n\r\ntestmail".getBytes()), convertToDate(date), false, new Flags()); + ComposedMessageId message2 = mailboxProbe.appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"), + new ByteArrayInputStream("Date: Fri, 02 Jun 2017 14:54:59 +0200\r\nSubject: b subject\r\n\r\ntestmail".getBytes()), convertToDate(date), false, new Flags()); + await(); + + given() + .header("Authorization", accessToken.serialize()) + .body("[[\"getMessageList\", {\"sort\":[\"subject desc\"]}, \"#0\"]]") + .when() + .post("/jmap") + .then() + .statusCode(200) + .body(NAME, equalTo("messageList")) + .body(ARGUMENTS + ".messageIds", contains(message2.getMessageId().serialize(), message1.getMessageId().serialize())); + } + + @Test + public void getMessageListShouldSortMessagesWhenSortedByFromAsc() throws Exception { + mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox"); + + LocalDate date = LocalDate.now(); + ComposedMessageId message1 = mailboxProbe.appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"), + new ByteArrayInputStream("Date: Fri, 02 Jun 2017 13:54:59 +0200\r\nSubject: subject\r\nFrom: bbb\r\n\r\ntestmail".getBytes()), convertToDate(date), false, new Flags()); + ComposedMessageId message2 = mailboxProbe.appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"), + new ByteArrayInputStream("Date: Fri, 02 Jun 2017 14:54:59 +0200\r\nSubject: subject\r\nFrom: aaa\r\n\r\ntestmail".getBytes()), convertToDate(date), false, new Flags()); + await(); + + given() + .header("Authorization", accessToken.serialize()) + .body("[[\"getMessageList\", {\"sort\":[\"from asc\"]}, \"#0\"]]") + .when() + .post("/jmap") + .then() + .statusCode(200) + .body(NAME, equalTo("messageList")) + .body(ARGUMENTS + ".messageIds", contains(message2.getMessageId().serialize(), message1.getMessageId().serialize())); + } + + @Test + public void getMessageListShouldSortMessagesWhenSortedByFromDesc() throws Exception { + mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox"); + + LocalDate date = LocalDate.now(); + ComposedMessageId message1 = mailboxProbe.appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"), + new ByteArrayInputStream("Date: Fri, 02 Jun 2017 13:54:59 +0200\r\nSubject: subject\r\nFrom: aaa\r\n\r\ntestmail".getBytes()), convertToDate(date), false, new Flags()); + ComposedMessageId message2 = mailboxProbe.appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"), + new ByteArrayInputStream("Date: Fri, 02 Jun 2017 14:54:59 +0200\r\nSubject: subject\r\nFrom: bbb\r\n\r\ntestmail".getBytes()), convertToDate(date), false, new Flags()); + await(); + + given() + .header("Authorization", accessToken.serialize()) + .body("[[\"getMessageList\", {\"sort\":[\"from desc\"]}, \"#0\"]]") + .when() + .post("/jmap") + .then() + .statusCode(200) + .body(NAME, equalTo("messageList")) + .body(ARGUMENTS + ".messageIds", contains(message2.getMessageId().serialize(), message1.getMessageId().serialize())); + } + + @Test + public void getMessageListShouldSortMessagesWhenSortedByToAsc() throws Exception { + mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox"); + + LocalDate date = LocalDate.now(); + ComposedMessageId message1 = mailboxProbe.appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"), + new ByteArrayInputStream("Date: Fri, 02 Jun 2017 13:54:59 +0200\r\nSubject: subject\r\nTo: bbb\r\n\r\ntestmail".getBytes()), convertToDate(date), false, new Flags()); + ComposedMessageId message2 = mailboxProbe.appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"), + new ByteArrayInputStream("Date: Fri, 02 Jun 2017 14:54:59 +0200\r\nSubject: subject\r\nTo: aaa\r\n\r\ntestmail".getBytes()), convertToDate(date), false, new Flags()); + await(); + + given() + .header("Authorization", accessToken.serialize()) + .body("[[\"getMessageList\", {\"sort\":[\"to asc\"]}, \"#0\"]]") + .when() + .post("/jmap") + .then() + .statusCode(200) + .body(NAME, equalTo("messageList")) + .body(ARGUMENTS + ".messageIds", contains(message2.getMessageId().serialize(), message1.getMessageId().serialize())); + } + + @Test + public void getMessageListShouldSortMessagesWhenSortedByToDesc() throws Exception { + mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox"); + + LocalDate date = LocalDate.now(); + ComposedMessageId message1 = mailboxProbe.appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"), + new ByteArrayInputStream("Date: Fri, 02 Jun 2017 13:54:59 +0200\r\nSubject: subject\r\nTo: aaa\r\n\r\ntestmail".getBytes()), convertToDate(date), false, new Flags()); + ComposedMessageId message2 = mailboxProbe.appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"), + new ByteArrayInputStream("Date: Fri, 02 Jun 2017 14:54:59 +0200\r\nSubject: subject\r\nTo: bbb\r\n\r\ntestmail".getBytes()), convertToDate(date), false, new Flags()); + await(); + + given() + .header("Authorization", accessToken.serialize()) + .body("[[\"getMessageList\", {\"sort\":[\"to desc\"]}, \"#0\"]]") + .when() + .post("/jmap") + .then() + .statusCode(200) + .body(NAME, equalTo("messageList")) + .body(ARGUMENTS + ".messageIds", contains(message2.getMessageId().serialize(), message1.getMessageId().serialize())); + } + + + @Test + public void getMessageListShouldSortMessagesWhenSortedBySizeAsc() throws Exception { + mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox"); + + LocalDate date = LocalDate.now(); + ComposedMessageId message1 = mailboxProbe.appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"), + new ByteArrayInputStream("Date: Fri, 02 Jun 2017 13:54:59 +0200\r\nSubject: subject\r\n\r\ntestmail".getBytes()), convertToDate(date), false, new Flags()); + ComposedMessageId message2 = mailboxProbe.appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"), + new ByteArrayInputStream("Date: Fri, 02 Jun 2017 14:54:59 +0200\r\nSubject: subject\r\n\r\ntestmail bigger".getBytes()), convertToDate(date), false, new Flags()); + await(); + + given() + .header("Authorization", accessToken.serialize()) + .body("[[\"getMessageList\", {\"sort\":[\"size asc\"]}, \"#0\"]]") + .when() + .post("/jmap") + .then() + .statusCode(200) + .body(NAME, equalTo("messageList")) + .body(ARGUMENTS + ".messageIds", contains(message1.getMessageId().serialize(), message2.getMessageId().serialize())); + } + + @Test + public void getMessageListShouldSortMessagesWhenSortedBySizeDesc() throws Exception { + mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox"); + + LocalDate date = LocalDate.now(); + ComposedMessageId message1 = mailboxProbe.appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"), + new ByteArrayInputStream("Date: Fri, 02 Jun 2017 13:54:59 +0200\r\nSubject: subject\r\n\r\ntestmail".getBytes()), convertToDate(date), false, new Flags()); + ComposedMessageId message2 = mailboxProbe.appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"), + new ByteArrayInputStream("Date: Fri, 02 Jun 2017 14:54:59 +0200\r\nSubject: subject\r\n\r\ntestmail bigger".getBytes()), convertToDate(date), false, new Flags()); + await(); + + given() + .header("Authorization", accessToken.serialize()) + .body("[[\"getMessageList\", {\"sort\":[\"size desc\"]}, \"#0\"]]") + .when() + .post("/jmap") + .then() + .statusCode(200) + .body(NAME, equalTo("messageList")) + .body(ARGUMENTS + ".messageIds", contains(message2.getMessageId().serialize(), message1.getMessageId().serialize())); + } + + @Test + public void getMessageListShouldSortMessagesWhenSortedBySizeAndDateAsc() throws Exception { + mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox"); + + LocalDate date = LocalDate.now(); + ComposedMessageId message1 = mailboxProbe.appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"), + new ByteArrayInputStream("Date: Fri, 02 Jun 2017 13:54:59 +0200\r\nSubject: test\r\n\r\ntestmail really bigger".getBytes()), convertToDate(date.plusDays(1)), false, new Flags()); + ComposedMessageId message2 = mailboxProbe.appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"), + new ByteArrayInputStream("Date: Fri, 02 Jun 2017 14:54:59 +0200\r\nSubject: test\r\n\r\ntestmail smaller".getBytes()), convertToDate(date), false, new Flags()); + ComposedMessageId message3 = mailboxProbe.appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"), + new ByteArrayInputStream("Date: Fri, 02 Jun 2017 15:54:59 +0200\r\nSubject: test\r\n\r\ntestmail really bigger".getBytes()), convertToDate(date.plusDays(1)), false, new Flags()); + + await(); + + given() + .header("Authorization", accessToken.serialize()) + .body("[[\"getMessageList\", {\"sort\":[\"size asc\", \"date desc\"]}, \"#0\"]]") + .when() + .post("/jmap") + .then() + .statusCode(200) + .body(NAME, equalTo("messageList")) + .body(ARGUMENTS + ".messageIds", contains(message2.getMessageId().serialize(), message3.getMessageId().serialize(), message1.getMessageId().serialize())); + } + + @Test + public void getMessageListShouldSortMessagesWhenSortedByDateAndSizeAsc() throws Exception { + mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox"); + + LocalDate date = LocalDate.now(); + ComposedMessageId message1 = mailboxProbe.appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"), + new ByteArrayInputStream("Date: Fri, 02 Jun 2017 13:54:59 +0200\r\nSubject: test\r\n\r\ntestmail really bigger".getBytes()), convertToDate(date), false, new Flags()); + ComposedMessageId message2 = mailboxProbe.appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"), + new ByteArrayInputStream("Date: Fri, 02 Jun 2017 13:54:59 +0200\r\nSubject: test\r\n\r\ntestmail smaller".getBytes()), convertToDate(date), false, new Flags()); + ComposedMessageId message3 = mailboxProbe.appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"), + new ByteArrayInputStream("Date: Fri, 02 Jun 2017 15:54:59 +0200\r\nSubject: test\r\n\r\ntestmail really bigger".getBytes()), convertToDate(date), false, new Flags()); + + await(); + + given() + .header("Authorization", accessToken.serialize()) + .body("[[\"getMessageList\", {\"sort\":[\"date desc\", \"size asc\"]}, \"#0\"]]") + .when() + .post("/jmap") + .then() + .statusCode(200) + .body(NAME, equalTo("messageList")) + .body(ARGUMENTS + ".messageIds", contains(message3.getMessageId().serialize(), message2.getMessageId().serialize(), message1.getMessageId().serialize())); + } @Test public void getMessageListShouldSupportIdSorting() throws Exception { http://git-wip-us.apache.org/repos/asf/james-project/blob/a3dced9c/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SortConverter.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SortConverter.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SortConverter.java index 5d5daac..76b72e8 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SortConverter.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SortConverter.java @@ -38,9 +38,15 @@ public class SortConverter { private static final String DESC_ORDERING = "desc"; private static final String ASC_ORDERING = "asc"; - private static final Map<String, SortClause> SORT_CLAUSE_MAP = ImmutableMap.of( - "date", SortClause.SentDate, - "id", SortClause.Id); + private static final Map<String, SortClause> SORT_CLAUSE_MAP = + ImmutableMap.<String, SortClause>builder() + .put("date", SortClause.SentDate) + .put("id", SortClause.Id) + .put("subject", SortClause.BaseSubject) + .put("from", SortClause.MailboxFrom) + .put("to", SortClause.MailboxTo) + .put("size", SortClause.Size) + .build(); public static List<Sort> convertToSorts(List<String> jmapSorts) { http://git-wip-us.apache.org/repos/asf/james-project/blob/a3dced9c/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/SortConverterTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/SortConverterTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/SortConverterTest.java index af0686c..bb1af24 100644 --- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/SortConverterTest.java +++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/SortConverterTest.java @@ -111,4 +111,28 @@ public class SortConverterTest { .containsExactly(new Sort(SortClause.SentDate, Order.NATURAL), new Sort(SortClause.Id, Order.REVERSE)); } + + @Test + public void convertToSortsShouldSupportSubject() { + assertThat(SortConverter.convertToSorts(ImmutableList.of("subject desc"))) + .containsExactly(new Sort(SortClause.BaseSubject, Order.REVERSE)); + } + + @Test + public void convertToSortsShouldSupportFrom() { + assertThat(SortConverter.convertToSorts(ImmutableList.of("from desc"))) + .containsExactly(new Sort(SortClause.MailboxFrom, Order.REVERSE)); + } + + @Test + public void convertToSortsShouldSupportTo() { + assertThat(SortConverter.convertToSorts(ImmutableList.of("to desc"))) + .containsExactly(new Sort(SortClause.MailboxTo, Order.REVERSE)); + } + + @Test + public void convertToSortsShouldSupportSize() { + assertThat(SortConverter.convertToSorts(ImmutableList.of("size desc"))) + .containsExactly(new Sort(SortClause.Size, Order.REVERSE)); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org