state-hub/tests/test_mcp_legacy_deprecation.py
tegwick ef62cb3872 STATE-WP-0070 T03: remove legacy workstream MCP aliases
Meter-gated removal (7 consecutive zero-usage windows reached). Deletes:
- MCP tools: create_workstream, list_workstreams, update_workstream,
  update_workstream_status
- MCP resource: state://workstreams/{topic_slug}
- Dead helpers: _LEGACY_MCP_* maps, _legacy_mcp_deprecation,
  _meter_legacy_mcp, _attach_legacy_deprecation, _update_workplan_legacy_impl

TOOLS.md keeps a retired→preferred migration map (per backlog). Removed the
now-dead STATEHUB_MCP_LEGACY_METER guard in conftest. Retargeted the
create_workplan error-skip test to the preferred tool; dropped alias-only tests.

Staged on branch state-wp-0070-legacy-retirement — do not merge until the 7th
documented zero-usage window is captured.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 09:29:12 +02:00

64 lines
No EOL
2 KiB
Python

from __future__ import annotations
import json
import mcp_server.server as server
def test_normalize_progress_body_prefers_workplan_id_only() -> None:
body = server._normalize_progress_body({
"workplan_id": "wp-1",
"workstream_id": "wp-1",
"event_type": "note",
"summary": "test",
})
assert body == {
"workplan_id": "wp-1",
"event_type": "note",
"summary": "test",
}
legacy_only = server._normalize_progress_body({
"workstream_id": "wp-legacy",
"event_type": "note",
"summary": "legacy",
})
assert legacy_only["workplan_id"] == "wp-legacy"
assert "workstream_id" not in legacy_only
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_workplans": [
{
"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()