test_host_legacy_adapters.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import importlib
  2. from types import SimpleNamespace
  3. import pytest
  4. from agent.core.runner import RunConfig
  5. from agent.trace.project_environment import ProjectEnvironment
  6. from examples.legacy_adapters import LegacyExampleResolver
  7. @pytest.mark.asyncio
  8. async def test_legacy_example_resolver_success_missing_and_internal_error(monkeypatch):
  9. resolver = LegacyExampleResolver()
  10. received = []
  11. async def initializer(messages=None):
  12. received.append(messages)
  13. return "project-runner", messages or [{"role": "user", "content": "default"}], RunConfig()
  14. module = SimpleNamespace(init_project_env=initializer)
  15. monkeypatch.setattr(importlib, "import_module", lambda name: module)
  16. resolved = await resolver.resolve("demo", [{"role": "user", "content": "input"}])
  17. assert resolved.runner == "project-runner"
  18. assert received[-1][0]["content"] == "input"
  19. def missing(name):
  20. error = ImportError("missing project")
  21. error.name = "examples.missing.run"
  22. raise error
  23. monkeypatch.setattr(importlib, "import_module", missing)
  24. assert await resolver.resolve("missing") is None
  25. def internal_error(name):
  26. error = ImportError("missing dependency")
  27. error.name = "business_dependency"
  28. raise error
  29. monkeypatch.setattr(importlib, "import_module", internal_error)
  30. with pytest.raises(ImportError, match="dependency"):
  31. await resolver.resolve("broken")
  32. @pytest.mark.asyncio
  33. async def test_run_api_uses_injected_project_environment(monkeypatch):
  34. from agent.trace import run_api
  35. selected = {}
  36. project_runner = object()
  37. class Resolver:
  38. async def resolve(self, project_name, messages=None):
  39. selected["project_name"] = project_name
  40. return ProjectEnvironment(
  41. runner=project_runner,
  42. messages=[{"role": "user", "content": "resolved"}],
  43. default_config=RunConfig(),
  44. )
  45. async def fake_run(messages, config, trace_id_future, runner_instance=None):
  46. selected["runner"] = runner_instance
  47. selected["messages"] = messages
  48. trace_id_future.set_result("project-trace")
  49. monkeypatch.setattr(run_api, "_project_environment_resolver", Resolver())
  50. monkeypatch.setattr(run_api, "_runner", object())
  51. monkeypatch.setattr(run_api, "_run_with_trace_signal", fake_run)
  52. response = await run_api.create_and_run(
  53. run_api.CreateRequest(
  54. messages=[{"role": "user", "content": "original"}],
  55. project_name="demo",
  56. )
  57. )
  58. assert response.trace_id == "project-trace"
  59. assert selected["project_name"] == "demo"
  60. assert selected["runner"] is project_runner
  61. assert selected["messages"][0]["content"] == "resolved"