# Buggy code
async def resolve_room_id(self, room_identifier: str) -> str:
    """Resolve to a room ID, if necessary."""
    if RoomID.is_valid(room_identifier):
        resolved_room_id = room_identifier
    elif RoomAlias.is_valid(room_identifier):
        room_alias = RoomAlias.from_string(room_identifier)
        room_id, _ = await self.room_member_handler.lookup_room_alias(room_alias)
        resolved_room_id = room_id.to_string()
    else:
        raise SynapseError(
            400, "%s was not legal room ID or room alias" % (room_identifier,)
        )
    if not resolved_room_id:
        raise SynapseError(400, "Unknown room ID or room alias %s" % room_identifier)
    return resolved_room_id


# Traceback (ValueError)
2021-02-26 14:01:23,554 - synapse.http.server - 94 - ERROR - POST-320 - Failed handle request via 'JoinRoomAliasServlet': <XForwardedForRequest at 0x7feef12ec358 method='POST' uri='/_synapse/admin/v1/join/%23test%3Aexemple.test.com' clientproto='HTTP/1.1' site='8008'>
Traceback (most recent call last):
File "/opt/synapse2/env/lib/python3.6/site-packages/twisted/internet/defer.py", line 1416, in _inlineCallbacks
result = result.throwExceptionIntoGenerator(g)
File "/opt/synapse2/env/lib/python3.6/site-packages/twisted/python/failure.py", line 512, in throwExceptionIntoGenerator
return g.throw(self.type, self.value, self.tb)
File "/opt/synapse2/env/lib/python3.6/site-packages/synapse/storage/databases/main/event_federation.py", line 634, in get_latest_event_ids_in_room
desc="get_latest_event_ids_in_room",
File "/opt/synapse2/env/lib/python3.6/site-packages/synapse/storage/database.py", line 1453, in simple_select_onecol
db_autocommit=True,
File "/opt/synapse2/env/lib/python3.6/site-packages/synapse/storage/database.py", line 676, in runInteraction
**kwargs,
File "/opt/synapse2/env/lib/python3.6/site-packages/synapse/storage/database.py", line 752, in runWithConnection
self._db_pool.runWithConnection(inner_func, *args, **kwargs)
File "/opt/synapse2/env/lib/python3.6/site-packages/twisted/python/threadpool.py", line 250, in inContext
result = inContext.theWork()
File "/opt/synapse2/env/lib/python3.6/site-packages/twisted/python/threadpool.py", line 266, in <lambda>
inContext.theWork = lambda: context.call(ctx, func, *args, **kw)
File "/opt/synapse2/env/lib/python3.6/site-packages/twisted/python/context.py", line 122, in callWithContext
return self.currentContext().callWithContext(ctx, func, *args, **kw)
File "/opt/synapse2/env/lib/python3.6/site-packages/twisted/python/context.py", line 85, in callWithContext
return func(*args,**kw)
File "/opt/synapse2/env/lib/python3.6/site-packages/twisted/enterprise/adbapi.py", line 306, in _runWithConnection
compat.reraise(excValue, excTraceback)
File "/opt/synapse2/env/lib/python3.6/site-packages/twisted/python/compat.py", line 464, in reraise
raise exception.with_traceback(traceback)
File "/opt/synapse2/env/lib/python3.6/site-packages/twisted/enterprise/adbapi.py", line 297, in _runWithConnection
result = func(conn, *args, **kw)
File "/opt/synapse2/env/lib/python3.6/site-packages/synapse/storage/database.py", line 746, in inner_func
return func(db_conn, *args, **kwargs)
File "/opt/synapse2/env/lib/python3.6/site-packages/synapse/storage/database.py", line 540, in new_transaction
r = func(cursor, *args, **kwargs)
File "/opt/synapse2/env/lib/python3.6/site-packages/synapse/storage/database.py", line 1422, in simple_select_onecol_txn
txn.execute(sql, list(keyvalues.values()))
File "/opt/synapse2/env/lib/python3.6/site-packages/synapse/storage/database.py", line 295, in execute
self._do_execute(self.txn.execute, sql, *args)
File "/opt/synapse2/env/lib/python3.6/site-packages/synapse/storage/database.py", line 321, in _do_execute
return func(sql, *args)
File "/opt/synapse2/env/lib/python3.6/site-packages/psycopg2/extensions.py", line 121, in getquoted
pobjs = [adapt(o) for o in self._seq]
File "/opt/synapse2/env/lib/python3.6/site-packages/synapse/types.py", line 220, in __iter__
raise ValueError("Attempted to iterate a %s" % (type(self).__name__,))
ValueError: Attempted to iterate a RoomID

# Fixed code
async def resolve_room_id(
    self, room_identifier: str, remote_room_hosts: Optional[List[str]] = None
) -> Tuple[str, Optional[List[str]]]:
    """
    Resolve a room identifier to a room ID, if necessary.

    This also performanes checks to ensure the room ID is of the proper form.

    Args:
        room_identifier: The room ID or alias.
        remote_room_hosts: The potential remote room hosts to use.

    Returns:
        The resolved room ID.

    Raises:
        SynapseError if the room ID is of the wrong form.
    """
    if RoomID.is_valid(room_identifier):
        resolved_room_id = room_identifier
    elif RoomAlias.is_valid(room_identifier):
        room_alias = RoomAlias.from_string(room_identifier)
        (
            room_id,
            remote_room_hosts,
        ) = await self.room_member_handler.lookup_room_alias(room_alias)
        resolved_room_id = room_id.to_string()
    else:
        raise SynapseError(
            400, "%s was not legal room ID or room alias" % (room_identifier,)
        )
    if not resolved_room_id:
        raise SynapseError(400, "Unknown room ID or room alias %s" % room_identifier)
    return resolved_room_id, remote_room_hosts