fix(admin): /health 请求被误加 /api/v1 前缀,健康状态永远「系统异常」
build_url 对所有路径强制加 /api/v1,但后端 /health 与 /health/ready 挂在根路径(app.py,与 compose healthcheck 一致)→ 前端请求 /api/v1/health 404 → fetchHealth 吞错返回 status=unknown → 右上角/监控页永远「系统异常」。 - build_url 对 /health 与 /health/* 豁免前缀 - http.test.ts 补 URL 豁免用例(该测试此前因 ApiError 参数属性不被 strip-types 支持而完全无法运行,顺手改为显式赋值使基建可用)
This commit is contained in:
@@ -21,8 +21,10 @@ globalThis.window = {
|
||||
}
|
||||
|
||||
// 捕获每次 fetch 的入参供断言
|
||||
let lastUrl = ''
|
||||
let lastInit: RequestInit | undefined
|
||||
globalThis.fetch = async (_url: string, init?: RequestInit) => {
|
||||
globalThis.fetch = async (url: string | URL | Request, init?: RequestInit) => {
|
||||
lastUrl = String(url)
|
||||
lastInit = init
|
||||
return new Response(JSON.stringify({ ok: true }), { status: 200, headers: { 'content-type': 'application/json' } })
|
||||
}
|
||||
@@ -63,3 +65,19 @@ test('DELETE: method=DELETE, 无 body, 无 Content-Type', async () => {
|
||||
assert.equal(lastInit?.body, undefined)
|
||||
assert.equal((lastInit?.headers as Record<string, string>)?.['Content-Type'], undefined)
|
||||
})
|
||||
|
||||
// ── 健康检查豁免: /health* 挂在根路径(后端 app.py 不在 /api/v1 下),
|
||||
// 加前缀会 404 → 管理后台右上角永远「系统异常」 ──
|
||||
test('build_url: /health 与 /health/ready 不加 /api/v1 前缀', async () => {
|
||||
await http.get('/health')
|
||||
assert.equal(lastUrl, '/health')
|
||||
await http.get('/health/ready')
|
||||
assert.equal(lastUrl, '/health/ready')
|
||||
})
|
||||
|
||||
test('build_url: 常规 API 路径仍统一加 /api/v1', async () => {
|
||||
await http.get('/admin/stats')
|
||||
assert.equal(lastUrl, '/api/v1/admin/stats')
|
||||
await http.get('/matches')
|
||||
assert.equal(lastUrl, '/api/v1/matches')
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user