feat(export): 导出 HTML 媒体内嵌(图片/语音/视频/附件, OSS URL 直接嵌入)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -25,6 +25,16 @@ async def _seed(session: AsyncSession) -> None:
|
||||
Message(msg_id="g2", channel="wechat", owner_account_id="wx_owner",
|
||||
talker_id="room_topic", room_id="g1@chatroom", text="范围外",
|
||||
timestamp=9999999, is_send=True, type="text", type_raw=1),
|
||||
# 图文消息 — OSS URL 应直接嵌入 <img>
|
||||
Message(msg_id="dm3", channel="wechat", owner_account_id="wx_owner",
|
||||
talker_id="wx_friend", room_id=None, text=None,
|
||||
timestamp=2500, is_send=False, type="image", type_raw=3,
|
||||
file_url="https://oss.example.com/x/p1.jpg"),
|
||||
# 本地 /api/media 路径 — 应显示 "[本地媒体]" 占位
|
||||
Message(msg_id="dm4", channel="wechat", owner_account_id="wx_owner",
|
||||
talker_id="wx_friend", room_id=None, text=None,
|
||||
timestamp=2600, is_send=True, type="voice", type_raw=34,
|
||||
file_url="/api/media/abc123", duration=8),
|
||||
])
|
||||
await session.commit()
|
||||
|
||||
@@ -58,3 +68,18 @@ async def test_export_empty(make_client):
|
||||
assert r.status_code == 200
|
||||
assert r.headers["content-type"].startswith("text/html")
|
||||
assert "暂无消息" in r.text
|
||||
|
||||
|
||||
async def test_export_embeds_media(make_client):
|
||||
"""图片(OSS URL)直接 <img> 嵌入;本地 /api/ 路径显示 [本地媒体] 占位。"""
|
||||
client = await make_client(_seed)
|
||||
r = await client.get("/api/export/chat-html", params={
|
||||
"channel": "wechat", "owner_account_id": "wx_owner", "talker_id": "wx_friend"})
|
||||
assert r.status_code == 200
|
||||
body = r.text
|
||||
# OSS URL → <img> with the URL escaped into src
|
||||
assert "<img" in body
|
||||
assert "https://oss.example.com/x/p1.jpg" in body
|
||||
# 本地路径 → 占位提示,不嵌 <audio>
|
||||
assert "[本地媒体]" in body
|
||||
assert "/api/media/abc123" not in body
|
||||
|
||||
Reference in New Issue
Block a user