test_platform_adapters.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. from __future__ import annotations
  2. from types import SimpleNamespace
  3. from acquisition.platforms.douyin import DouyinAdapter
  4. from acquisition.platforms import douyin as douyin_module
  5. from acquisition.platforms import weixin as weixin_module
  6. from acquisition.platforms import xiaohongshu as xhs_module
  7. from acquisition.platforms.weixin import WeixinAdapter
  8. from acquisition.platforms.xiaohongshu import XiaohongshuAdapter
  9. from core.models import Post
  10. def test_xiaohongshu_adapter_maps_search_and_detail(monkeypatch):
  11. settings = SimpleNamespace(search_content_type="图文")
  12. def fake_search(query, *, content_type, limit, settings, rate_limiter):
  13. assert query == "脚本 开头"
  14. assert content_type == "图文"
  15. assert limit == 3
  16. return [
  17. {
  18. "id": "xhs-1",
  19. "url": "https://xhs.test/1",
  20. "title": "脚本开头",
  21. "nick_name": "作者 A",
  22. "cover_url": "https://img.test/cover.jpg",
  23. }
  24. ]
  25. def fake_fetch(source_id, *, settings, rate_limiter):
  26. assert source_id == "xhs-1"
  27. return Post(
  28. id="xhs_xhs-1",
  29. platform="xiaohongshu",
  30. url="https://xhs.test/detail/1",
  31. content_id="xhs-1",
  32. title="详情标题",
  33. content_type="图文",
  34. body_text="详情正文",
  35. image_urls=["https://img.test/1.jpg"],
  36. author_name="详情作者",
  37. raw={"source": "mock"},
  38. )
  39. monkeypatch.setattr(xhs_module, "search_xiaohongshu", fake_search)
  40. monkeypatch.setattr(xhs_module, "fetch_post_detail", fake_fetch)
  41. adapter = XiaohongshuAdapter()
  42. candidate = adapter.search("脚本 开头", settings=settings, limit=3, rate_limiter=None)[0]
  43. item = adapter.fetch_detail(candidate, settings=settings, rate_limiter=None)
  44. assert candidate.source_id == "xhs-1"
  45. assert candidate.author == "作者 A"
  46. assert item.title == "详情标题"
  47. assert item.image_urls == ["https://img.test/1.jpg"]
  48. assert item.raw["source"] == "mock"
  49. def test_weixin_adapter_hashes_url_and_reads_detail(monkeypatch):
  50. settings = SimpleNamespace()
  51. def fake_search(query, *, limit, settings, rate_limiter):
  52. assert query == "公众号 选题"
  53. assert limit == 2
  54. return [
  55. {
  56. "url": "https://mp.weixin.qq.com/s/abc",
  57. "title": "公众号选题",
  58. "nick_name": "公众号",
  59. "cover_url": "https://img.test/wx.jpg",
  60. }
  61. ]
  62. def fake_detail(url, *, settings, rate_limiter):
  63. assert url == "https://mp.weixin.qq.com/s/abc"
  64. return "公众号正文", ["https://img.test/wx-1.jpg"]
  65. monkeypatch.setattr(weixin_module, "search_weixin", fake_search)
  66. monkeypatch.setattr(weixin_module, "fetch_weixin_detail", fake_detail)
  67. adapter = WeixinAdapter()
  68. candidate = adapter.search("公众号 选题", settings=settings, limit=2, rate_limiter=None)[0]
  69. item = adapter.fetch_detail(candidate, settings=settings, rate_limiter=None)
  70. assert candidate.platform == "weixin"
  71. assert len(candidate.source_id) == 16
  72. assert item.body_text == "公众号正文"
  73. assert item.image_urls == ["https://img.test/wx-1.jpg"]
  74. def test_douyin_adapter_maps_video_search_and_detail(monkeypatch):
  75. settings = SimpleNamespace()
  76. def fake_search(query, *, platform, content_type, limit, settings, rate_limiter):
  77. assert query == "短视频 讲法"
  78. assert platform == "douyin"
  79. assert content_type == "视频"
  80. assert limit == 1
  81. return ["dy-1"]
  82. def fake_fetch(source_id, *, settings, rate_limiter):
  83. assert source_id == "dy-1"
  84. return Post(
  85. id="dy_dy-1",
  86. platform="douyin",
  87. url="https://douyin.test/1",
  88. content_id="dy-1",
  89. title="短视频讲法",
  90. content_type="video",
  91. body_text="视频文案",
  92. video_urls=["https://video.test/1.mp4"],
  93. raw={"source": "mock"},
  94. )
  95. monkeypatch.setattr(douyin_module, "search_keyword", fake_search)
  96. monkeypatch.setattr(douyin_module, "fetch_post_detail", fake_fetch)
  97. adapter = DouyinAdapter()
  98. candidate = adapter.search("短视频 讲法", settings=settings, limit=1, rate_limiter=None)[0]
  99. item = adapter.fetch_detail(candidate, settings=settings, rate_limiter=None)
  100. assert candidate.source_id == "dy-1"
  101. assert item.content_type == "video"
  102. assert item.video_urls == ["https://video.test/1.mp4"]