67dac0168f
Co-authored-by: Cursor <cursoragent@cursor.com>
1341 lines
30 KiB
JSON
1341 lines
30 KiB
JSON
{
|
|
"started_at": "2026-06-01T16:29:53.805397+00:00",
|
|
"base_url": "https://api.synaglobal.vip",
|
|
"phases": {
|
|
"core_api": {
|
|
"exit_code": 0,
|
|
"checks": 25,
|
|
"duration_ms": 24836.29929999006,
|
|
"stdout_tail": ""
|
|
},
|
|
"extended_api": {
|
|
"exit_code": 0,
|
|
"checks": 30,
|
|
"duration_ms": 31577.458899992052,
|
|
"stdout_tail": ""
|
|
},
|
|
"extra_api": {
|
|
"checks": 3
|
|
}
|
|
},
|
|
"features": [
|
|
{
|
|
"id": "infra_health",
|
|
"name": "健康检查 /health",
|
|
"layer": "infra",
|
|
"description": "Shell 守护与负载均衡探活",
|
|
"status": "pass",
|
|
"passed": 3,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": [
|
|
{
|
|
"name": "GET /health",
|
|
"status": "pass",
|
|
"feature_id": "infra_health",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /health",
|
|
"status": "pass",
|
|
"feature_id": "infra_health",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /health/detail",
|
|
"status": "pass",
|
|
"feature_id": "infra_health",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "infra_app",
|
|
"name": "前端静态 /app/",
|
|
"layer": "infra",
|
|
"description": "SPA 入口可访问",
|
|
"status": "pass",
|
|
"passed": 1,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": [
|
|
{
|
|
"name": "GET /app/ (SPA 入口)",
|
|
"status": "pass",
|
|
"feature_id": "infra_app",
|
|
"layer": "infra",
|
|
"message": "",
|
|
"duration_ms": 1020.7767999963835
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "auth",
|
|
"name": "认证与 JWT",
|
|
"layer": "api",
|
|
"description": "登录、me、刷新",
|
|
"status": "pass",
|
|
"passed": 4,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": [
|
|
{
|
|
"name": "POST /api/auth/login",
|
|
"status": "pass",
|
|
"feature_id": "auth",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/auth/me",
|
|
"status": "pass",
|
|
"feature_id": "auth",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "POST /api/auth/login",
|
|
"status": "pass",
|
|
"feature_id": "auth",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "POST /api/auth/webssh-token",
|
|
"status": "pass",
|
|
"feature_id": "auth",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "dashboard",
|
|
"name": "仪表盘统计",
|
|
"layer": "api",
|
|
"description": "服务器统计与概览",
|
|
"status": "pass",
|
|
"passed": 2,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": [
|
|
{
|
|
"name": "GET /api/servers/stats",
|
|
"status": "pass",
|
|
"feature_id": "dashboard",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/alert-history/stats",
|
|
"status": "pass",
|
|
"feature_id": "dashboard",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "servers",
|
|
"name": "服务器管理",
|
|
"layer": "api",
|
|
"description": "CRUD、分类、日志",
|
|
"status": "pass",
|
|
"passed": 13,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": [
|
|
{
|
|
"name": "GET /api/servers/ (pre-cleanup)",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "POST /api/servers/ (create)",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/servers/ (list)",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/servers/53",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "PUT /api/servers/53 (update)",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "DELETE /api/servers/53",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "POST /api/sync/browse (no server)",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/servers/categories",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/servers/logs",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/servers/meta/api_base_url",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/servers/",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/servers/8/logs",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "POST /api/sync/browse (real server)",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "files",
|
|
"name": "文件管理",
|
|
"layer": "api",
|
|
"description": "browse、files-capability",
|
|
"status": "pass",
|
|
"passed": 3,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": [
|
|
{
|
|
"name": "POST /api/sync/validate-source-path",
|
|
"status": "pass",
|
|
"feature_id": "files",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/servers/8/files-capability",
|
|
"status": "pass",
|
|
"feature_id": "files",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 936.1161999986507
|
|
},
|
|
{
|
|
"name": "POST /api/sync/browse /tmp",
|
|
"status": "pass",
|
|
"feature_id": "files",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 1107.4050999886822
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "terminal",
|
|
"name": "Web 终端",
|
|
"layer": "api",
|
|
"description": "快捷命令、webssh-token",
|
|
"status": "pass",
|
|
"passed": 1,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": [
|
|
{
|
|
"name": "GET /api/terminal/quick-commands",
|
|
"status": "pass",
|
|
"feature_id": "terminal",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "push_sync",
|
|
"name": "推送与同步",
|
|
"layer": "api",
|
|
"description": "validate-source、sync",
|
|
"status": "skip",
|
|
"passed": 0,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": []
|
|
},
|
|
{
|
|
"id": "scripts",
|
|
"name": "脚本库",
|
|
"layer": "api",
|
|
"description": "脚本 CRUD、执行记录",
|
|
"status": "pass",
|
|
"passed": 6,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": [
|
|
{
|
|
"name": "POST /api/scripts/ (create)",
|
|
"status": "pass",
|
|
"feature_id": "scripts",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/scripts/ (list)",
|
|
"status": "pass",
|
|
"feature_id": "scripts",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "DELETE /api/scripts/34",
|
|
"status": "pass",
|
|
"feature_id": "scripts",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/scripts/exec-config",
|
|
"status": "pass",
|
|
"feature_id": "scripts",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/scripts/executions",
|
|
"status": "pass",
|
|
"feature_id": "scripts",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/scripts/credentials",
|
|
"status": "pass",
|
|
"feature_id": "scripts",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "schedules",
|
|
"name": "调度任务",
|
|
"layer": "api",
|
|
"description": "调度 CRUD",
|
|
"status": "pass",
|
|
"passed": 4,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": [
|
|
{
|
|
"name": "POST /api/schedules/ (create)",
|
|
"status": "pass",
|
|
"feature_id": "schedules",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/schedules/ (list)",
|
|
"status": "pass",
|
|
"feature_id": "schedules",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "PUT /api/schedules/28 (disable)",
|
|
"status": "pass",
|
|
"feature_id": "schedules",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "DELETE /api/schedules/28",
|
|
"status": "pass",
|
|
"feature_id": "schedules",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "credentials",
|
|
"name": "凭据预设",
|
|
"layer": "api",
|
|
"description": "密码/SSH 密钥预设",
|
|
"status": "pass",
|
|
"passed": 4,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": [
|
|
{
|
|
"name": "POST /api/presets/ (create)",
|
|
"status": "pass",
|
|
"feature_id": "credentials",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/presets/ (list)",
|
|
"status": "pass",
|
|
"feature_id": "credentials",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "DELETE /api/presets/38",
|
|
"status": "pass",
|
|
"feature_id": "credentials",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/ssh-key-presets/",
|
|
"status": "pass",
|
|
"feature_id": "credentials",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "retries",
|
|
"name": "重试队列",
|
|
"layer": "api",
|
|
"description": "失败任务重试列表",
|
|
"status": "pass",
|
|
"passed": 1,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": [
|
|
{
|
|
"name": "GET /api/retries/ (list)",
|
|
"status": "pass",
|
|
"feature_id": "retries",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "audit",
|
|
"name": "审计日志",
|
|
"layer": "api",
|
|
"description": "操作审计分页",
|
|
"status": "pass",
|
|
"passed": 1,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": [
|
|
{
|
|
"name": "GET /api/audit/ (list)",
|
|
"status": "pass",
|
|
"feature_id": "audit",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "alerts",
|
|
"name": "告警历史",
|
|
"layer": "api",
|
|
"description": "告警列表与统计",
|
|
"status": "pass",
|
|
"passed": 1,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": [
|
|
{
|
|
"name": "GET /api/alert-history/",
|
|
"status": "pass",
|
|
"feature_id": "alerts",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "assets",
|
|
"name": "资产管理",
|
|
"layer": "api",
|
|
"description": "平台/节点/命令日志",
|
|
"status": "pass",
|
|
"passed": 8,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": [
|
|
{
|
|
"name": "GET /api/assets/platforms",
|
|
"status": "pass",
|
|
"feature_id": "assets",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/assets/nodes",
|
|
"status": "pass",
|
|
"feature_id": "assets",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/assets/nodes/tree",
|
|
"status": "pass",
|
|
"feature_id": "assets",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/assets/ssh-sessions",
|
|
"status": "pass",
|
|
"feature_id": "assets",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/assets/command-logs",
|
|
"status": "pass",
|
|
"feature_id": "assets",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "POST /api/assets/platforms (e2e)",
|
|
"status": "pass",
|
|
"feature_id": "assets",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "PUT /api/assets/platforms/7",
|
|
"status": "pass",
|
|
"feature_id": "assets",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "DELETE /api/assets/platforms/7",
|
|
"status": "pass",
|
|
"feature_id": "assets",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "search",
|
|
"name": "全局搜索",
|
|
"layer": "api",
|
|
"description": "跨资源搜索",
|
|
"status": "pass",
|
|
"passed": 1,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": [
|
|
{
|
|
"name": "GET /api/search/",
|
|
"status": "pass",
|
|
"feature_id": "search",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "settings",
|
|
"name": "系统设置",
|
|
"layer": "api",
|
|
"description": "动态配置、IP 白名单",
|
|
"status": "pass",
|
|
"passed": 5,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": [
|
|
{
|
|
"name": "GET /api/settings/ (list)",
|
|
"status": "pass",
|
|
"feature_id": "settings",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "PUT /api/settings/system_name",
|
|
"status": "pass",
|
|
"feature_id": "settings",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/settings/",
|
|
"status": "pass",
|
|
"feature_id": "settings",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/settings/ip-allowlist",
|
|
"status": "pass",
|
|
"feature_id": "settings",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/settings/bing-wallpapers",
|
|
"status": "pass",
|
|
"feature_id": "settings",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "health_detail",
|
|
"name": "健康详情",
|
|
"layer": "api",
|
|
"description": "/health/detail",
|
|
"status": "skip",
|
|
"passed": 0,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": []
|
|
},
|
|
{
|
|
"id": "ui_dashboard",
|
|
"name": "页面·仪表盘",
|
|
"layer": "ui",
|
|
"description": "路由 /",
|
|
"status": "skip",
|
|
"passed": 0,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": []
|
|
},
|
|
{
|
|
"id": "ui_servers",
|
|
"name": "页面·服务器",
|
|
"layer": "ui",
|
|
"description": "路由 /servers",
|
|
"status": "skip",
|
|
"passed": 0,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": []
|
|
},
|
|
{
|
|
"id": "ui_terminal",
|
|
"name": "页面·终端",
|
|
"layer": "ui",
|
|
"description": "路由 /terminal",
|
|
"status": "skip",
|
|
"passed": 0,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": []
|
|
},
|
|
{
|
|
"id": "ui_files",
|
|
"name": "页面·文件",
|
|
"layer": "ui",
|
|
"description": "路由 /files",
|
|
"status": "skip",
|
|
"passed": 0,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": []
|
|
},
|
|
{
|
|
"id": "ui_push",
|
|
"name": "页面·推送",
|
|
"layer": "ui",
|
|
"description": "路由 /push",
|
|
"status": "skip",
|
|
"passed": 0,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": []
|
|
},
|
|
{
|
|
"id": "ui_scripts",
|
|
"name": "页面·脚本",
|
|
"layer": "ui",
|
|
"description": "路由 /scripts",
|
|
"status": "skip",
|
|
"passed": 0,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": []
|
|
},
|
|
{
|
|
"id": "ui_credentials",
|
|
"name": "页面·凭据",
|
|
"layer": "ui",
|
|
"description": "路由 /credentials",
|
|
"status": "skip",
|
|
"passed": 0,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": []
|
|
},
|
|
{
|
|
"id": "ui_schedules",
|
|
"name": "页面·调度",
|
|
"layer": "ui",
|
|
"description": "路由 /schedules",
|
|
"status": "skip",
|
|
"passed": 0,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": []
|
|
},
|
|
{
|
|
"id": "ui_retries",
|
|
"name": "页面·重试",
|
|
"layer": "ui",
|
|
"description": "路由 /retries",
|
|
"status": "skip",
|
|
"passed": 0,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": []
|
|
},
|
|
{
|
|
"id": "ui_commands",
|
|
"name": "页面·命令日志",
|
|
"layer": "ui",
|
|
"description": "路由 /commands",
|
|
"status": "skip",
|
|
"passed": 0,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": []
|
|
},
|
|
{
|
|
"id": "ui_alerts",
|
|
"name": "页面·告警",
|
|
"layer": "ui",
|
|
"description": "路由 /alerts",
|
|
"status": "skip",
|
|
"passed": 0,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": []
|
|
},
|
|
{
|
|
"id": "ui_audit",
|
|
"name": "页面·审计",
|
|
"layer": "ui",
|
|
"description": "路由 /audit",
|
|
"status": "skip",
|
|
"passed": 0,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": []
|
|
},
|
|
{
|
|
"id": "ui_settings",
|
|
"name": "页面·设置",
|
|
"layer": "ui",
|
|
"description": "路由 /settings",
|
|
"status": "skip",
|
|
"passed": 0,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": []
|
|
},
|
|
{
|
|
"id": "ui_theme",
|
|
"name": "页面·主题与登出",
|
|
"layer": "ui",
|
|
"description": "主题切换、退出",
|
|
"status": "skip",
|
|
"passed": 0,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": []
|
|
},
|
|
{
|
|
"id": "unit_core",
|
|
"name": "单元测试(核心)",
|
|
"layer": "unit",
|
|
"description": "路径校验、权限、提权逻辑",
|
|
"status": "skip",
|
|
"passed": 0,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"checks": []
|
|
}
|
|
],
|
|
"summary": {
|
|
"passed_checks": 58,
|
|
"failed_checks": 0,
|
|
"skipped_checks": 0,
|
|
"features_pass": 16,
|
|
"features_fail": 0,
|
|
"features_total": 16,
|
|
"ok": true
|
|
},
|
|
"checks": [
|
|
{
|
|
"name": "GET /health",
|
|
"status": "pass",
|
|
"feature_id": "infra_health",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "POST /api/auth/login",
|
|
"status": "pass",
|
|
"feature_id": "auth",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/auth/me",
|
|
"status": "pass",
|
|
"feature_id": "auth",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/servers/ (pre-cleanup)",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "POST /api/servers/ (create)",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/servers/ (list)",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/servers/stats",
|
|
"status": "pass",
|
|
"feature_id": "dashboard",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/servers/53",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "PUT /api/servers/53 (update)",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "DELETE /api/servers/53",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "POST /api/scripts/ (create)",
|
|
"status": "pass",
|
|
"feature_id": "scripts",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/scripts/ (list)",
|
|
"status": "pass",
|
|
"feature_id": "scripts",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "DELETE /api/scripts/34",
|
|
"status": "pass",
|
|
"feature_id": "scripts",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "POST /api/schedules/ (create)",
|
|
"status": "pass",
|
|
"feature_id": "schedules",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/schedules/ (list)",
|
|
"status": "pass",
|
|
"feature_id": "schedules",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "PUT /api/schedules/28 (disable)",
|
|
"status": "pass",
|
|
"feature_id": "schedules",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "DELETE /api/schedules/28",
|
|
"status": "pass",
|
|
"feature_id": "schedules",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "POST /api/presets/ (create)",
|
|
"status": "pass",
|
|
"feature_id": "credentials",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/presets/ (list)",
|
|
"status": "pass",
|
|
"feature_id": "credentials",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "DELETE /api/presets/38",
|
|
"status": "pass",
|
|
"feature_id": "credentials",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/settings/ (list)",
|
|
"status": "pass",
|
|
"feature_id": "settings",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "PUT /api/settings/system_name",
|
|
"status": "pass",
|
|
"feature_id": "settings",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/audit/ (list)",
|
|
"status": "pass",
|
|
"feature_id": "audit",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/retries/ (list)",
|
|
"status": "pass",
|
|
"feature_id": "retries",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "POST /api/sync/browse (no server)",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /health",
|
|
"status": "pass",
|
|
"feature_id": "infra_health",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "POST /api/auth/login",
|
|
"status": "pass",
|
|
"feature_id": "auth",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/search/",
|
|
"status": "pass",
|
|
"feature_id": "search",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/alert-history/",
|
|
"status": "pass",
|
|
"feature_id": "alerts",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/alert-history/stats",
|
|
"status": "pass",
|
|
"feature_id": "dashboard",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/assets/platforms",
|
|
"status": "pass",
|
|
"feature_id": "assets",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/assets/nodes",
|
|
"status": "pass",
|
|
"feature_id": "assets",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/assets/nodes/tree",
|
|
"status": "pass",
|
|
"feature_id": "assets",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/assets/ssh-sessions",
|
|
"status": "pass",
|
|
"feature_id": "assets",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/assets/command-logs",
|
|
"status": "pass",
|
|
"feature_id": "assets",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "POST /api/assets/platforms (e2e)",
|
|
"status": "pass",
|
|
"feature_id": "assets",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "PUT /api/assets/platforms/7",
|
|
"status": "pass",
|
|
"feature_id": "assets",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "DELETE /api/assets/platforms/7",
|
|
"status": "pass",
|
|
"feature_id": "assets",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/servers/categories",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/servers/logs",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/servers/meta/api_base_url",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/servers/",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/servers/8/logs",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/scripts/exec-config",
|
|
"status": "pass",
|
|
"feature_id": "scripts",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/scripts/executions",
|
|
"status": "pass",
|
|
"feature_id": "scripts",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/scripts/credentials",
|
|
"status": "pass",
|
|
"feature_id": "scripts",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/ssh-key-presets/",
|
|
"status": "pass",
|
|
"feature_id": "credentials",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "POST /api/sync/validate-source-path",
|
|
"status": "pass",
|
|
"feature_id": "files",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "POST /api/sync/browse (real server)",
|
|
"status": "pass",
|
|
"feature_id": "servers",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "POST /api/auth/webssh-token",
|
|
"status": "pass",
|
|
"feature_id": "auth",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/settings/",
|
|
"status": "pass",
|
|
"feature_id": "settings",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/settings/ip-allowlist",
|
|
"status": "pass",
|
|
"feature_id": "settings",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/settings/bing-wallpapers",
|
|
"status": "pass",
|
|
"feature_id": "settings",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /health/detail",
|
|
"status": "pass",
|
|
"feature_id": "infra_health",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /api/terminal/quick-commands",
|
|
"status": "pass",
|
|
"feature_id": "terminal",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 0
|
|
},
|
|
{
|
|
"name": "GET /app/ (SPA 入口)",
|
|
"status": "pass",
|
|
"feature_id": "infra_app",
|
|
"layer": "infra",
|
|
"message": "",
|
|
"duration_ms": 1020.7767999963835
|
|
},
|
|
{
|
|
"name": "GET /api/servers/8/files-capability",
|
|
"status": "pass",
|
|
"feature_id": "files",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 936.1161999986507
|
|
},
|
|
{
|
|
"name": "POST /api/sync/browse /tmp",
|
|
"status": "pass",
|
|
"feature_id": "files",
|
|
"layer": "api",
|
|
"message": "",
|
|
"duration_ms": 1107.4050999886822
|
|
}
|
|
]
|
|
} |