This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit d2a68638e1c699d146ab6ad7f6aa9a1a94e349b9
Author: Jan-Eric Hellenberg <janeric.hellenb...@gmail.com>
AuthorDate: Fri Jan 3 11:40:17 2025 +0100

    James-4099 Introduce common superclass for mailbox path delimiter aware 
tests
---
 .../model/MailboxFolderDelimiterAwareTest.java     | 71 ++++++++++++++++
 .../james/imap/main/DefaultPathConverterTest.java  |  4 +-
 .../imap/main/PathConverterBasicContract.java      | 98 ++++++++--------------
 3 files changed, 109 insertions(+), 64 deletions(-)

diff --git 
a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxFolderDelimiterAwareTest.java
 
b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxFolderDelimiterAwareTest.java
new file mode 100644
index 0000000000..858c515de9
--- /dev/null
+++ 
b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxFolderDelimiterAwareTest.java
@@ -0,0 +1,71 @@
+/****************************************************************
+ * 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.mailbox.model;
+
+import org.apache.james.core.Username;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+/**
+ * A base class for all tests that have to deal with the mailbox path 
delimiter.
+ * It will make sure to install the delimiter specified by the subclass during 
the test lifecycle and provides
+ * some utility methods for writing tests using the active delimiter.
+ * <p>
+ * NOTE: If you add a new folder delimiter, make sure to add tests for it in 
all classes extending this one!
+ */
+public abstract class MailboxFolderDelimiterAwareTest {
+    public abstract char folderDelimiter();
+
+    static char initialFolderDelimiter;
+
+    @BeforeEach
+    public void setUp() {
+        initialFolderDelimiter = MailboxConstants.FOLDER_DELIMITER;
+        MailboxConstants.FOLDER_DELIMITER = folderDelimiter();
+    }
+
+    @AfterEach
+    public void tearDown() {
+        MailboxConstants.FOLDER_DELIMITER = initialFolderDelimiter;
+    }
+
+    /**
+     * Adjust the given string assumed to contain path delimiter dots ('.') to 
an equivalent version for a different
+     * delimiter.
+     * For example, a string "folder.subfolder.subsubfolder" would be 
converted into "folder/subfolder/subsubfolder" when
+     * the active FOLDER_DELIMITER is '/'.
+     * This is used to test that all delimiters are handled correctly in a lot 
of different scenarios
+     * without having to manually assemble strings with the active path 
delimiter
+     * (like "folder" + MailboxConstants.FOLDER_DELIMITER + "subfolder" + 
MailboxConstants.FOLDER_DELIMITER + "subsubfolder")
+     * everywhere, which quickly becomes tedious.
+     */
+    public static String adjustToActiveFolderDelimiter(String valueWithDots) {
+        // Because the test setup will configure the desired delimiter to be 
used,
+        // we do not need to pass it in manually here.
+        return valueWithDots.replace('.', MailboxConstants.FOLDER_DELIMITER);
+    }
+
+    /**
+     * See {@link #adjustToActiveFolderDelimiter(String)}.
+     */
+    public static Username adjustToActiveFolderDelimiter(Username username) {
+        return Username.of(adjustToActiveFolderDelimiter(username.asString()));
+    }
+}
diff --git 
a/protocols/imap/src/test/java/org/apache/james/imap/main/DefaultPathConverterTest.java
 
