test_publish_hook.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. """Publish hook stays free of supply_infra at import time."""
  2. from __future__ import annotations
  3. import importlib
  4. from pathlib import Path
  5. from supply_agent.logging.publish import (
  6. get_run_artifact_publisher,
  7. publish_run_artifacts,
  8. set_run_artifact_publisher,
  9. )
  10. def test_publish_module_does_not_import_supply_infra() -> None:
  11. source = importlib.util.find_spec("supply_agent.logging.publish")
  12. assert source is not None and source.origin is not None
  13. text = Path(source.origin).read_text(encoding="utf-8")
  14. assert "import supply_infra" not in text
  15. assert "from supply_infra" not in text
  16. def test_publish_is_noop_without_publisher() -> None:
  17. previous = get_run_artifact_publisher()
  18. try:
  19. set_run_artifact_publisher(None)
  20. class _Logger:
  21. pass
  22. assert publish_run_artifacts(_Logger()) is None # type: ignore[arg-type]
  23. finally:
  24. set_run_artifact_publisher(previous)
  25. def test_set_run_artifact_publisher_is_invoked() -> None:
  26. previous = get_run_artifact_publisher()
  27. seen: list[object] = []
  28. def _publisher(logger: object) -> str:
  29. seen.append(logger)
  30. return "https://example.com/log.html"
  31. try:
  32. set_run_artifact_publisher(_publisher)
  33. marker = object()
  34. assert publish_run_artifacts(marker) == "https://example.com/log.html" # type: ignore[arg-type]
  35. assert seen == [marker]
  36. finally:
  37. set_run_artifact_publisher(previous)
  38. def test_infra_registers_publisher_hook() -> None:
  39. previous = get_run_artifact_publisher()
  40. from supply_agent.logging.usage import get_llm_usage_recorder, set_llm_usage_recorder
  41. previous_usage = get_llm_usage_recorder()
  42. try:
  43. set_run_artifact_publisher(None)
  44. set_llm_usage_recorder(None)
  45. import supply_infra # noqa: F401
  46. from supply_infra.agent_logging.register import register_agent_logging_hooks
  47. from supply_infra.agent_logging.publish import publish_run_artifacts_to_oss
  48. from supply_infra.llm_billing.recorder import record_llm_usage_to_db
  49. register_agent_logging_hooks()
  50. assert get_run_artifact_publisher() is publish_run_artifacts_to_oss
  51. assert get_llm_usage_recorder() is record_llm_usage_to_db
  52. finally:
  53. set_run_artifact_publisher(previous)
  54. set_llm_usage_recorder(previous_usage)