test_dataops_mcp_container.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import os
  2. from pathlib import Path
  3. import anyio
  4. import pytest
  5. from mcp import ClientSession
  6. from mcp.client.stdio import StdioServerParameters, stdio_client
  7. from app.core.mcp.servers import CONTEXT_TOOL_NAMES, SCHEDULING_TOOL_NAMES
  8. pytestmark = pytest.mark.integration
  9. ROOT = Path(__file__).resolve().parents[2]
  10. COMPOSE = ROOT / "deploy/docker/docker-compose.yml"
  11. @pytest.mark.parametrize(
  12. ("service", "expected"),
  13. [
  14. ("dataops-context-mcp", CONTEXT_TOOL_NAMES),
  15. ("dataops-scheduling-mcp", SCHEDULING_TOOL_NAMES),
  16. ],
  17. )
  18. def test_built_dataops_mcp_containers_complete_stdio_handshake(service, expected):
  19. if os.environ.get("RUN_V53_MCP_CONTAINER") != "1":
  20. pytest.skip("set RUN_V53_MCP_CONTAINER=1 for container acceptance")
  21. environment = {
  22. **os.environ,
  23. "DATAOPS_MCP_SUBJECT": "v53-container-agent",
  24. "DATAOPS_MCP_ROLES": "scheduler",
  25. "DATAOPS_MCP_BUSINESS_DOMAINS": "sales",
  26. "DATAOPS_MCP_ENVIRONMENTS": "test",
  27. "DATAOPS_MCP_CORRELATION_ID": ("01900000-0000-7000-8000-000000000053"),
  28. }
  29. async def list_tools():
  30. parameters = StdioServerParameters(
  31. command="docker",
  32. args=[
  33. "compose",
  34. "-f",
  35. str(COMPOSE),
  36. "--profile",
  37. "dataops-mcp",
  38. "run",
  39. "--rm",
  40. "-T",
  41. "--no-deps",
  42. service,
  43. ],
  44. cwd=str(ROOT),
  45. env=environment,
  46. )
  47. with anyio.fail_after(30):
  48. async with (
  49. stdio_client(parameters) as (read_stream, write_stream),
  50. ClientSession(read_stream, write_stream) as session,
  51. ):
  52. await session.initialize()
  53. response = await session.list_tools()
  54. return {tool.name for tool in response.tools}
  55. assert anyio.run(list_tools) == expected