image-pipeline-server / tests /unit /application /services /setup /test_request_options.py
Tu Nguyen
refactoring ok
9be3b9f
Raw
History Blame Contribute Delete
3.87 kB
from __future__ import annotations
import unittest
from app.application.services.setup.request_options import DefaultProcessingOptionsResolver
from app.domain.schemas import (
ImageSizeModel,
MetadataModel,
PipelineDefaultsModel,
ProcessRequestModel,
UploadOptionsModel,
WatermarkModel,
)
class DefaultProcessingOptionsResolverTests(unittest.TestCase):
def test_resolve_merges_defaults_with_request_overrides(self) -> None:
defaults = PipelineDefaultsModel(
sizes=[ImageSizeModel(name="desktop", width=1024)],
metadata=MetadataModel(title="Mặc định", tags=["mac-dinh"], rating=5),
watermark=WatermarkModel(assetPath="watermark.png", widthRatio=0.2, opacity=1.0),
)
resolver = DefaultProcessingOptionsResolver(defaults, ("avif", "jpg"))
request = ProcessRequestModel(
metadata=MetadataModel(title="Tiêu đề mới", comments="Ghi chú"),
watermark=WatermarkModel(assetPath="override.png", opacity=0.7),
upload=UploadOptionsModel(uploadToR2=True),
)
resolved = resolver.resolve(request)
self.assertEqual(("avif", "jpg"), resolved.formats)
self.assertEqual(("desktop",), tuple(size.name for size in resolved.sizes))
self.assertIsNotNone(resolved.metadata)
self.assertEqual("Tiêu đề mới", resolved.metadata.title)
self.assertEqual(["mac-dinh"], resolved.metadata.tags)
self.assertEqual("Ghi chú", resolved.metadata.comments)
self.assertEqual(5, resolved.metadata.rating)
self.assertIsNotNone(resolved.watermark)
self.assertEqual("override.png", resolved.watermark.asset_path)
self.assertEqual(0.2, resolved.watermark.width_ratio)
self.assertEqual(0.7, resolved.watermark.opacity)
self.assertTrue(resolved.upload_to_r2)
self.assertIsNone(resolved.r2_prefix)
def test_resolve_keeps_explicit_request_sizes_and_formats(self) -> None:
defaults = PipelineDefaultsModel(sizes=[ImageSizeModel(name="desktop", width=1024)])
resolver = DefaultProcessingOptionsResolver(defaults, ("avif", "jpg"))
request = ProcessRequestModel(
sizes=[ImageSizeModel(name="mobile", width=480)],
formats=["jpg"],
)
resolved = resolver.resolve(request)
self.assertEqual(("mobile",), tuple(size.name for size in resolved.sizes))
self.assertEqual(("jpg",), resolved.formats)
self.assertIsNone(resolved.metadata)
self.assertIsNone(resolved.watermark)
self.assertIsNone(resolved.r2_prefix)
def test_rejects_invalid_default_formats(self) -> None:
defaults = PipelineDefaultsModel(sizes=[ImageSizeModel(name="desktop", width=1024)])
with self.assertRaisesRegex(ValueError, "Unsupported default output format"):
DefaultProcessingOptionsResolver(defaults, ("avif", "webp"))
def test_resolve_normalizes_request_r2_prefix(self) -> None:
defaults = PipelineDefaultsModel(sizes=[ImageSizeModel(name="desktop", width=1024)])
resolver = DefaultProcessingOptionsResolver(defaults, ("avif", "jpg"))
resolved = resolver.resolve(
ProcessRequestModel(upload=UploadOptionsModel(uploadToR2=True, r2Prefix="/custom/listing-123/"))
)
self.assertEqual("custom/listing-123", resolved.r2_prefix)
def test_rejects_blank_request_r2_prefix(self) -> None:
defaults = PipelineDefaultsModel(sizes=[ImageSizeModel(name="desktop", width=1024)])
resolver = DefaultProcessingOptionsResolver(defaults, ("avif", "jpg"))
with self.assertRaisesRegex(ValueError, "r2Prefix must not be empty"):
resolver.resolve(ProcessRequestModel(upload=UploadOptionsModel(r2Prefix="///")))
if __name__ == "__main__":
unittest.main()