b/protocols/imap/src/test/java/org/apache/james/imap/main/DefaultPathConverterTest.java
index 95172d8928..476d1c670e 100644
--- 
a/protocols/imap/src/test/java/org/apache/james/imap/main/DefaultPathConverterTest.java
+++ 
b/protocols/imap/src/test/java/org/apache/james/imap/main/DefaultPathConverterTest.java
@@ -25,7 +25,7 @@ public class DefaultPathConverterTest {
     @Nested
     public class DotDelimiter extends TestBase {
         @Override
-        public char pathDelimiter() {
+        public char folderDelimiter() {
             return '.';
         }
     }
@@ -33,7 +33,7 @@ public class DefaultPathConverterTest {
     @Nested
     public class SlashDelimiter extends TestBase {
         @Override
-        public char pathDelimiter() {
+        public char folderDelimiter() {
             return '/';
         }
     }
diff --git 
a/protocols/imap/src/test/java/org/apache/james/imap/main/PathConverterBasicContract.java
 
b/protocols/imap/src/test/java/org/apache/james/imap/main/PathConverterBasicContract.java
index a627462750..d2d89d9648 100644
--- 
a/protocols/imap/src/test/java/org/apache/james/imap/main/PathConverterBasicContract.java
+++ 
b/protocols/imap/src/test/java/org/apache/james/imap/main/PathConverterBasicContract.java
@@ -26,13 +26,12 @@ import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.model.MailboxConstants;
+import org.apache.james.mailbox.model.MailboxFolderDelimiterAwareTest;
 import org.apache.james.mailbox.model.MailboxPath;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 
-public abstract class PathConverterBasicContract {
+public abstract class PathConverterBasicContract extends 
MailboxFolderDelimiterAwareTest {
     public static final Username USERNAME = Username.of("username");
     public static final Username USERNAME_WITH_DELIMITER = 
Username.of("username.with.delimiter");
     public static final Username USERNAME_WITH_UNDERSCORE = 
Username.of("username_with_underscore");
@@ -42,35 +41,10 @@ public abstract class PathConverterBasicContract {
     public static final Username USERNAME2_WITH_MAIL = 
Username.of("userna...@apache.org");
     public static final boolean RELATIVE = true;
 
-    public final MailboxSession mailboxSession = 
MailboxSessionUtil.create(USERNAME, pathDelimiter());
+    public final MailboxSession mailboxSession = 
MailboxSessionUtil.create(USERNAME, folderDelimiter());
 
     abstract PathConverter pathConverter();
 
-    abstract char pathDelimiter();
-
-    static char initialPathDelimiter;
-
-    @BeforeEach
-    public void setUp() {
-        initialPathDelimiter = MailboxConstants.FOLDER_DELIMITER;
-        MailboxConstants.FOLDER_DELIMITER = pathDelimiter();
-    }
-
-    @AfterEach
-    public void tearDown() {
-        MailboxConstants.FOLDER_DELIMITER = initialPathDelimiter;
-    }
-
-    static String adjustToTestDelimiter(String valueWithDots) {
-        // Because the test setup will configure the desired delimiter to be 
used,
-        // we do not need to pass it in manually here.
-        return valueWithDots.replace('.', MailboxConstants.FOLDER_DELIMITER);
-    }
-
-    static Username adjustToTestDelimiter(Username username) {
-        return Username.of(adjustToTestDelimiter(username.asString()));
-    }
-
     @Test
     public void buildFullPathShouldAcceptNull() {
         assertThat(pathConverter().buildFullPath(null))
@@ -98,53 +72,53 @@ public abstract class PathConverterBasicContract {
 
     @Test
     public void buildFullPathShouldAcceptUserNamespaceAndDelimiter() {
-        
assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + 
pathDelimiter()))
+        
assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + 
folderDelimiter()))
             .isEqualTo(MailboxPath.forUser(USERNAME, ""));
     }
 
     @Test
     public void buildFullPathShouldAcceptFullAbsoluteUserPath() {
         String mailboxName = "mailboxName";
-        
assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + 
pathDelimiter() + mailboxName))
+        
assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + 
folderDelimiter() + mailboxName))
                 .isEqualTo(MailboxPath.forUser(USERNAME, mailboxName));
     }
 
     @Test
     public void buildFullPathShouldAcceptRelativePathWithSubFolder() {
-        String mailboxName = adjustToTestDelimiter("mailboxName.subFolder");
+        String mailboxName = 
adjustToActiveFolderDelimiter("mailboxName.subFolder");
         assertThat(pathConverter().buildFullPath(mailboxName))
                 .isEqualTo(MailboxPath.forUser(USERNAME, mailboxName));
     }
 
     @Test
     public void buildFullPathShouldAcceptAbsoluteUserPathWithSubFolder() {
-        String mailboxName = adjustToTestDelimiter("mailboxName.subFolder");
-        
assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + 
pathDelimiter() + mailboxName))
+        String mailboxName = 
adjustToActiveFolderDelimiter("mailboxName.subFolder");
+        
assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + 
folderDelimiter() + mailboxName))
                 .isEqualTo(MailboxPath.forUser(USERNAME, mailboxName));
     }
 
     @Test
     public void buildFullPathShouldAcceptAbsoluteOtherUserPath() {
-        
assertThat(pathConverter().buildFullPath(adjustToTestDelimiter("#user.username2.abc")))
+        
assertThat(pathConverter().buildFullPath(adjustToActiveFolderDelimiter("#user.username2.abc")))
             .isEqualTo(MailboxPath.forUser(USERNAME2, "abc"));
     }
 
     @Test
     public void buildFullPathShouldAcceptAbsoluteOtherUserPathWithDelimiter() {
-        
assertThat(pathConverter().buildFullPath(adjustToTestDelimiter("#user.username__with__delimiter.abc")))
-            
.isEqualTo(MailboxPath.forUser(adjustToTestDelimiter(USERNAME_WITH_DELIMITER), 
"abc"));
+        
assertThat(pathConverter().buildFullPath(adjustToActiveFolderDelimiter("#user.username__with__delimiter.abc")))
+            
.isEqualTo(MailboxPath.forUser(adjustToActiveFolderDelimiter(USERNAME_WITH_DELIMITER),
 "abc"));
     }
 
     @Test
     public void buildFullPathShouldAcceptAbsoluteOtherUserPathWithUnderscore() 
{
-        
assertThat(pathConverter().buildFullPath(adjustToTestDelimiter("#user.username_-with_-underscore.abc")))
+        
assertThat(pathConverter().buildFullPath(adjustToActiveFolderDelimiter("#user.username_-with_-underscore.abc")))
             .isEqualTo(MailboxPath.forUser(USERNAME_WITH_UNDERSCORE, "abc"));
     }
 
     @Test
     public void buildFullPathShouldAcceptAbsoluteOtherUserPathWithSubfolder() {
-        
assertThat(pathConverter().buildFullPath(adjustToTestDelimiter("#user.username2.abc.def")))
-            .isEqualTo(MailboxPath.forUser(USERNAME2, 
adjustToTestDelimiter("abc.def")));
+        
assertThat(pathConverter().buildFullPath(adjustToActiveFolderDelimiter("#user.username2.abc.def")))
+            .isEqualTo(MailboxPath.forUser(USERNAME2, 
adjustToActiveFolderDelimiter("abc.def")));
     }
 
     @Test
