diff --git a/app/modules/feishu/feishu.py b/app/modules/feishu/feishu.py index 165487b8..5bdbda1d 100644 --- a/app/modules/feishu/feishu.py +++ b/app/modules/feishu/feishu.py @@ -1909,12 +1909,16 @@ class Feishu: ) -> Optional[dict]: """发送媒体列表消息,复用通知发送链路。""" lines = [] + image = message.image for index, media in enumerate(medias[:10], start=1): + if not image: + image = media.get_message_image() title = getattr(media, "title_year", None) or getattr(media, "title", None) or "未知媒体" lines.append(f"{index}. {title}") proxy_message = Notification( title=message.title, text="\n".join(lines), + image=image, link=message.link, buttons=message.buttons, userid=message.userid, diff --git a/tests/test_feishu_media_message.py b/tests/test_feishu_media_message.py new file mode 100644 index 00000000..b6c4f79f --- /dev/null +++ b/tests/test_feishu_media_message.py @@ -0,0 +1,50 @@ +from unittest.mock import MagicMock, patch + +from app.testing.bootstrap import ensure_optional_stub + +ensure_optional_stub("psutil") +ensure_optional_stub("dateparser") +ensure_optional_stub("Pinyin2Hanzi", is_pinyin=lambda value: False) + +from app.core.context import MediaInfo +from app.modules.feishu.feishu import Feishu +from app.schemas import Notification + + +def _build_feishu_client() -> Feishu: + """构造不会启动真实飞书长连接的测试客户端。""" + with ( + patch.object(Feishu, "_build_api_client", return_value=MagicMock()), + patch.object(Feishu, "_start_ws_client"), + ): + return Feishu( + FEISHU_APP_ID="test_app_id", + FEISHU_APP_SECRET="test_app_secret", + name="feishu-test", + ) + + +def test_send_medias_message_passes_first_available_image() -> None: + """飞书媒体列表应将首张可用媒体图片传入通知卡片。""" + client = _build_feishu_client() + first_media = MediaInfo() + first_media.title = "无海报媒体" + second_media = MediaInfo() + second_media.title = "有海报媒体" + second_media.poster_path = "https://example.com/poster.jpg" + + with patch.object( + client, + "send_notification", + return_value={"success": True}, + ) as send_notification: + result = client.send_medias_message( + message=Notification(title="搜索结果", userid="ou_test"), + medias=[first_media, second_media], + ) + + assert result == {"success": True} + proxy_message = send_notification.call_args.args[0] + assert proxy_message.image == "https://example.com/poster.jpg" + assert proxy_message.text == "1. 无海报媒体\n2. 有海报媒体" + assert send_notification.call_args.kwargs["userid"] == "ou_test"