import { describe, expect, it } from 'bun:test' import { ApiError } from './api' import { describeTestFailure } from './delay-test' const LINE = '[vless]Gomami.SIN Secret' describe('延迟测试失败时告诉用户什么', () => { it('超时说明是几秒内没完成', () => { // 只说「超时」,用户不知道是等了 1 秒还是 60 秒,也就不知道该不该重试 expect(describeTestFailure(LINE, new ApiError(504, {}), 5000)).toBe( `${LINE} 延迟测试超时,5 秒内没有取到测试地址`, ) }) it('找不到这个名字时指出该从订阅进去测', () => { // 订阅线路不在内核的全局出站表里,这是本项目最容易踩的一条约束 expect(describeTestFailure(LINE, new ApiError(404, { message: 'Resource not found' }))).toContain( '不在内核的出站表里', ) }) it('连接失败且内核没给具体原因时,给出能指导排查的话', () => { const generic = new ApiError(503, { message: 'An error occurred in the delay test' }) expect(describeTestFailure(LINE, generic)).toBe( `${LINE} 无法建立连接,线路可能已失效,或本机到该服务器的网络不通`, ) }) it('内核给了具体原因就原样带上', () => { const specific = new ApiError(503, { message: 'dial tcp: i/o timeout' }) expect(describeTestFailure(LINE, specific)).toBe(`${LINE} 无法建立连接:dial tcp: i/o timeout`) }) it('没见过的状态码带上状态码和内核原话', () => { expect(describeTestFailure(LINE, new ApiError(500, { message: 'boom' }))).toBe( `${LINE} 延迟测试失败(HTTP 500):boom`, ) }) it('状态码没见过且内核没说话时不留一个空冒号', () => { expect(describeTestFailure(LINE, new ApiError(500, {}))).toBe( `${LINE} 延迟测试失败(HTTP 500)`, ) }) it('不是接口错误时也要说出是什么', () => { // 网络断了、代码抛了异常,都会走到这里,不能显示成 [object Object] expect(describeTestFailure(LINE, new TypeError('Failed to fetch'))).toBe( `${LINE} 延迟测试失败:TypeError: Failed to fetch`, ) }) })