@@ -162,30 +136,30 @@ public abstract class PathConverterBasicContract {
     @Test
     public void mailboxNameShouldReturnFQDNWhenRelativeAndOtherUserMailbox() {
         assertThat(pathConverter().mailboxName(RELATIVE, 
MailboxPath.forUser(USERNAME2, "abc"), mailboxSession))
-            .contains(adjustToTestDelimiter("#user.username2.abc"));
+            .contains(adjustToActiveFolderDelimiter("#user.username2.abc"));
     }
 
     @Test
     public void mailboxNameShouldEscapeDelimiterInUsername() {
-        assertThat(pathConverter().mailboxName(RELATIVE, 
MailboxPath.forUser(adjustToTestDelimiter(USERNAME_WITH_DELIMITER), "abc"), 
mailboxSession))
-            
.contains(adjustToTestDelimiter("#user.username__with__delimiter.abc"));
+        assertThat(pathConverter().mailboxName(RELATIVE, 
MailboxPath.forUser(adjustToActiveFolderDelimiter(USERNAME_WITH_DELIMITER), 
"abc"), mailboxSession))
+            
.contains(adjustToActiveFolderDelimiter("#user.username__with__delimiter.abc"));
     }
 
     @Test
     public void mailboxNameShouldEscapeUnderscoreInUsername() {
         assertThat(pathConverter().mailboxName(RELATIVE, 
MailboxPath.forUser(USERNAME_WITH_UNDERSCORE, "abc"), mailboxSession))
-            
.contains(adjustToTestDelimiter("#user.username_-with_-underscore.abc"));
+            
.contains(adjustToActiveFolderDelimiter("#user.username_-with_-underscore.abc"));
     }
 
     @Test
     public void mailboxNameShouldReturnFQDNWhenRelativeAndSharedMailbox() {
         assertThat(pathConverter().mailboxName(RELATIVE, new 
MailboxPath("#Shared", Username.of("marketing"), "abc"), mailboxSession))
-            .contains(adjustToTestDelimiter("#Shared.marketing.abc"));
+            .contains(adjustToActiveFolderDelimiter("#Shared.marketing.abc"));
     }
 
     @Test
     public void mailboxNameShouldReturnFQDNWhenNotRelativeAndUserMailbox() {
-        String mailboxName = adjustToTestDelimiter("#private.abc");
+        String mailboxName = adjustToActiveFolderDelimiter("#private.abc");
         assertThat(pathConverter().mailboxName(!RELATIVE, 
MailboxPath.forUser(USERNAME, "abc"), mailboxSession))
             .contains(mailboxName);
     }
@@ -193,18 +167,18 @@ public abstract class PathConverterBasicContract {
     @Test
     public void 
mailboxNameShouldReturnFQDNWhenNotRelativeAndOtherUserMailbox() {
         assertThat(pathConverter().mailboxName(!RELATIVE, 
MailboxPath.forUser(USERNAME2, "abc"), mailboxSession))
-            .contains(adjustToTestDelimiter("#user.username2.abc"));
+            .contains(adjustToActiveFolderDelimiter("#user.username2.abc"));
     }
 
     @Test
     public void mailboxNameShouldReturnFQDNWhenNotRelativeAndSharedMailbox() {
         assertThat(pathConverter().mailboxName(!RELATIVE, new 
MailboxPath("#Shared", Username.of("marketing"), "abc"), mailboxSession))
-            .contains(adjustToTestDelimiter("#Shared.marketing.abc"));
+            .contains(adjustToActiveFolderDelimiter("#Shared.marketing.abc"));
     }
     
     @Nested
     public abstract class WithEmail {
-        public final MailboxSession mailboxWithEmailSession = 
MailboxSessionUtil.create(USERNAME_WITH_MAIL, pathDelimiter());
+        public final MailboxSession mailboxWithEmailSession = 
MailboxSessionUtil.create(USERNAME_WITH_MAIL, folderDelimiter());
 
         public abstract PathConverter pathConverter();
 
@@ -235,41 +209,41 @@ public abstract class PathConverterBasicContract {
 
         @Test
         public void buildFullPathShouldAcceptUserNamespaceAndDelimiter() {
-            
assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + 
pathDelimiter()))
+            
assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + 
folderDelimiter()))
                 .isEqualTo(MailboxPath.forUser(USERNAME_WITH_MAIL, ""));
         }
 
         @Test
         public void buildFullPathShouldAcceptFullAbsoluteUserPath() {
             String mailboxName = "mailboxName";
-            
assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + 
pathDelimiter() + mailboxName))
+            
assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + 
folderDelimiter() + mailboxName))
                 .isEqualTo(MailboxPath.forUser(USERNAME_WITH_MAIL, 
mailboxName));
         }
 
         @Test
         public void buildFullPathShouldAcceptRelativePathWithSubFolder() {
-            String mailboxName = "mailboxName" + pathDelimiter() + "subFolder";
+            String mailboxName = "mailboxName" + folderDelimiter() + 
"subFolder";
             assertThat(pathConverter().buildFullPath(mailboxName))
                 .isEqualTo(MailboxPath.forUser(USERNAME_WITH_MAIL, 
mailboxName));
         }
 
         @Test
         public void buildFullPathShouldAcceptAbsoluteUserPathWithSubFolder() {
-            String mailboxName = 
adjustToTestDelimiter("mailboxName.subFolder");
-            
assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + 
pathDelimiter() + mailboxName))
+            String mailboxName = 
adjustToActiveFolderDelimiter("mailboxName.subFolder");
+            
assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + 
folderDelimiter() + mailboxName))
                 .isEqualTo(MailboxPath.forUser(USERNAME_WITH_MAIL, 
mailboxName));
         }
 
         @Test
         public void buildFullPathShouldAcceptAbsoluteOtherUserPath() {
-            
assertThat(pathConverter().buildFullPath(adjustToTestDelimiter("#user.username2.abc")))
+            
assertThat(pathConverter().buildFullPath(adjustToActiveFolderDelimiter("#user.username2.abc")))
                 .isEqualTo(MailboxPath.forUser(USERNAME2_WITH_MAIL, "abc"));
         }
 
         @Test
         public void 
