test_image_generation_plugin_dispatch.py
1 from __future__ import annotations 2 3 import json 4 import pytest 5 6 from agent import image_gen_registry 7 from agent.image_gen_provider import ImageGenProvider 8 9 10 @pytest.fixture(autouse=True) 11 def _reset_registry(): 12 image_gen_registry._reset_for_tests() 13 yield 14 image_gen_registry._reset_for_tests() 15 16 17 class _FakeCodexProvider(ImageGenProvider): 18 @property 19 def name(self) -> str: 20 return "codex" 21 22 def generate(self, prompt, aspect_ratio="landscape", **kwargs): 23 return { 24 "success": True, 25 "image": "/tmp/codex-test.png", 26 "model": "gpt-5.2-codex", 27 "prompt": prompt, 28 "aspect_ratio": aspect_ratio, 29 "provider": "codex", 30 } 31 32 33 class TestPluginDispatch: 34 def test_dispatch_routes_to_codex_provider(self, monkeypatch, tmp_path): 35 from tools import image_generation_tool 36 from agent import image_gen_registry as registry_module 37 from hermes_cli import plugins as plugins_module 38 39 monkeypatch.setenv("HERMES_HOME", str(tmp_path)) 40 (tmp_path / "config.yaml").write_text("image_gen:\n provider: codex\n") 41 image_gen_registry.register_provider(_FakeCodexProvider()) 42 43 monkeypatch.setattr(image_generation_tool, "_read_configured_image_provider", lambda: "codex") 44 monkeypatch.setattr(plugins_module, "_ensure_plugins_discovered", lambda: None) 45 monkeypatch.setattr(registry_module, "get_provider", lambda name: _FakeCodexProvider() if name == "codex" else None) 46 47 dispatched = image_generation_tool._dispatch_to_plugin_provider("draw cat", "square") 48 payload = json.loads(dispatched) 49 50 assert payload["success"] is True 51 assert payload["provider"] == "codex" 52 assert payload["image"] == "/tmp/codex-test.png" 53 assert payload["aspect_ratio"] == "square" 54 55 def test_dispatch_reports_missing_registered_provider(self, monkeypatch, tmp_path): 56 from tools import image_generation_tool 57 from hermes_cli import plugins as plugins_module 58 59 monkeypatch.setenv("HERMES_HOME", str(tmp_path)) 60 (tmp_path / "config.yaml").write_text("image_gen:\n provider: missing-codex\n") 61 62 monkeypatch.setattr(image_generation_tool, "_read_configured_image_provider", lambda: "missing-codex") 63 monkeypatch.setattr(plugins_module, "_ensure_plugins_discovered", lambda: None) 64 65 dispatched = image_generation_tool._dispatch_to_plugin_provider("draw cat", "landscape") 66 payload = json.loads(dispatched) 67 68 assert payload["success"] is False 69 assert payload["error_type"] == "provider_not_registered" 70 assert "image_gen.provider='missing-codex'" in payload["error"] 71 72 def test_dispatch_force_refreshes_plugins_when_provider_initially_missing(self, monkeypatch, tmp_path): 73 from tools import image_generation_tool 74 from hermes_cli import plugins as plugins_module 75 from agent import image_gen_registry as registry_module 76 77 monkeypatch.setenv("HERMES_HOME", str(tmp_path)) 78 (tmp_path / "config.yaml").write_text("image_gen:\n provider: codex\n") 79 80 monkeypatch.setattr(image_generation_tool, "_read_configured_image_provider", lambda: "codex") 81 82 calls = [] 83 provider_state = {"provider": None} 84 85 def fake_ensure_plugins_discovered(force=False): 86 calls.append(force) 87 if force: 88 provider_state["provider"] = _FakeCodexProvider() 89 90 monkeypatch.setattr(plugins_module, "_ensure_plugins_discovered", fake_ensure_plugins_discovered) 91 monkeypatch.setattr(registry_module, "get_provider", lambda name: provider_state["provider"]) 92 93 dispatched = image_generation_tool._dispatch_to_plugin_provider("draw hammy", "portrait") 94 payload = json.loads(dispatched) 95 96 assert calls == [False, True] 97 assert payload["success"] is True 98 assert payload["provider"] == "codex" 99 assert payload["aspect_ratio"] == "portrait"