Fix resolving Matrix room aliases (#101928)

This commit is contained in:
Paarth Shah
2023-10-23 01:35:41 -07:00
committed by GitHub
parent 1176003b51
commit 30ba78cf82
5 changed files with 125 additions and 49 deletions
+31 -14
View File
@@ -14,6 +14,8 @@ from nio import (
LoginError,
LoginResponse,
Response,
RoomResolveAliasError,
RoomResolveAliasResponse,
UploadResponse,
WhoamiError,
WhoamiResponse,
@@ -48,8 +50,15 @@ from tests.common import async_capture_events
TEST_NOTIFIER_NAME = "matrix_notify"
TEST_HOMESERVER = "example.com"
TEST_DEFAULT_ROOM = "!DefaultNotificationRoom:example.com"
TEST_JOINABLE_ROOMS = ["!RoomIdString:example.com", "#RoomAliasString:example.com"]
TEST_ROOM_A_ID = "!RoomA-ID:example.com"
TEST_ROOM_B_ID = "!RoomB-ID:example.com"
TEST_ROOM_B_ALIAS = "#RoomB-Alias:example.com"
TEST_JOINABLE_ROOMS = {
TEST_ROOM_A_ID: TEST_ROOM_A_ID,
TEST_ROOM_B_ALIAS: TEST_ROOM_B_ID,
}
TEST_BAD_ROOM = "!UninvitedRoom:example.com"
TEST_MXID = "@user:example.com"
TEST_DEVICE_ID = "FAKEID"
@@ -65,8 +74,16 @@ class _MockAsyncClient(AsyncClient):
async def close(self):
return None
async def room_resolve_alias(self, room_alias: str):
if room_id := TEST_JOINABLE_ROOMS.get(room_alias):
return RoomResolveAliasResponse(
room_alias=room_alias, room_id=room_id, servers=[TEST_HOMESERVER]
)
else:
return RoomResolveAliasError(message=f"Could not resolve {room_alias}")
async def join(self, room_id: RoomID):
if room_id in TEST_JOINABLE_ROOMS:
if room_id in TEST_JOINABLE_ROOMS.values():
return JoinResponse(room_id=room_id)
else:
return JoinError(message="Not allowed to join this room.")
@@ -102,10 +119,10 @@ class _MockAsyncClient(AsyncClient):
async def room_send(self, *args, **kwargs):
if not self.logged_in:
raise LocalProtocolError
if kwargs["room_id"] in TEST_JOINABLE_ROOMS:
return Response()
else:
if kwargs["room_id"] not in TEST_JOINABLE_ROOMS.values():
return ErrorResponse(message="Cannot send a message in this room.")
else:
return Response()
async def sync(self, *args, **kwargs):
return None
@@ -123,7 +140,7 @@ MOCK_CONFIG_DATA = {
CONF_USERNAME: TEST_MXID,
CONF_PASSWORD: TEST_PASSWORD,
CONF_VERIFY_SSL: True,
CONF_ROOMS: TEST_JOINABLE_ROOMS,
CONF_ROOMS: list(TEST_JOINABLE_ROOMS),
CONF_COMMANDS: [
{
CONF_WORD: "WordTrigger",
@@ -143,35 +160,35 @@ MOCK_CONFIG_DATA = {
}
MOCK_WORD_COMMANDS = {
"!RoomIdString:example.com": {
TEST_ROOM_A_ID: {
"WordTrigger": {
"word": "WordTrigger",
"name": "WordTriggerEventName",
"rooms": ["!RoomIdString:example.com", "#RoomAliasString:example.com"],
"rooms": [TEST_ROOM_A_ID, TEST_ROOM_B_ID],
}
},
"#RoomAliasString:example.com": {
TEST_ROOM_B_ID: {
"WordTrigger": {
"word": "WordTrigger",
"name": "WordTriggerEventName",
"rooms": ["!RoomIdString:example.com", "#RoomAliasString:example.com"],
"rooms": [TEST_ROOM_A_ID, TEST_ROOM_B_ID],
}
},
}
MOCK_EXPRESSION_COMMANDS = {
"!RoomIdString:example.com": [
TEST_ROOM_A_ID: [
{
"expression": re.compile("My name is (?P<name>.*)"),
"name": "ExpressionTriggerEventName",
"rooms": ["!RoomIdString:example.com", "#RoomAliasString:example.com"],
"rooms": [TEST_ROOM_A_ID, TEST_ROOM_B_ID],
}
],
"#RoomAliasString:example.com": [
TEST_ROOM_B_ID: [
{
"expression": re.compile("My name is (?P<name>.*)"),
"name": "ExpressionTriggerEventName",
"rooms": ["!RoomIdString:example.com", "#RoomAliasString:example.com"],
"rooms": [TEST_ROOM_A_ID, TEST_ROOM_B_ID],
}
],
}
+3 -2
View File
@@ -12,8 +12,8 @@ from homeassistant.core import HomeAssistant
from .conftest import (
MOCK_EXPRESSION_COMMANDS,
MOCK_WORD_COMMANDS,
TEST_JOINABLE_ROOMS,
TEST_NOTIFIER_NAME,
TEST_ROOM_A_ID,
)
@@ -34,12 +34,13 @@ async def test_services(hass: HomeAssistant, matrix_bot: MatrixBot):
async def test_commands(hass, matrix_bot: MatrixBot, command_events):
"""Test that the configured commands were parsed correctly."""
await hass.async_start()
assert len(command_events) == 0
assert matrix_bot._word_commands == MOCK_WORD_COMMANDS
assert matrix_bot._expression_commands == MOCK_EXPRESSION_COMMANDS
room_id = TEST_JOINABLE_ROOMS[0]
room_id = TEST_ROOM_A_ID
room = MatrixRoom(room_id=room_id, own_user_id=matrix_bot._mx_id)
# Test single-word command.
@@ -5,18 +5,24 @@ from homeassistant.components.matrix import MatrixBot
from tests.components.matrix.conftest import TEST_BAD_ROOM, TEST_JOINABLE_ROOMS
async def test_join(matrix_bot: MatrixBot, caplog):
async def test_join(hass, matrix_bot: MatrixBot, caplog):
"""Test joining configured rooms."""
# Join configured rooms.
await matrix_bot._join_rooms()
await hass.async_start()
for room_id in TEST_JOINABLE_ROOMS:
assert f"Joined or already in room '{room_id}'" in caplog.messages
# Joining a disallowed room should not raise an exception.
matrix_bot._listening_rooms = [TEST_BAD_ROOM]
matrix_bot._listening_rooms = {TEST_BAD_ROOM: TEST_BAD_ROOM}
await matrix_bot._join_rooms()
assert (
f"Could not join room '{TEST_BAD_ROOM}': JoinError: Not allowed to join this room."
in caplog.messages
)
async def test_resolve_aliases(hass, matrix_bot: MatrixBot):
"""Test resolving configured room aliases into room ids."""
await hass.async_start()
assert matrix_bot._listening_rooms == TEST_JOINABLE_ROOMS
+10 -8
View File
@@ -17,30 +17,32 @@ async def test_send_message(
hass: HomeAssistant, matrix_bot: MatrixBot, image_path, matrix_events, caplog
):
"""Test the send_message service."""
await hass.async_start()
assert len(matrix_events) == 0
await matrix_bot._login()
# Send a message without an attached image.
data = {ATTR_MESSAGE: "Test message", ATTR_TARGET: TEST_JOINABLE_ROOMS}
data = {ATTR_MESSAGE: "Test message", ATTR_TARGET: list(TEST_JOINABLE_ROOMS)}
await hass.services.async_call(
MATRIX_DOMAIN, SERVICE_SEND_MESSAGE, data, blocking=True
)
for room_id in TEST_JOINABLE_ROOMS:
assert f"Message delivered to room '{room_id}'" in caplog.messages
for room_alias_or_id in TEST_JOINABLE_ROOMS:
assert f"Message delivered to room '{room_alias_or_id}'" in caplog.messages
# Send an HTML message without an attached image.
data = {
ATTR_MESSAGE: "Test message",
ATTR_TARGET: TEST_JOINABLE_ROOMS,
ATTR_TARGET: list(TEST_JOINABLE_ROOMS),
ATTR_DATA: {ATTR_FORMAT: FORMAT_HTML},
}
await hass.services.async_call(
MATRIX_DOMAIN, SERVICE_SEND_MESSAGE, data, blocking=True
)
for room_id in TEST_JOINABLE_ROOMS:
assert f"Message delivered to room '{room_id}'" in caplog.messages
for room_alias_or_id in TEST_JOINABLE_ROOMS:
assert f"Message delivered to room '{room_alias_or_id}'" in caplog.messages
# Send a message with an attached image.
data[ATTR_DATA] = {ATTR_IMAGES: [image_path.name]}
@@ -48,8 +50,8 @@ async def test_send_message(
MATRIX_DOMAIN, SERVICE_SEND_MESSAGE, data, blocking=True
)
for room_id in TEST_JOINABLE_ROOMS:
assert f"Message delivered to room '{room_id}'" in caplog.messages
for room_alias_or_id in TEST_JOINABLE_ROOMS:
assert f"Message delivered to room '{room_alias_or_id}'" in caplog.messages
async def test_unsendable_message(