buildFullPathShouldAcceptAbsoluteOtherUserPathWithSubfolder() {
-            
assertThat(pathConverter().buildFullPath(adjustToTestDelimiter("#user.username2.abc.def")))
-                .isEqualTo(MailboxPath.forUser(USERNAME2_WITH_MAIL, 
adjustToTestDelimiter("abc.def")));
+            
assertThat(pathConverter().buildFullPath(adjustToActiveFolderDelimiter("#user.username2.abc.def")))
+                .isEqualTo(MailboxPath.forUser(USERNAME2_WITH_MAIL, 
adjustToActiveFolderDelimiter("abc.def")));
         }
 
         @Test
@@ -281,31 +255,31 @@ public abstract class PathConverterBasicContract {
         @Test
         public void 
mailboxNameShouldReturnFQDNWhenRelativeAndOtherUserMailbox() {
             assertThat(pathConverter().mailboxName(RELATIVE, 
MailboxPath.forUser(USERNAME2_WITH_MAIL, "abc"), mailboxWithEmailSession))
-                .contains(adjustToTestDelimiter("#user.username2.abc"));
+                
.contains(adjustToActiveFolderDelimiter("#user.username2.abc"));
         }
 
         @Test
         public void mailboxNameShouldReturnFQDNWhenRelativeAndSharedMailbox() {
             assertThat(pathConverter().mailboxName(RELATIVE, new 
MailboxPath("#Shared", Username.of("market...@apache.org"), "abc"), 
mailboxWithEmailSession))
-                .contains(adjustToTestDelimiter("#Shared.marketing.abc"));
+                
.contains(adjustToActiveFolderDelimiter("#Shared.marketing.abc"));
         }
 
         @Test
         public void mailboxNameShouldReturnFQDNWhenNotRelativeAndUserMailbox() 
{
             assertThat(pathConverter().mailboxName(!RELATIVE, 
MailboxPath.forUser(USERNAME_WITH_MAIL, "abc"), mailboxWithEmailSession))
-                .contains(adjustToTestDelimiter("#private.abc"));
+                .contains(adjustToActiveFolderDelimiter("#private.abc"));
         }
 
         @Test
         public void 
mailboxNameShouldReturnFQDNWhenNotRelativeAndOtherUserMailbox() {
             assertThat(pathConverter().mailboxName(!RELATIVE, 
MailboxPath.forUser(USERNAME2_WITH_MAIL, "abc"), mailboxWithEmailSession))
-                .contains(adjustToTestDelimiter("#user.username2.abc"));
+                
.contains(adjustToActiveFolderDelimiter("#user.username2.abc"));
         }
 
         @Test
         public void 
mailboxNameShouldReturnFQDNWhenNotRelativeAndSharedMailbox() {
             assertThat(pathConverter().mailboxName(!RELATIVE, new 
MailboxPath("#Shared", Username.of("market...@apache.org"), "abc"), 
mailboxWithEmailSession))
-                .contains(adjustToTestDelimiter("#Shared.marketing.abc"));
+                
.contains(adjustToActiveFolderDelimiter("#Shared.marketing.abc"));
         }
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org
For additional commands, e-mail: notifications-h...@james.apache.org

Reply via email to