state-hub/tests/test_mcp_legacy_deprecation.py
tegwick d431e69c04
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 3s
feat(mcp): add legacy workstream alias deprecation warnings (STATE-WP-0069 T03)
Legacy MCP tools and the workstreams resource now return _deprecation payloads
pointing to workplan-named replacements. get_domain_summary uses workplan-first
prose and exposes a workplans key alongside the legacy workstreams field.
2026-07-08 16:35:42 +02:00

58 lines
No EOL
2 KiB
Python

from __future__ import annotations
import json
import mcp_server.server as server
def test_legacy_mcp_deprecation_payload_names_replacement() -> None:
payload = server._legacy_mcp_deprecation(tool="create_workstream")
assert payload["replacement"] == "create_workplan"
assert payload["deprecated"] == "true"
def test_attach_legacy_deprecation_preserves_success_payload() -> None:
raw = server._attach_legacy_deprecation(
"update_workstream_status",
json.dumps({"id": "wp-1", "status": "active"}),
)
body = json.loads(raw)
assert body["id"] == "wp-1"
assert body["_deprecation"]["tool"] == "update_workstream_status"
def _fake_get(path: str, params: dict | None = None):
if path == "/topics":
return [{"id": "topic-1", "domain_slug": "infotech", "title": "Infotech"}]
if path == "/state/summary":
return {
"open_workstreams": [
{
"id": "wp-1",
"topic_id": "topic-1",
"title": "Goalless",
"repo_id": "repo-1",
}
]
}
if path == "/decisions":
return []
if path == "/progress":
return []
if path == "/repos":
return [{"id": "repo-1", "slug": "demo-repo", "domain_slug": "infotech"}]
if path == "/repo-goals":
return [{"id": "goal-1", "title": "Ship it", "description": "d", "priority": "high"}]
if path == "/capability-catalog/":
return []
return []
def test_get_domain_summary_goal_guidance_is_workplan_first(monkeypatch) -> None:
monkeypatch.setattr(server, "_get", lambda path, params=None: _fake_get(path, params))
payload = json.loads(server.get_domain_summary("infotech"))
assert "workplans" in payload
assert payload["workstreams"] == payload["workplans"]
action = payload["goal_guidance"]["needs_workplan"][0]["action"]
assert "workplan" in action.lower()
assert "workstream is linked" not in action.lower()