""" routes/mock_routes.py — служебные эндпоинты /_mock/*. Blueprint "mock" с префиксом /api/v1/svc/_mock. POST /reset — полный сброс состояния (для тестов) GET /state — отладочный дамп instances + operations GET /services — отладочный список загруженных сервисов POST /delay/ — изменить MOCK_OP_DELAY на лету (не перезапуская сервер) """ from flask import Blueprint, jsonify import mock_state from config.loader import SERVICES, DELAY as _DELAY import config.loader as _cfg # для модификации модульной переменной DELAY bp = Blueprint("mock", __name__, url_prefix="/api/v1/svc/_mock") @bp.route("/reset", methods=["POST"]) def mock_reset(): """POST /api/v1/svc/_mock/reset — полный сброс состояния. Удаляет ВСЕ инстансы, операции и параметры из MockState. Используется в тестах (autouse fixture) для изоляции тестов друг от друга. """ mock_state.state.reset() return jsonify({"reset": "ok"}) @bp.route("/state", methods=["GET"]) def mock_state_view(): """GET /api/v1/svc/_mock/state — отладочный дамп состояния. Возвращает {instances: {uid: {instanceUid, displayName, status, serviceId}}, operations: {uid: {instanceOperationUid, instanceUid, operation, dtFinish, isSuccessful}}}. Полезно для отладки тестов: «какие инстансы сейчас живы?», «завершилась ли операция?». НЕ для production-использования. """ st = mock_state.state return jsonify({ "instances": { uid: { "instanceUid": inst["instanceUid"], "displayName": inst["displayName"], "status": inst["status"], "serviceId": inst["serviceId"], } for uid, inst in st.instances.items() }, "operations": { uid: { "instanceOperationUid": op["instanceOperationUid"], "instanceUid": op["instanceUid"], "operation": op["operation"], "dtFinish": op["dtFinish"], "isSuccessful": op["isSuccessful"], } for uid, op in st.operations.items() }, }) @bp.route("/services", methods=["GET"]) def mock_services(): """GET /api/v1/svc/_mock/services — отладочный список сервисов. Возвращает {count: N, services: {svcId: {name, displayName, operations, params}}}. Полезно чтобы быстро проверить что все 37+ сервисов загрузились, не дёргая реальный /api/v1/svc/services. """ result = {} for svc_id, svc_def in SERVICES.items(): result[str(svc_id)] = { "name": svc_def.get("name", ""), "displayName": svc_def.get("service_display_name", ""), "operations": len(svc_def.get("operations", [])), "params": len(svc_def.get("cfsParams", [])), } return jsonify({"count": len(result), "services": result}) @bp.route("/delay/", methods=["POST"]) def mock_set_delay(seconds): """POST /api/v1/svc/_mock/delay/{s} — изменить задержку операции. Меняет config.loader.DELAY «на лету», без перезапуска сервера. Полезно в тестах: установить delay=0 для мгновенных операций, или delay=5 чтобы проверить таймауты поллинга. ВАЖНО: меняет модульную переменную config.loader.DELAY, которую читает routes/run.py при каждом вызове /run. """ _cfg.DELAY = seconds return jsonify({"delay": _cfg.DELAY})