"""Эталоны внешнего поведения (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]})