JAMES-2173 getMailboxes should display namespace and its integration testing
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/59d8a6bb Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/59d8a6bb Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/59d8a6bb Branch: refs/heads/master Commit: 59d8a6bb14d1a5532e66335ac8518214027e06a1 Parents: 5f458df Author: quynhn <qngu...@linagora.com> Authored: Thu Oct 5 11:48:01 2017 +0700 Committer: benwa <btell...@linagora.com> Committed: Fri Oct 6 13:52:05 2017 +0700 ---------------------------------------------------------------------- .../integration/GetMailboxesMethodTest.java | 39 ++++++++++++++++++++ .../apache/james/jmap/model/MailboxFactory.java | 10 +++++ .../james/jmap/model/mailbox/Mailbox.java | 22 +++++++++-- .../james/jmap/model/MailboxFactoryTest.java | 17 +++++++++ .../james/jmap/model/mailbox/MailboxTest.java | 2 +- 5 files changed, 85 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/59d8a6bb/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMailboxesMethodTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMailboxesMethodTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMailboxesMethodTest.java index 5e21f00..5e5c2cf 100644 --- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMailboxesMethodTest.java +++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMailboxesMethodTest.java @@ -47,6 +47,7 @@ import org.apache.james.GuiceJamesServer; import org.apache.james.jmap.DefaultMailboxes; import org.apache.james.jmap.HttpJmapAuthentication; import org.apache.james.jmap.api.access.AccessToken; +import org.apache.james.jmap.model.mailbox.MailboxNamespace; import org.apache.james.mailbox.model.MailboxACL.Rfc4314Rights; import org.apache.james.mailbox.model.MailboxACL.Right; import org.apache.james.mailbox.model.MailboxConstants; @@ -656,4 +657,42 @@ public abstract class GetMailboxesMethodTest { .body(ARGUMENTS + ".list", hasSize(1)) .body(ARGUMENTS + ".list.id", hasItems(mailboxId.serialize())); } + + @Test + public void getMailboxesShouldReturnDelegatedNamespaceWhenSharedMailbox() throws Exception { + String sharedMailboxName = "BobShared"; + MailboxId mailboxId = mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, bob, sharedMailboxName); + + MailboxPath bobMailboxPath = MailboxPath.forUser(bob, sharedMailboxName); + aclProbe.replaceRights(bobMailboxPath, alice, new Rfc4314Rights(Right.Read)); + + given() + .header("Authorization", accessToken.serialize()) + .body("[[\"getMailboxes\", {\"ids\": [\"" + mailboxId.serialize() + "\"]}, \"#0\"]]") + .when() + .post("/jmap") + .then() + .statusCode(200) + .body(NAME, equalTo("mailboxes")) + .body(ARGUMENTS + ".list", hasSize(1)) + .body(FIRST_MAILBOX + ".namespace.type", equalTo(MailboxNamespace.Type.Delegated.toString())) + .body(FIRST_MAILBOX + ".namespace.owner", equalTo(bob)); + } + + @Test + public void getMailboxesShouldReturnPersonalNamespaceWhenOwnerMailbox() throws Exception { + MailboxId mailboxId = mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, alice, DefaultMailboxes.INBOX); + + given() + .header("Authorization", accessToken.serialize()) + .body("[[\"getMailboxes\", {\"ids\": [\"" + mailboxId.serialize() + "\"]}, \"#0\"]]") + .when() + .post("/jmap") + .then() + .statusCode(200) + .body(NAME, equalTo("mailboxes")) + .body(ARGUMENTS + ".list", hasSize(1)) + .body(FIRST_MAILBOX + ".namespace.type", equalTo(MailboxNamespace.Type.Personal.toString())) + .body(FIRST_MAILBOX + ".namespace.owner", isEmptyOrNullString()); + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/59d8a6bb/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java index 9890c85..d6fe155 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java @@ -24,6 +24,7 @@ import java.util.Optional; import javax.inject.Inject; import org.apache.james.jmap.model.mailbox.Mailbox; +import org.apache.james.jmap.model.mailbox.MailboxNamespace; import org.apache.james.jmap.model.mailbox.Rights; import org.apache.james.jmap.model.mailbox.Role; import org.apache.james.jmap.model.mailbox.SortOrder; @@ -111,9 +112,18 @@ public class MailboxFactory { .totalMessages(mailboxCounters.getCount()) .sortOrder(SortOrder.getSortOrder(role)) .sharedWith(Rights.fromACL(metaData.getACL())) + .namespace(getNamespace(mailboxPath, mailboxSession)) .build(); } + @VisibleForTesting MailboxNamespace getNamespace(MailboxPath mailboxPath, MailboxSession mailboxSession) { + String mailboxPathUser = mailboxPath.getUser(); + if (mailboxSession.getUser().isSameUser(mailboxPathUser)) { + return MailboxNamespace.personal(); + } + return MailboxNamespace.delegated(mailboxPathUser); + } + @VisibleForTesting String getName(MailboxPath mailboxPath, MailboxSession mailboxSession) { String name = mailboxPath.getName(); if (name.contains(String.valueOf(mailboxSession.getPathDelimiter()))) { http://git-wip-us.apache.org/repos/asf/james-project/blob/59d8a6bb/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Mailbox.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Mailbox.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Mailbox.java index d0b8144..f8031f7 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Mailbox.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Mailbox.java @@ -61,10 +61,12 @@ public class Mailbox { private long totalThreads; private long unreadThreads; private Optional<Rights> sharedWith; + private Optional<MailboxNamespace> namespace; private Builder() { parentId = Optional.empty(); sharedWith = Optional.empty(); + namespace = Optional.empty(); } public Builder id(MailboxId id) { @@ -154,12 +156,17 @@ public class Mailbox { return this; } + public Builder namespace(MailboxNamespace namespace) { + this.namespace = Optional.of(namespace); + return this; + } + public Mailbox build() { Preconditions.checkState(!Strings.isNullOrEmpty(name), "'name' is mandatory"); Preconditions.checkState(id != null, "'id' is mandatory"); return new Mailbox(id, name, parentId, role, sortOrder, mustBeOnlyMailbox, mayReadItems, mayAddItems, mayRemoveItems, mayCreateChild, mayRename, mayDelete, - totalMessages, unreadMessages, totalThreads, unreadThreads, sharedWith.orElse(Rights.EMPTY)); + totalMessages, unreadMessages, totalThreads, unreadThreads, sharedWith.orElse(Rights.EMPTY), namespace.orElse(MailboxNamespace.personal())); } } @@ -180,10 +187,11 @@ public class Mailbox { private final long totalThreads; private final long unreadThreads; private final Rights sharedWith; + private final MailboxNamespace namespace; @VisibleForTesting Mailbox(MailboxId id, String name, Optional<MailboxId> parentId, Optional<Role> role, SortOrder sortOrder, boolean mustBeOnlyMailbox, boolean mayReadItems, boolean mayAddItems, boolean mayRemoveItems, boolean mayCreateChild, boolean mayRename, boolean mayDelete, - long totalMessages, long unreadMessages, long totalThreads, long unreadThreads, Rights sharedWith) { + long totalMessages, long unreadMessages, long totalThreads, long unreadThreads, Rights sharedWith, MailboxNamespace namespace) { this.id = id; this.name = name; @@ -202,6 +210,7 @@ public class Mailbox { this.totalThreads = totalThreads; this.unreadThreads = unreadThreads; this.sharedWith = sharedWith; + this.namespace = namespace; } public MailboxId getId() { @@ -272,6 +281,10 @@ public class Mailbox { return sharedWith; } + public MailboxNamespace getNamespace() { + return namespace; + } + @Override public final boolean equals(Object obj) { if (obj instanceof Mailbox) { @@ -292,7 +305,8 @@ public class Mailbox { && Objects.equals(this.unreadMessages, other.unreadMessages) && Objects.equals(this.totalThreads, other.totalThreads) && Objects.equals(this.unreadThreads, other.unreadThreads) - && Objects.equals(this.sharedWith, other.sharedWith); + && Objects.equals(this.sharedWith, other.sharedWith) + && Objects.equals(this.namespace, other.namespace); } return false; } @@ -301,7 +315,7 @@ public class Mailbox { public final int hashCode() { return Objects.hash(id, name, parentId, role, sortOrder, mustBeOnlyMailbox, mayReadItems, mayAddItems, mayRemoveItems, mayCreateChild, mayRename, mayDelete, totalMessages, unreadMessages, totalThreads, - unreadThreads, sharedWith); + unreadThreads, sharedWith, namespace); } @Override http://git-wip-us.apache.org/repos/asf/james-project/blob/59d8a6bb/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java index ba53de7..60f953c 100644 --- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java +++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java @@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.Optional; import org.apache.james.jmap.model.mailbox.Mailbox; +import org.apache.james.jmap.model.mailbox.MailboxNamespace; import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.inmemory.InMemoryId; @@ -159,4 +160,20 @@ public class MailboxFactoryTest { assertThat(id).contains(parentId); } + @Test + public void getNamespaceShouldReturnPersonalNamespaceWhenUserMailboxPathAndUserMailboxSessionAreTheSame() throws Exception { + MailboxPath mailboxPath = MailboxPath.forUser(user, "mailboxName"); + + assertThat(sut.getNamespace(mailboxPath, mailboxSession)) + .isEqualTo(MailboxNamespace.personal()); + } + + @Test + public void getNamespaceShouldReturnDelegatedNamespaceWhenUserMailboxPathAndUserMailboxSessionAreNotTheSame() throws Exception { + String mailboxPathUser = "ot...@domain.org"; + MailboxPath mailboxPath = MailboxPath.forUser(mailboxPathUser, "mailboxName"); + + assertThat(sut.getNamespace(mailboxPath, mailboxSession)) + .isEqualTo(MailboxNamespace.delegated(mailboxPathUser)); + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/59d8a6bb/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/mailbox/MailboxTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/mailbox/MailboxTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/mailbox/MailboxTest.java index 91275df..330c2cc 100644 --- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/mailbox/MailboxTest.java +++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/mailbox/MailboxTest.java @@ -63,7 +63,7 @@ public class MailboxTest { @Test public void buildShouldWork() { Mailbox expectedMailbox = new Mailbox(InMemoryId.of(1), "name", Optional.of(InMemoryId.of(0)), Optional.of(Role.DRAFTS), SortOrder.of(123), - true, true, true, true, true, true, true, 456, 789, 741, 852, Rights.EMPTY); + true, true, true, true, true, true, true, 456, 789, 741, 852, Rights.EMPTY, MailboxNamespace.personal()); Mailbox mailbox = Mailbox.builder() .id(InMemoryId.of(1)) --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org