## 现象与根因
风控 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 被拒 / 名单内自洽
47 lines
1.7 KiB
TypeScript
47 lines
1.7 KiB
TypeScript
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} 应可通过校验`)
|
||
}
|
||
})
|