修复回忆录图片重试状态透传与前端展示
This commit is contained in:
@@ -305,6 +305,75 @@ class GenerateChapterImagesTaskTest(unittest.TestCase):
|
||||
self.assertTrue(upload_args[0].startswith(b"\x89PNG\r\n\x1a\n"))
|
||||
self.assertEqual(upload_args[2], "image/png")
|
||||
|
||||
@patch("api.tasks.memoir_tasks.SessionLocal")
|
||||
@patch("api.tasks.memoir_tasks.TencentCosStorageService")
|
||||
@patch("api.tasks.memoir_tasks.LiblibImageProvider")
|
||||
@patch("api.tasks.memoir_tasks.MemoirImagePromptService")
|
||||
@patch("api.tasks.memoir_tasks._release_chapter_image_lock")
|
||||
@patch("api.tasks.memoir_tasks._acquire_chapter_image_lock", return_value=True)
|
||||
def test_generate_chapter_images_fails_without_retry_on_permanent_cos_error(
|
||||
self,
|
||||
_acquire_lock_mock,
|
||||
_release_lock_mock,
|
||||
prompt_service_cls,
|
||||
provider_cls,
|
||||
storage_cls,
|
||||
session_local_cls,
|
||||
):
|
||||
chapter = type(
|
||||
"ChapterStub",
|
||||
(),
|
||||
{
|
||||
"id": "chapter-1",
|
||||
"user_id": "user-1",
|
||||
"title": "童年的夏天",
|
||||
"category": "childhood",
|
||||
"content": "那条路我一直记得。\n\n{{{{IMAGE:南方小镇的青石板路}}}}",
|
||||
"images": [
|
||||
{
|
||||
"index": 0,
|
||||
"placeholder": "{{{{IMAGE:南方小镇的青石板路}}}}",
|
||||
"description": "南方小镇的青石板路",
|
||||
"status": "pending",
|
||||
"url": None,
|
||||
}
|
||||
],
|
||||
},
|
||||
)()
|
||||
|
||||
image_buffer = BytesIO()
|
||||
Image.new("RGB", (1, 1), color="white").save(image_buffer, format="PNG")
|
||||
png_bytes = image_buffer.getvalue()
|
||||
|
||||
db = Mock()
|
||||
db.get.return_value = chapter
|
||||
session_local_cls.return_value = db
|
||||
prompt_service_cls.return_value.build_prompt.return_value = {
|
||||
"prompt": "A serene southern China town",
|
||||
"style": "watercolor",
|
||||
"size": "1024x1024",
|
||||
"prompt_context": "childhood: 童年的夏天",
|
||||
}
|
||||
provider_inst = provider_cls.return_value
|
||||
provider_inst.submit_generation.return_value = {
|
||||
"status": "completed",
|
||||
"image_url": "https://provider.example.com/1.png",
|
||||
}
|
||||
provider_inst.download_image.return_value = png_bytes
|
||||
storage_inst = storage_cls.from_env.return_value
|
||||
storage_inst.upload_bytes.side_effect = memoir_tasks.CosUploadError(
|
||||
"AccessDenied", retryable=False, request_id="req-403"
|
||||
)
|
||||
task_self = SimpleNamespace(request=SimpleNamespace(id="task-1"), retry=Mock())
|
||||
|
||||
with self.assertRaises(memoir_tasks.PermanentImageGenerationError) as ctx:
|
||||
generate_chapter_images.run.__func__(task_self, "chapter-1")
|
||||
|
||||
self.assertIn("AccessDenied", str(ctx.exception))
|
||||
self.assertEqual(chapter.images[0]["status"], "failed")
|
||||
self.assertIn("AccessDenied", chapter.images[0]["error"])
|
||||
task_self.retry.assert_not_called()
|
||||
|
||||
@patch("api.tasks.memoir_tasks.SessionLocal")
|
||||
@patch("api.tasks.memoir_tasks.TencentCosStorageService")
|
||||
@patch("api.tasks.memoir_tasks.LiblibImageProvider")
|
||||
|
||||
Reference in New Issue
Block a user