按审查结论重构:先补测试网,再搬代码
顺序是刻意的。前端一行测试都没有,直接挪代码挪坏了 bun test 不会红,所以先把纯逻辑 抽到能被测试的位置并补上用例,最后才动组件。测试从 37 条增加到 77 条。 抽出来的四块: - shared/outbound-chain.ts 「这个端口现在走哪条线」的链路解析,带防环,9 条测试 - web/delay-test.ts 延迟测试失败时说什么,6 个分支原本一条测试都没有 - web/runtime.ts 运行时状态的模块级单例,照 prefs.ts 已有的模式 - web/components/InboundList.vue 入站列表 出站的文本原本散成四份(读一份、显示一份、写回一份、表单又抄一份),加一种出站模式 要同时改四处,漏一个就是显示与写回不一致。合并成 OUTBOUND_PRESETS 一张表。 给认证和透传白名单补了 20 条测试。两者都是安全边界、都是纯函数、都不需要内核在线, 之前却只靠需要活内核的冒烟脚本间接覆盖。其中「形似但不是健康检查的路径」几条确认了 正则没写松。 另外:配置快照不再把整份文件原文下发(前端从不读,白白让响应体积翻倍); yaml-cosmetics 的测试改走生产路径,之前它自己拼了一遍三步流程,落盘链路漏掉其中一步 测试照样会绿。
This commit is contained in:
@@ -6,7 +6,10 @@ import {
|
||||
collectInbounds,
|
||||
collectOutboundNames,
|
||||
fallbackTarget,
|
||||
isUnsetOutbound,
|
||||
outboundLabel,
|
||||
outboundToProxyField,
|
||||
OUTBOUND_PRESETS,
|
||||
resolveDestination,
|
||||
} from './inbounds.ts'
|
||||
|
||||
@@ -145,3 +148,34 @@ describe('流量最终去哪', () => {
|
||||
expect(fallbackTarget({})).toBeNull()
|
||||
})
|
||||
})
|
||||
|
||||
describe('出站预设表是读写显示三者的唯一约定', () => {
|
||||
it('每种预设的字段值和标签一一对应', () => {
|
||||
expect(OUTBOUND_PRESETS.map((p) => [p.mode.kind, p.field, p.label])).toEqual([
|
||||
['rules', undefined, 'RULE'],
|
||||
['direct', 'DIRECT', 'DIRECT'],
|
||||
['global', 'GLOBAL', 'GLOBAL'],
|
||||
])
|
||||
})
|
||||
|
||||
it('从配置读出来再写回去,值不变', () => {
|
||||
// 这条是防止「显示的」和「写进文件的」跑偏:任何一种模式转一圈都要回到原值
|
||||
for (const preset of OUTBOUND_PRESETS) {
|
||||
expect(outboundToProxyField(preset.mode)).toBe(preset.field)
|
||||
}
|
||||
expect(outboundToProxyField({ kind: 'named', name: 'AUTO' })).toBe('AUTO')
|
||||
})
|
||||
|
||||
it('界面上的名字用配置里的原词', () => {
|
||||
expect(outboundLabel({ kind: 'rules' })).toBe('RULE')
|
||||
expect(outboundLabel({ kind: 'direct' })).toBe('DIRECT')
|
||||
expect(outboundLabel({ kind: 'global' })).toBe('GLOBAL')
|
||||
expect(outboundLabel({ kind: 'named', name: '固定-Gomami' })).toBe('固定-Gomami')
|
||||
})
|
||||
|
||||
it('只有 RULE 算「没明确指定」,界面据此弱化显示', () => {
|
||||
expect(isUnsetOutbound({ kind: 'rules' })).toBe(true)
|
||||
expect(isUnsetOutbound({ kind: 'direct' })).toBe(false)
|
||||
expect(isUnsetOutbound({ kind: 'named', name: 'AUTO' })).toBe(false)
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user