Repository navigation
Expand file tree
/
Copy pathtest_cli.py
More file actions
96 lines (66 loc) · 3.01 KB
/
Copy pathtest_cli.py
File metadata and controls
96 lines (66 loc) · 3.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
"""Фаза 5 — адаптеры: конфиги клиентов + CLI wrapper (план §4)."""
from __future__ import annotations
import json
from pathlib import Path
import src.cli as cli
ADAPTERS = Path(__file__).resolve().parent.parent / "adapters" / "clients"
def _load(name: str):
return json.loads((ADAPTERS / name).read_text(encoding="utf-8"))
# ── конфиги клиентов ─────────────────────────────────────────────────────────
def test_claude_config_parse():
c = _load("claude.code.mcp.json")
assert "mscodebase" in c["mcpServers"]
assert "mscodebase-remote" in c["mcpServers"]
def test_vscode_config_parse():
c = _load("vscode.mcp.json")
assert "mscodebase" in c["servers"]
assert "mscodebase-remote" in c["servers"]
def test_stdio_ref_valid_entrypoint():
c = _load("claude.code.mcp.json")["mcpServers"]["mscodebase"]
assert c["type"] == "stdio"
assert c["args"] == ["-m", "src.main"]
assert "PYTHONPATH" in c["env"]
def test_remote_ref_mcp_endpoint():
for name in ("claude.code.mcp.json", "vscode.mcp.json"):
servers = _load(name)["mcpServers" if "claude" in name else "servers"]
r = servers["mscodebase-remote"]
assert r["type"] == "http"
assert r["url"].endswith("/mcp")
assert "Authorization" in r["headers"]
# ── CLI wrapper (прямой вызов tool-классов без MCP) ─────────────────────────
def test_cli_unknown_tool(tmp_path, capsys):
rc = cli.main(["no_such_tool", "{}"])
assert rc == 2
assert "unsupported CLI tool" in capsys.readouterr().err
def test_cli_bad_args(tmp_path, capsys):
rc = cli.main(["get_task_status", "not-json"])
assert rc == 2
assert "bad arguments" in capsys.readouterr().err
def test_cli_dispatch_ok(monkeypatch, capsys):
class FakeServices:
def shutdown(self):
return None
class FakeTool:
def __init__(self, services):
self.services = services
def execute(self, **kw):
return {"echo": kw}
monkeypatch.setattr(cli, "create_service_collection", lambda root: FakeServices())
monkeypatch.setattr(cli, "core_tool_allowlist", lambda: {"fake_tool": FakeTool})
rc = cli.main(["fake_tool", '{"a": 1}'])
out = json.loads(capsys.readouterr().out)
assert rc == 0
assert out["ok"] is True
assert out["result"] == {"echo": {"a": 1}}
def test_cli_dispatch_tool_error(monkeypatch, capsys):
class FakeTool:
def __init__(self, services):
pass
def execute(self, **kw):
raise ValueError("boom")
monkeypatch.setattr(cli, "create_service_collection", lambda root: object())
monkeypatch.setattr(cli, "core_tool_allowlist", lambda: {"fake_tool": FakeTool})
rc = cli.main(["fake_tool", "{}"])
err = capsys.readouterr().err
assert rc == 1
assert "boom" in err