import base64 from types import SimpleNamespace from unittest.mock import Mock from uuid import UUID from app.services import image_generation def test_generate_image_persists_local_url_and_openai_provenance(tmp_path, monkeypatch): recipe = SimpleNamespace( id=UUID("12345678-1234-5678-1234-567812345678"), name="Spiced Chickpea Bowl", ingredients=[{"name": "chickpeas"}], cuisine_tags=["Mediterranean"], image_url=None, image_source=None, ) db = Mock() image_bytes = b"mock-png-bytes" response = Mock(status_code=200) response.json.return_value = { "data": [{"b64_json": base64.b64encode(image_bytes).decode()}] } post = Mock(return_value=response) monkeypatch.setattr(image_generation.settings, "AI_IMAGE_ENABLED", True) monkeypatch.setattr(image_generation, "_openai_api_key", lambda: "test-key") monkeypatch.setattr(image_generation, "STATIC_IMAGES_DIR", tmp_path) monkeypatch.setattr(image_generation.httpx, "post", post) monkeypatch.setenv("AI_IMAGE_MODEL", "gpt-image-1") image_url = image_generation.generate_image_for_recipe(recipe, db=db) assert image_url is not None assert image_url.startswith("/static/images/") assert (tmp_path / image_url.removeprefix("/static/images/")).read_bytes() == image_bytes assert recipe.image_url == image_url db.add.assert_called_once_with(recipe) db.commit.assert_called_once_with() assert recipe.image_source assert "openai" in recipe.image_source.lower() assert "gpt-image-1" in recipe.image_source.lower()