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

Reply via email to