test_content_adapter_boundary.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import json
  2. import re
  3. from pathlib import Path
  4. import pytest
  5. import agent
  6. from agent.tools.builtin.content.platforms import x
  7. from agent.tools.builtin.content.quality import set_post_evaluator_factory
  8. class FakeEvaluator:
  9. def evaluate_post(self, post):
  10. return {"total_score": 88, "grade": "A"}
  11. class FakeResponse:
  12. def raise_for_status(self):
  13. return None
  14. def json(self):
  15. return {
  16. "code": 0,
  17. "data": {
  18. "data": [{
  19. "body_text": "generic post",
  20. "channel_account_name": "author",
  21. "link": "https://example.test/post",
  22. }]
  23. },
  24. }
  25. class FakeClient:
  26. async def __aenter__(self):
  27. return self
  28. async def __aexit__(self, exc_type, exc, tb):
  29. return None
  30. async def post(self, *args, **kwargs):
  31. return FakeResponse()
  32. @pytest.mark.asyncio
  33. async def test_host_injected_content_evaluator_preserves_optional_scoring(monkeypatch):
  34. import agent.tools.builtin.content.transcription as transcription
  35. async def noop_probe(*args, **kwargs):
  36. return None
  37. async def no_collage(*args, **kwargs):
  38. return None
  39. monkeypatch.setattr(x.httpx, "AsyncClient", lambda *args, **kwargs: FakeClient())
  40. monkeypatch.setattr(x, "_build_tweet_collage", no_collage)
  41. monkeypatch.setattr(transcription, "probe_durations_for_posts", noop_probe)
  42. set_post_evaluator_factory(FakeEvaluator)
  43. try:
  44. result = await x.search("x", "topic", max_count=1)
  45. row = json.loads(result.output)["data"][0]
  46. assert row["quality_score"] == 88
  47. assert row["quality_grade"] == "A"
  48. finally:
  49. set_post_evaluator_factory(None)
  50. def test_installable_framework_has_no_examples_business_imports():
  51. package_root = Path(agent.__file__).resolve().parent
  52. forbidden = re.compile(
  53. r"(?:from\s+examples\b|import\s+examples\b|import_module\([^\n]*examples)"
  54. )
  55. violations = []
  56. for path in package_root.rglob("*.py"):
  57. if forbidden.search(path.read_text(encoding="utf-8")):
  58. violations.append(str(path.relative_to(package_root)))
  59. assert violations == []