"""reading_segments:正文已含与主插图相同 asset 时不重复 cover_image。""" import unittest from app.features.memoir.helpers import build_reading_segments from app.features.memoir.reading_segment_materialize import ( build_reading_segments_snapshot, resolve_reading_segments_for_chapter_detail, ) class _Intent: def __init__(self, asset_id: str): self.intent_role = "primary" self.asset_id = asset_id self.caption = "cap" self.prompt_brief = None self.style_profile = None self.error = None self.status = "completed" self.created_at = None self.updated_at = None class _Story: def __init__(self, sid: str, body: str, asset_id: str): self.id = sid self.title = "T" self.canonical_markdown = body self.image_intents = [_Intent(asset_id)] class _Link: def __init__(self, order: int, story: _Story): self.order_index = order self.story = story class _Ch: def __init__(self, story: _Story): self.story_links = [_Link(0, story)] class ReadingSegmentsDedupeTest(unittest.TestCase): def test_omits_cover_when_primary_asset_in_body(self): aid = "c67d11c5-23b7-4ab9-91ed-c05b5a27a12b" body = f"正文\n\n![cap](asset://{aid})\n\n更多" st = _Story("s1", body, aid) ch = _Ch(st) asset_url_map = {aid: "https://cos.example/img.png"} segs = build_reading_segments(ch, asset_url_map=asset_url_map) self.assertEqual(len(segs), 1) self.assertIn("https://cos.example", segs[0]["body_markdown"]) self.assertIsNone(segs[0]["cover_image"]) def test_keeps_cover_when_primary_not_in_body(self): aid = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" body = "仅文字无图" st = _Story("s1", body, aid) ch = _Ch(st) asset_url_map = {aid: "https://cos.example/cover.png"} segs = build_reading_segments(ch, asset_url_map=asset_url_map) self.assertEqual(len(segs), 1) self.assertIsNotNone(segs[0]["cover_image"]) self.assertTrue(segs[0]["cover_image"].get("url")) def test_persisted_snapshot_hydrate_matches_live_materialize(self): aid = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" body = "仅文字无图" st = _Story("s1", body, aid) ch = _Ch(st) ch.reading_segments_json = build_reading_segments_snapshot(ch) ch.markdown_compose_dirty = False asset_url_map = {aid: "https://cos.example/cover.png"} live = build_reading_segments(ch, asset_url_map=asset_url_map) via_snapshot = resolve_reading_segments_for_chapter_detail( ch, asset_url_map=asset_url_map ) self.assertEqual(len(live), len(via_snapshot)) self.assertEqual(live[0]["story_id"], via_snapshot[0]["story_id"]) self.assertEqual(live[0]["body_markdown"], via_snapshot[0]["body_markdown"]) self.assertEqual( (live[0]["cover_image"] or {}).get("url"), (via_snapshot[0]["cover_image"] or {}).get("url"), ) if __name__ == "__main__": unittest.main()