| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- import json
- import os
- import subprocess
- from pathlib import Path
- import pytest
- from app.core.mcp.servers import CONTEXT_TOOL_NAMES, SCHEDULING_TOOL_NAMES
- pytestmark = pytest.mark.integration
- ROOT = Path(__file__).resolve().parents[2]
- COMPOSE = ROOT / "deploy/docker/docker-compose.yml"
- def _messages():
- return [
- {
- "jsonrpc": "2.0",
- "id": 1,
- "method": "initialize",
- "params": {
- "protocolVersion": "2025-06-18",
- "capabilities": {},
- "clientInfo": {
- "name": "dataops-v53-container-test",
- "version": "1.0",
- },
- },
- },
- {
- "jsonrpc": "2.0",
- "method": "notifications/initialized",
- "params": {},
- },
- {"jsonrpc": "2.0", "id": 2, "method": "tools/list", "params": {}},
- ]
- @pytest.mark.parametrize(
- ("service", "expected"),
- [
- ("dataops-context-mcp", CONTEXT_TOOL_NAMES),
- ("dataops-scheduling-mcp", SCHEDULING_TOOL_NAMES),
- ],
- )
- def test_built_dataops_mcp_containers_complete_stdio_handshake(service, expected):
- if os.environ.get("RUN_V53_MCP_CONTAINER") != "1":
- pytest.skip("set RUN_V53_MCP_CONTAINER=1 for container acceptance")
- environment = {
- **os.environ,
- "DATAOPS_MCP_SUBJECT": "v53-container-agent",
- "DATAOPS_MCP_ROLES": "scheduler",
- "DATAOPS_MCP_BUSINESS_DOMAINS": "sales",
- "DATAOPS_MCP_ENVIRONMENTS": "test",
- "DATAOPS_MCP_CORRELATION_ID": ("01900000-0000-7000-8000-000000000053"),
- }
- result = subprocess.run(
- [
- "docker",
- "compose",
- "-f",
- str(COMPOSE),
- "--profile",
- "dataops-mcp",
- "run",
- "--rm",
- "-T",
- "--no-deps",
- service,
- ],
- cwd=ROOT,
- env=environment,
- input="\n".join(json.dumps(item) for item in _messages()) + "\n",
- capture_output=True,
- text=True,
- timeout=30,
- )
- assert result.returncode == 0, result.stderr
- responses = {
- item["id"]: item
- for line in result.stdout.splitlines()
- if line.strip().startswith("{")
- for item in [json.loads(line)]
- if "id" in item
- }
- assert 2 in responses, (result.stdout, result.stderr)
- assert {tool["name"] for tool in responses[2]["result"]["tools"]} == expected
|