diff --git a/tests/rest/admin/test_username_available.py b/tests/rest/admin/test_username_available.py
new file mode 100644
index 0000000000..53cbc8ddab
--- /dev/null
+++ b/tests/rest/admin/test_username_available.py
@@ -0,0 +1,62 @@
+# Copyright 2021 The Matrix.org Foundation C.I.C.
+#
+# Licensed 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.
+
+import synapse.rest.admin
+from synapse.api.errors import Codes, SynapseError
+from synapse.rest.client.v1 import login
+
+from tests import unittest
+
+
+class UsernameAvailableTestCase(unittest.HomeserverTestCase):
+ servlets = [
+ synapse.rest.admin.register_servlets,
+ login.register_servlets,
+ ]
+ url = "/_synapse/admin/v1/username_available"
+
+ def prepare(self, reactor, clock, hs):
+ self.register_user("admin", "pass", admin=True)
+ self.admin_user_tok = self.login("admin", "pass")
+
+ async def check_username(username):
+ if username == "allowed":
+ return True
+ raise SynapseError(400, "User ID already taken.", errcode=Codes.USER_IN_USE)
+
+ handler = self.hs.get_registration_handler()
+ handler.check_username = check_username
+
+ def test_username_available(self):
+ """
+ The endpoint should return a 200 response if the username does not exist
+ """
+
+ url = "%s?username=%s" % (self.url, "allowed")
+ channel = self.make_request("GET", url, None, self.admin_user_tok)
+
+ self.assertEqual(200, int(channel.result["code"]), msg=channel.result["body"])
+ self.assertTrue(channel.json_body["available"])
+
+ def test_username_unavailable(self):
+ """
+ The endpoint should return a 200 response if the username does not exist
+ """
+
+ url = "%s?username=%s" % (self.url, "disallowed")
+ channel = self.make_request("GET", url, None, self.admin_user_tok)
+
+ self.assertEqual(400, int(channel.result["code"]), msg=channel.result["body"])
+ self.assertEqual(channel.json_body["errcode"], "M_USER_IN_USE")
+ self.assertEqual(channel.json_body["error"], "User ID already taken.")
|