Files
life-echo/api/tests/test_memoir_image_parser.py

79 lines
3.6 KiB
Python
Raw Normal View History

import unittest
from app.features.memoir.memoir_images.parser import (
build_initial_image_assets,
parse_image_placeholders,
parse_narrative_json,
parse_narrative_to_sections,
)
class MemoirImageParserTest(unittest.TestCase):
def test_parse_image_placeholders_preserves_order_and_offsets(self):
content = (
"那条路我一直记得。\n\n"
"{{{{IMAGE:南方小镇的青石板路}}}}\n\n"
"奶奶总坐在门口。\n\n"
"{{{{IMAGE:奶奶坐在院子里的藤椅上}}}}"
)
items = parse_image_placeholders(content, max_images=3)
self.assertEqual([item["index"] for item in items], [0, 1])
self.assertEqual(items[0]["description"], "南方小镇的青石板路")
self.assertEqual(items[1]["placeholder"], "{{{{IMAGE:奶奶坐在院子里的藤椅上}}}}")
self.assertLess(items[0]["start_offset"], items[1]["start_offset"])
def test_build_initial_image_assets_marks_every_item_pending(self):
placeholders = [
{
"index": 0,
"description": "南方小镇的青石板路",
"placeholder": "{{{{IMAGE:南方小镇的青石板路}}}}",
"start_offset": 10,
}
]
assets = build_initial_image_assets(
placeholders=placeholders,
provider="liblib",
style="watercolor",
size="1024x1024",
now_iso="2026-03-10T10:00:00Z",
)
self.assertEqual(assets[0]["status"], "pending")
self.assertEqual(assets[0]["provider"], "liblib")
self.assertEqual(assets[0]["url"], None)
def test_parse_image_placeholders_accepts_double_brace_variant(self):
content = "开头。\n\n{{IMAGE:1938年初的上海弄堂口冬日萧瑟}}\n\n结尾。"
items = parse_image_placeholders(content, max_images=2)
self.assertEqual(len(items), 1)
self.assertEqual(items[0]["placeholder"], "{{IMAGE:1938年初的上海弄堂口冬日萧瑟}}")
self.assertEqual(items[0]["description"], "1938年初的上海弄堂口冬日萧瑟")
def test_parse_narrative_json_returns_sections_with_content_and_placeholder_info(self):
raw = '{"paragraphs": [{"content": "那年春天。", "image_description": "南方小镇的青石板路"}, {"content": "奶奶坐在藤椅上。", "image_description": "奶奶的藤椅"}]}'
segments = parse_narrative_json(raw)
self.assertEqual(len(segments), 2)
self.assertEqual(segments[0]["content"], "那年春天。")
self.assertEqual(segments[0]["placeholder_info"]["description"], "南方小镇的青石板路")
self.assertEqual(segments[1]["content"], "奶奶坐在藤椅上。")
self.assertEqual(segments[1]["placeholder_info"]["description"], "奶奶的藤椅")
def test_parse_narrative_to_sections_prefers_json_then_fallback_to_placeholder(self):
json_raw = '{"paragraphs": [{"content": "段落一", "image_description": "图一"}]}'
segments = parse_narrative_to_sections(json_raw)
self.assertEqual(len(segments), 1)
self.assertEqual(segments[0]["content"], "段落一")
self.assertEqual(segments[0]["placeholder_info"]["description"], "图一")
placeholder_raw = "正文。\n\n{{{{IMAGE:描述}}}}\n\n结尾。"
segments2 = parse_narrative_to_sections(placeholder_raw)
self.assertEqual(len(segments2), 2)
self.assertIn("正文", segments2[0]["content"])
self.assertEqual(segments2[0]["placeholder_info"]["description"], "描述")