diff --git a/changelog.d/20164.misc b/changelog.d/20164.misc new file mode 100644 index 00000000000..a322e1d9d1f --- /dev/null +++ b/changelog.d/20164.misc @@ -0,0 +1 @@ +Add unit tests for `is_compliant_user_id_localpart`. Contributed by @guillemo12. diff --git a/tests/test_types.py b/tests/test_types.py index 43fd96d6f55..a19db1804b1 100644 --- a/tests/test_types.py +++ b/tests/test_types.py @@ -37,6 +37,7 @@ UserID, get_domain_from_id, get_localpart_from_id, + is_compliant_user_id_localpart, map_username_to_mxid_localpart, ) @@ -350,3 +351,27 @@ class MyModel(BaseModel): self.assertEqual(MyModel.model_validate_json('{"limit": 0}'), MyModel(limit=0)) self.assertEqual(MyModel.model_validate({"limit": 42}), MyModel(limit=42)) + + +class IsCompliantUserIdLocalpartTestCase(unittest.TestCase): + def test_empty_string(self) -> None: + self.assertFalse(is_compliant_user_id_localpart("")) + + def test_valid_characters(self) -> None: + # alphanumeric + self.assertTrue(is_compliant_user_id_localpart("alice")) + self.assertTrue(is_compliant_user_id_localpart("Alice123")) + + # symbols between 0x21 and 0x7E + self.assertTrue(is_compliant_user_id_localpart("!@#$")) + self.assertTrue(is_compliant_user_id_localpart("bob.jones")) + self.assertTrue(is_compliant_user_id_localpart("=+-[]{}")) + + def test_invalid_characters(self) -> None: + # non-ascii / outside range + self.assertFalse(is_compliant_user_id_localpart("álice")) + self.assertFalse(is_compliant_user_id_localpart("alice 123")) # space is 0x20 + self.assertFalse(is_compliant_user_id_localpart("alice\t")) + self.assertFalse(is_compliant_user_id_localpart("alice\n")) + self.assertFalse(is_compliant_user_id_localpart("alice\x1f")) # control char + self.assertFalse(is_compliant_user_id_localpart("alice\x7f")) # DEL is 0x7F