import sys
import unittest
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "src"))
from wechat_decrypt_tool.routers.sns import _parse_timeline_xml # noqa: E402 pylint: disable=wrong-import-position
class TestSnsParseTimelineXmlSanitization(unittest.TestCase):
def test_external_share_type5_parses_with_raw_ampersands(self):
xml = (
""
"wxid_2az0agby0baa22"
"1771500773"
"让我看看它和suno有什么区别"
""
"5"
"Google Gemini 上线了AI音乐生成功能"
"https://b23.tv/lVa1lpm?share_medium=android&share_source=weixin_moments"
""
"哔哩哔哩"
""
"4m1"
"https://b23.tv/lVa1lpm?share_medium=android&share_source=weixin_moments"
"http://shmmsns.qpic.cn/mmsns/test/150"
""
""
)
out = _parse_timeline_xml(xml, "fallback")
self.assertEqual(out.get("type"), 5)
self.assertEqual(out.get("title"), "Google Gemini 上线了AI音乐生成功能")
self.assertEqual(out.get("sourceName"), "哔哩哔哩")
self.assertIn("&share_source=weixin_moments", str(out.get("contentUrl") or ""))
self.assertTrue(isinstance(out.get("media"), list) and len(out.get("media") or []) == 1)
def test_external_share_type42_parses_with_raw_ampersands(self):
xml = (
""
"wxid_all914izz7w222"
"1771504315"
"2026 恭喜自己 也恭喜你"
""
"42"
"恭喜自己"
"成龙/周华健"
"https://i.y.qq.com/v8/playsong.html?platform=11&appshare=android_qq"
""
"QQ音乐"
""
"5m2"
"http://c6.y.qq.com/rsc/fcgi-bin/fcg_pyq_play.fcg?songmid=002kNnX90keHGW&fromtag=46"
"http://szmmsns.qpic.cn/mmsns/test/0"
""
""
)
out = _parse_timeline_xml(xml, "fallback")
self.assertEqual(out.get("type"), 42)
self.assertEqual(out.get("title"), "恭喜自己")
self.assertEqual(out.get("sourceName"), "QQ音乐")
self.assertIn("&appshare=android_qq", str(out.get("contentUrl") or ""))
self.assertTrue(isinstance(out.get("media"), list) and len(out.get("media") or []) == 1)
if __name__ == "__main__":
unittest.main()