import unittest from unittest.mock import Mock from api.services.memoir_images.prompting import MemoirImagePromptService from api.services.memoir_images.settings import MemoirImageSettings class MemoirImagePromptingTest(unittest.TestCase): def test_prompt_service_uses_category_style_and_plain_fallback_without_llm(self): settings = MemoirImageSettings( enabled=True, max_per_chapter=2, provider="liblib", default_style="watercolor", default_size="1024x1024", poll_interval_seconds=3, max_attempts=20, ) service = MemoirImagePromptService(llm=None, settings=settings) result = service.build_prompt( chapter_title="童年的夏天", chapter_category="childhood", description="奶奶坐在院子里的藤椅上", context_excerpt="梧桐树下很安静,夏天总有蝉鸣。", ) self.assertEqual(result["style"], "watercolor") self.assertEqual(result["size"], "1024x1024") self.assertIn("奶奶坐在院子里的藤椅上", result["prompt"]) self.assertIn("childhood", result["prompt_context"]) def test_prompt_service_parses_structured_llm_response(self): settings = MemoirImageSettings( enabled=True, max_per_chapter=2, provider="liblib", default_style="watercolor", default_size="1024x1024", poll_interval_seconds=3, max_attempts=20, ) llm = Mock() llm.invoke.return_value.content = ( '{"prompt":"A grandmother in a quiet courtyard, summer cicadas, soft watercolor",' '"style":"watercolor","size":"1024x1024"}' ) service = MemoirImagePromptService(llm=llm, settings=settings) result = service.build_prompt( chapter_title="童年的夏天", chapter_category="childhood", description="奶奶坐在院子里的藤椅上", context_excerpt="梧桐树下很安静,夏天总有蝉鸣。", ) self.assertEqual(result["prompt"], "A grandmother in a quiet courtyard, summer cicadas, soft watercolor") self.assertEqual(result["style"], "watercolor") self.assertEqual(result["size"], "1024x1024")