46 lines
1.8 KiB
Python
46 lines
1.8 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 jira_hub.core import api, db, settings
|
|
from jira_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_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(),
|
|
"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]})
|