sdlc-hub/tests/test_baseline.py
Andrey Epifancev a88bb1e6e8 refactor(sdlc-rename): пакет sdlc_hub, CLI sdlc-hub, каталог данных sdlc-hub
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 11:27:17 +04:00

53 lines
2.1 KiB
Python

"""Эталоны внешнего поведения (golden): MCP-инструменты, маршруты API, настройки, схема базы.
Перестройка на модули обязана их сохранить. Запись эталонов: BASELINE_WRITE=1 uv run pytest tests/test_baseline.py."""
import asyncio
import json
import os
from pathlib import Path
from sdlc_hub.core import api, db, settings
from sdlc_hub.modules.jira import mcp as jira_mcp
FIXTURES = Path(__file__).parent / "fixtures" / "baseline"
def _check(name, snapshot):
path = FIXTURES / f"{name}.expected.json"
text = json.dumps(snapshot, ensure_ascii=False, indent=2, sort_keys=True) + "\n"
if os.environ.get("BASELINE_WRITE") == "1":
FIXTURES.mkdir(parents=True, exist_ok=True)
path.write_text(text, encoding="utf-8")
assert path.read_text(encoding="utf-8") == text
def test_mcp_tools():
tools = asyncio.run(jira_mcp.mcp.list_tools())
_check("mcp_tools", [{"name": t.name, "description": t.description, "inputSchema": t.inputSchema}
for t in tools])
def test_mcp_wiki_tools():
from sdlc_hub.modules.wiki import mcp as wiki_mcp
tools = asyncio.run(wiki_mcp.mcp.list_tools())
_check("mcp_wiki_tools", [{"name": t.name, "description": t.description, "inputSchema": t.inputSchema}
for t in tools])
def test_routes():
rows = [[method, pattern, scope, fn.__name__] for method, pattern, fn, scope in api.ROUTES]
_check("routes", sorted(rows, key=lambda r: (r[1], r[0])))
def test_settings():
_check("settings", {"defaults": settings.defaults(), "agent_keys": settings.agent_keys("jira"),
"protected": sorted(settings.PROTECTED)})
def test_schema(tmp_path):
conn = db.connect(tmp_path / "hub.sqlite")
rows = conn.execute("SELECT type, name, sql FROM sqlite_master WHERE name NOT LIKE 'sqlite_%' "
"ORDER BY type, name").fetchall()
version = db._schema_version(conn)
conn.close()
_check("schema", {"schema_version": version, "objects": [[r[0], r[1], r[2]] for r in rows]})