diff --git a/tests/handlers/test_user_directory.py b/tests/handlers/test_user_directory.py
index 77c6cac449..878d9683b6 100644
--- a/tests/handlers/test_user_directory.py
+++ b/tests/handlers/test_user_directory.py
@@ -1061,6 +1061,45 @@ class UserDirectoryTestCase(unittest.HomeserverTestCase):
{alice: ProfileInfo(display_name=None, avatar_url=MXC_DUMMY)},
)
+ def test_search_punctuation(self) -> None:
+ """Test that you can search for a user that includes punctuation"""
+
+ searching_user = self.register_user("searcher", "password")
+ searching_user_tok = self.login("searcher", "password")
+
+ room_id = self.helper.create_room_as(
+ searching_user,
+ room_version=RoomVersions.V1.identifier,
+ tok=searching_user_tok,
+ )
+
+ # We want to test searching for users of the form e.g. "user-1", with
+ # various punctuation. We also test both where the prefix is numeric and
+ # alphanumeric, as e.g. postgres tokenises "user-1" as "user" and "-1".
+ i = 1
+ for char in ["-", ".", "_"]:
+ for use_numeric in [False, True]:
+ if use_numeric:
+ prefix1 = f"{i}"
+ prefix2 = f"{i+1}"
+ else:
+ prefix1 = f"a{i}"
+ prefix2 = f"a{i+1}"
+
+ local_user_1 = self.register_user(f"user{char}{prefix1}", "password")
+ local_user_2 = self.register_user(f"user{char}{prefix2}", "password")
+
+ self._add_user_to_room(room_id, RoomVersions.V1, local_user_1)
+ self._add_user_to_room(room_id, RoomVersions.V1, local_user_2)
+
+ results = self.get_success(
+ self.handler.search_users(searching_user, local_user_1, 20)
+ )["results"]
+ received_user_id_ordering = [result["user_id"] for result in results]
+ self.assertSequenceEqual(received_user_id_ordering[:1], [local_user_1])
+
+ i += 2
+
class TestUserDirSearchDisabled(unittest.HomeserverTestCase):
servlets = [
diff --git a/tests/storage/test_user_directory.py b/tests/storage/test_user_directory.py
index 156a610faa..c26932069f 100644
--- a/tests/storage/test_user_directory.py
+++ b/tests/storage/test_user_directory.py
@@ -711,6 +711,10 @@ class UserDirectoryICUTestCase(HomeserverTestCase):
),
)
+ self.assertEqual(_parse_words_with_icu("user-1"), ["user-1"])
+ self.assertEqual(_parse_words_with_icu("user-ab"), ["user-ab"])
+ self.assertEqual(_parse_words_with_icu("user.--1"), ["user", "-1"])
+
def test_regex_word_boundary_punctuation(self) -> None:
"""
Tests the behaviour of punctuation with the non-ICU tokeniser
|