import unittest from app.features.memoir.memoir_images.schema import ( IMAGE_STATUS_FAILED, IMAGE_STATUS_PENDING, normalize_image_asset, ) class MemoirImageSchemaTest(unittest.TestCase): def test_normalize_image_asset_coerces_invalid_status_to_failed(self): asset = normalize_image_asset( { "index": 0, "placeholder": "{{IMAGE:南方小镇的青石板路}}", "description": "南方小镇的青石板路", "status": "mystery", "url": "https://cos.example.com/0.png", } ) self.assertEqual(asset["status"], IMAGE_STATUS_FAILED) self.assertEqual(asset["error"], "invalid image status: mystery") def test_normalize_image_asset_requires_placeholder_and_description(self): asset = normalize_image_asset( { "index": 0, "status": IMAGE_STATUS_PENDING, } ) self.assertIsNone(asset) def test_normalize_image_asset_preserves_retryable_for_failed_assets(self): asset = normalize_image_asset( { "index": 0, "placeholder": "{{IMAGE:南方小镇的青石板路}}", "description": "南方小镇的青石板路", "status": IMAGE_STATUS_FAILED, "error": "upload denied", "retryable": False, } ) self.assertEqual(asset["status"], IMAGE_STATUS_FAILED) self.assertFalse(asset["retryable"]) def test_normalize_image_asset_clears_retryable_for_non_failed_assets(self): asset = normalize_image_asset( { "index": 0, "placeholder": "{{IMAGE:南方小镇的青石板路}}", "description": "南方小镇的青石板路", "status": IMAGE_STATUS_PENDING, "retryable": True, } ) self.assertEqual(asset["status"], IMAGE_STATUS_PENDING) self.assertIsNone(asset["retryable"])