test_decode_readers_service.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from __future__ import annotations
  2. from uuid import uuid4
  3. from acquisition.domain import CandidateItem, MediaAsset
  4. from core.models import Card, CardExtract, ExtractedContent, Post
  5. from decode_content.readers.service import post_from_candidate_item, read_item, read_post
  6. def test_post_from_candidate_item_prefers_cdn_then_oss_then_source():
  7. item_id = uuid4()
  8. item = CandidateItem(
  9. id=item_id,
  10. platform="xiaohongshu",
  11. platform_item_id="abc",
  12. canonical_url="https://xhs/item/abc",
  13. title="脚本结构",
  14. author_name="sam",
  15. raw_summary="正文",
  16. source_payload={"topic_list": ["脚本"]},
  17. )
  18. media = [
  19. MediaAsset(item_id=item_id, media_type="image", source_url="source1", cdn_url="cdn1", position=2),
  20. MediaAsset(item_id=item_id, media_type="image", source_url="source0", oss_url="oss0", position=1),
  21. ]
  22. post = post_from_candidate_item(item, media)
  23. assert post.id == "xiaohongshu_abc"
  24. assert post.image_urls == ["oss0", "cdn1"]
  25. assert [card.index for card in post.cards] == [1, 2]
  26. assert post.body_text == "正文"
  27. assert post.topic_list == ["脚本"]
  28. def test_read_post_imgtext_merges_text_cards_and_media():
  29. post = Post(
  30. id="xhs_1",
  31. platform="xiaohongshu",
  32. url="u",
  33. content_id="1",
  34. image_urls=["img1", "img2"],
  35. cards=[Card(index=1, kind="image", url="img1"), Card(index=2, kind="image", url="img2")],
  36. )
  37. def image_reader(p: Post) -> ExtractedContent:
  38. assert p.id == "xhs_1"
  39. return ExtractedContent(
  40. text="主体",
  41. from_image="图片知识",
  42. cards=[CardExtract(index=1, content="卡1"), CardExtract(index=2, content="卡2")],
  43. )
  44. result = read_post(post, image_reader=image_reader)
  45. assert "图片知识" in result.text
  46. assert result.cards[0].content == "卡1"
  47. assert result.media == {"type": "image", "video_url": None, "images": ["img1", "img2"]}
  48. def test_read_item_routes_video_to_video_reader():
  49. item_id = uuid4()
  50. item = CandidateItem(id=item_id, platform="douyin", platform_item_id="v1", title="视频")
  51. media = [MediaAsset(item_id=item_id, media_type="video", cdn_url="https://cdn/video.mp4", position=1)]
  52. def video_reader(post: Post) -> ExtractedContent:
  53. assert post.video_urls == ["https://cdn/video.mp4"]
  54. post.cards = [Card(index=1, kind="segment", url=post.video_urls[0], start=0, end=12)]
  55. return ExtractedContent(text="视频理解", cards=[CardExtract(index=1, content="片段知识")])
  56. result = read_item(item, media, video_reader=video_reader)
  57. assert result.media["type"] == "video"
  58. assert result.cards[0].kind == "segment"
  59. assert result.cards[0].content == "片段知识"