feat: add resource library and real image workflow
This commit is contained in:
91
tests/test_image_generation_service.py
Normal file
91
tests/test_image_generation_service.py
Normal file
@@ -0,0 +1,91 @@
|
||||
"""Tests for application-level image-generation orchestration."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import httpx
|
||||
import pytest
|
||||
|
||||
from app.application.services.image_generation_service import ImageGenerationService
|
||||
from app.infra.image_generation.base import GeneratedImageResult, SourceImage
|
||||
|
||||
|
||||
class FakeProvider:
|
||||
def __init__(self) -> None:
|
||||
self.calls: list[tuple[str, str, str]] = []
|
||||
|
||||
async def generate_tryon_image(
|
||||
self,
|
||||
*,
|
||||
prompt: str,
|
||||
person_image: SourceImage,
|
||||
garment_image: SourceImage,
|
||||
) -> GeneratedImageResult:
|
||||
self.calls.append(("tryon", person_image.url, garment_image.url))
|
||||
return GeneratedImageResult(
|
||||
image_bytes=b"tryon",
|
||||
mime_type="image/png",
|
||||
provider="gemini",
|
||||
model="gemini-test",
|
||||
prompt=prompt,
|
||||
)
|
||||
|
||||
async def generate_scene_image(
|
||||
self,
|
||||
*,
|
||||
prompt: str,
|
||||
source_image: SourceImage,
|
||||
scene_image: SourceImage,
|
||||
) -> GeneratedImageResult:
|
||||
self.calls.append(("scene", source_image.url, scene_image.url))
|
||||
return GeneratedImageResult(
|
||||
image_bytes=b"scene",
|
||||
mime_type="image/jpeg",
|
||||
provider="gemini",
|
||||
model="gemini-test",
|
||||
prompt=prompt,
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_image_generation_service_downloads_inputs_for_tryon_and_scene(monkeypatch):
|
||||
"""The service should download both inputs and dispatch them to the matching provider method."""
|
||||
|
||||
responses = {
|
||||
"https://images.example.com/person.png": (b"person-bytes", "image/png"),
|
||||
"https://images.example.com/garment.png": (b"garment-bytes", "image/png"),
|
||||
"https://images.example.com/source.jpg": (b"source-bytes", "image/jpeg"),
|
||||
"https://images.example.com/scene.jpg": (b"scene-bytes", "image/jpeg"),
|
||||
}
|
||||
|
||||
async def handler(request: httpx.Request) -> httpx.Response:
|
||||
body, mime = responses[str(request.url)]
|
||||
return httpx.Response(200, content=body, headers={"content-type": mime}, request=request)
|
||||
|
||||
monkeypatch.setenv("GEMINI_API_KEY", "test-key")
|
||||
|
||||
from app.config.settings import get_settings
|
||||
|
||||
get_settings.cache_clear()
|
||||
provider = FakeProvider()
|
||||
downloader = httpx.AsyncClient(transport=httpx.MockTransport(handler))
|
||||
service = ImageGenerationService(provider=provider, downloader=downloader)
|
||||
|
||||
try:
|
||||
tryon = await service.generate_tryon_image(
|
||||
person_image_url="https://images.example.com/person.png",
|
||||
garment_image_url="https://images.example.com/garment.png",
|
||||
)
|
||||
scene = await service.generate_scene_image(
|
||||
source_image_url="https://images.example.com/source.jpg",
|
||||
scene_image_url="https://images.example.com/scene.jpg",
|
||||
)
|
||||
finally:
|
||||
await downloader.aclose()
|
||||
get_settings.cache_clear()
|
||||
|
||||
assert provider.calls == [
|
||||
("tryon", "https://images.example.com/person.png", "https://images.example.com/garment.png"),
|
||||
("scene", "https://images.example.com/source.jpg", "https://images.example.com/scene.jpg"),
|
||||
]
|
||||
assert tryon.image_bytes == b"tryon"
|
||||
assert scene.image_bytes == b"scene"
|
||||
Reference in New Issue
Block a user