test_dataops_mcp_container.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import json
  2. import os
  3. import subprocess
  4. from pathlib import Path
  5. import pytest
  6. from app.core.mcp.servers import CONTEXT_TOOL_NAMES, SCHEDULING_TOOL_NAMES
  7. pytestmark = pytest.mark.integration
  8. ROOT = Path(__file__).resolve().parents[2]
  9. COMPOSE = ROOT / "deploy/docker/docker-compose.yml"
  10. def _messages():
  11. return [
  12. {
  13. "jsonrpc": "2.0",
  14. "id": 1,
  15. "method": "initialize",
  16. "params": {
  17. "protocolVersion": "2025-06-18",
  18. "capabilities": {},
  19. "clientInfo": {
  20. "name": "dataops-v53-container-test",
  21. "version": "1.0",
  22. },
  23. },
  24. },
  25. {
  26. "jsonrpc": "2.0",
  27. "method": "notifications/initialized",
  28. "params": {},
  29. },
  30. {"jsonrpc": "2.0", "id": 2, "method": "tools/list", "params": {}},
  31. ]
  32. @pytest.mark.parametrize(
  33. ("service", "expected"),
  34. [
  35. ("dataops-context-mcp", CONTEXT_TOOL_NAMES),
  36. ("dataops-scheduling-mcp", SCHEDULING_TOOL_NAMES),
  37. ],
  38. )
  39. def test_built_dataops_mcp_containers_complete_stdio_handshake(service, expected):
  40. if os.environ.get("RUN_V53_MCP_CONTAINER") != "1":
  41. pytest.skip("set RUN_V53_MCP_CONTAINER=1 for container acceptance")
  42. environment = {
  43. **os.environ,
  44. "DATAOPS_MCP_SUBJECT": "v53-container-agent",
  45. "DATAOPS_MCP_ROLES": "scheduler",
  46. "DATAOPS_MCP_BUSINESS_DOMAINS": "sales",
  47. "DATAOPS_MCP_ENVIRONMENTS": "test",
  48. "DATAOPS_MCP_CORRELATION_ID": ("01900000-0000-7000-8000-000000000053"),
  49. }
  50. result = subprocess.run(
  51. [
  52. "docker",
  53. "compose",
  54. "-f",
  55. str(COMPOSE),
  56. "--profile",
  57. "dataops-mcp",
  58. "run",
  59. "--rm",
  60. "-T",
  61. "--no-deps",
  62. service,
  63. ],
  64. cwd=ROOT,
  65. env=environment,
  66. input="\n".join(json.dumps(item) for item in _messages()) + "\n",
  67. capture_output=True,
  68. text=True,
  69. timeout=30,
  70. )
  71. assert result.returncode == 0, result.stderr
  72. responses = {
  73. item["id"]: item
  74. for line in result.stdout.splitlines()
  75. if line.strip().startswith("{")
  76. for item in [json.loads(line)]
  77. if "id" in item
  78. }
  79. assert 2 in responses, (result.stdout, result.stderr)
  80. assert {tool["name"] for tool in responses[2]["result"]["tools"]} == expected