fix(send_message): deliver Matrix media via adapter
Matrix media delivery was silently dropped by send_message because Matrix wasn't wired into the native adapter-backed media path. Only Telegram, Discord, and Weixin had native media support. Adds _send_matrix_via_adapter() which creates a MatrixAdapter instance, connects, sends text + media via the adapter's native upload methods (send_document, send_image_file, send_video, send_voice), then disconnects. Also fixes a stale URL-encoding assertion in test_send_message_missing_platforms that broke after PR #10151 added quote() to room IDs. Cherry-picked from PR #10486 by helix4u.
This commit is contained in:
@@ -123,7 +123,7 @@ class TestSendMatrix:
|
||||
session.put.assert_called_once()
|
||||
call_kwargs = session.put.call_args
|
||||
url = call_kwargs[0][0]
|
||||
assert url.startswith("https://matrix.example.com/_matrix/client/v3/rooms/!room:example.com/send/m.room.message/")
|
||||
assert url.startswith("https://matrix.example.com/_matrix/client/v3/rooms/%21room%3Aexample.com/send/m.room.message/")
|
||||
assert call_kwargs[1]["headers"]["Authorization"] == "Bearer syt_tok"
|
||||
payload = call_kwargs[1]["json"]
|
||||
assert payload["msgtype"] == "m.text"
|
||||
|
||||
@@ -12,6 +12,7 @@ from gateway.config import Platform
|
||||
from tools.send_message_tool import (
|
||||
_parse_target_ref,
|
||||
_send_discord,
|
||||
_send_matrix_via_adapter,
|
||||
_send_telegram,
|
||||
_send_to_platform,
|
||||
send_message_tool,
|
||||
@@ -594,6 +595,84 @@ class TestSendToPlatformChunking:
|
||||
assert all(call == [] for call in sent_calls[:-1])
|
||||
assert sent_calls[-1] == media
|
||||
|
||||
def test_matrix_media_uses_native_adapter_helper(self):
|
||||
|
||||
doc_path = Path("/tmp/test-send-message-matrix.pdf")
|
||||
doc_path.write_bytes(b"%PDF-1.4 test")
|
||||
|
||||
try:
|
||||
helper = AsyncMock(return_value={"success": True, "platform": "matrix", "chat_id": "!room:example.com", "message_id": "$evt"})
|
||||
with patch("tools.send_message_tool._send_matrix_via_adapter", helper):
|
||||
result = asyncio.run(
|
||||
_send_to_platform(
|
||||
Platform.MATRIX,
|
||||
SimpleNamespace(enabled=True, token="tok", extra={"homeserver": "https://matrix.example.com"}),
|
||||
"!room:example.com",
|
||||
"here you go",
|
||||
media_files=[(str(doc_path), False)],
|
||||
)
|
||||
)
|
||||
|
||||
assert result["success"] is True
|
||||
helper.assert_awaited_once()
|
||||
call = helper.await_args
|
||||
assert call.args[1] == "!room:example.com"
|
||||
assert call.args[2] == "here you go"
|
||||
assert call.kwargs["media_files"] == [(str(doc_path), False)]
|
||||
finally:
|
||||
doc_path.unlink(missing_ok=True)
|
||||
|
||||
def test_send_matrix_via_adapter_sends_document(self, tmp_path):
|
||||
file_path = tmp_path / "report.pdf"
|
||||
file_path.write_bytes(b"%PDF-1.4 test")
|
||||
|
||||
calls = []
|
||||
|
||||
class FakeAdapter:
|
||||
def __init__(self, _config):
|
||||
self.connected = False
|
||||
|
||||
async def connect(self):
|
||||
self.connected = True
|
||||
calls.append(("connect",))
|
||||
return True
|
||||
|
||||
async def send(self, chat_id, message, metadata=None):
|
||||
calls.append(("send", chat_id, message, metadata))
|
||||
return SimpleNamespace(success=True, message_id="$text")
|
||||
|
||||
async def send_document(self, chat_id, file_path, metadata=None):
|
||||
calls.append(("send_document", chat_id, file_path, metadata))
|
||||
return SimpleNamespace(success=True, message_id="$file")
|
||||
|
||||
async def disconnect(self):
|
||||
calls.append(("disconnect",))
|
||||
|
||||
fake_module = SimpleNamespace(MatrixAdapter=FakeAdapter)
|
||||
|
||||
with patch.dict(sys.modules, {"gateway.platforms.matrix": fake_module}):
|
||||
result = asyncio.run(
|
||||
_send_matrix_via_adapter(
|
||||
SimpleNamespace(enabled=True, token="tok", extra={"homeserver": "https://matrix.example.com"}),
|
||||
"!room:example.com",
|
||||
"report attached",
|
||||
media_files=[(str(file_path), False)],
|
||||
)
|
||||
)
|
||||
|
||||
assert result == {
|
||||
"success": True,
|
||||
"platform": "matrix",
|
||||
"chat_id": "!room:example.com",
|
||||
"message_id": "$file",
|
||||
}
|
||||
assert calls == [
|
||||
("connect",),
|
||||
("send", "!room:example.com", "report attached", None),
|
||||
("send_document", "!room:example.com", str(file_path), None),
|
||||
("disconnect",),
|
||||
]
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# HTML auto-detection in Telegram send
|
||||
|
||||
Reference in New Issue
Block a user