Files
order_site/apps/frontend/tests/admin-worker-platform-tabs.test.ts
T
yml2213 e0d7398d37 fix(admin): 风控 tab 点了没反应 —— tab key 白名单漏登记,并合并为唯一来源
## 现象与根因

风控 tab 渲染得出来、但怎么点都切不过去,且不报错、不白屏。

原因是 tab key 名单在同一文件里写了两遍:
  - isWorkerPlatformTab()(changeTab 的守卫)
  - loadActiveTabPreference()(localStorage 旧选择校验)
新增风控 tab 时只把 'risk-control' 加了 TAB_QUERY_KEYS 与 Tabs items,漏了上面两处,
于是 changeTab('risk-control') 在第一行 `if (!isWorkerPlatformTab(nextTab)) return` 就返回了。

这类漏改没有任何报错信号,只能靠点一下才发现——上一轮的验证只查了构建产物里
是否含面板代码,没有验证 tab 真的能切换,所以没拦住。

## 修法

把名单抽到 utils/admin-worker-platform-tabs.ts,只保留唯一一份
WORKER_PLATFORM_TAB_KEYS;查询缓存映射与「只登记缓存但不是 tab」的例外(hall-config,
它是「杂项配置」tab 内部的区块)也一并显式化,避免下次再靠人记。

## 回归测试

新增 tests/admin-worker-platform-tabs.test.ts(5 个用例):
  - 风控 tab 必须被 isWorkerPlatformTab 接受
  - 每个登记了切页缓存的 tab 都必须在合法 tab 名单里 ← 正是本次漏改的形态
  - 名单无重复项 / 非法 key 被拒 / 名单内自洽
2026-10-02 17:13:59 +08:00

47 lines
1.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import assert from 'node:assert/strict'
import test from 'node:test'
import {
WORKER_PLATFORM_NON_TAB_QUERY_KEYS,
WORKER_PLATFORM_TAB_KEYS,
WORKER_PLATFORM_TAB_QUERY_KEYS,
isWorkerPlatformTab,
} from '../src/utils/admin-worker-platform-tabs.ts'
/**
* 这组用例守住一个「不报错、不白屏,只是点了没反应」的坑:
* changeTab() 在 isWorkerPlatformTab() 返回 false 时直接 return,
* 于是 tab 渲染得出来却永远切不过去。生产上风控 tab 就这样失效过一次。
*/
test('风控 tab 必须被 isWorkerPlatformTab 接受(漏登记会导致点击无反应)', () => {
assert.equal(isWorkerPlatformTab('risk-control'), true)
})
test('每个登记了切页缓存的 tab 都必须在合法 tab 名单里', () => {
const nonTabs = new Set(WORKER_PLATFORM_NON_TAB_QUERY_KEYS)
for (const key of Object.keys(WORKER_PLATFORM_TAB_QUERY_KEYS)) {
if (nonTabs.has(key)) continue
assert.ok(
isWorkerPlatformTab(key),
`"${key}" 登记了 WORKER_PLATFORM_TAB_QUERY_KEYS 却不在 WORKER_PLATFORM_TAB_KEYS 中 —— changeTab() 会直接 return,表现为点了没反应`,
)
}
})
test('合法 tab 名单无重复项', () => {
assert.equal(new Set(WORKER_PLATFORM_TAB_KEYS).size, WORKER_PLATFORM_TAB_KEYS.length)
})
test('非法 tab key 一律被拒(含 null 与空串)', () => {
for (const bad of ['', null, 'nope', 'riskcontrol', 'risk_control', 'hall-config']) {
assert.equal(isWorkerPlatformTab(bad), false, `${String(bad)} 不应被当作合法 tab`)
}
})
test('名单里的每个 key 都能被自身校验通过', () => {
for (const key of WORKER_PLATFORM_TAB_KEYS) {
assert.equal(isWorkerPlatformTab(key), true, `${key} 应可通过校验`)
}
})