import { describe, expect, it } from 'vitest'; import { ERROR_HTTP_STATUS, ERROR_MESSAGES, ErrorCode, httpStatusOf, isErrorCode, } from './codes.js'; describe('ErrorCode', () => { it('错误码段与工程规范 04 一致', () => { expect(ErrorCode.PARAM_INVALID).toBe(40001); expect(ErrorCode.UNAUTHENTICATED).toBe(40101); expect(ErrorCode.TOKEN_EXPIRED).toBe(40102); expect(ErrorCode.PERMISSION_DENIED).toBe(40301); expect(ErrorCode.OUT_OF_SCOPE).toBe(40302); expect(ErrorCode.NOT_FOUND).toBe(40401); expect(ErrorCode.VERSION_CONFLICT).toBe(40901); expect(ErrorCode.STATE_NOT_ALLOWED).toBe(40903); expect(ErrorCode.COMPLIANCE_BLOCKED).toBe(42202); expect(ErrorCode.COST_OVER_BUDGET).toBe(42203); expect(ErrorCode.RATE_LIMITED).toBe(42901); expect(ErrorCode.INTERNAL_ERROR).toBe(50001); expect(ErrorCode.DEPENDENCY_UNAVAILABLE).toBe(50002); expect(ErrorCode.TIMEOUT).toBe(50003); }); it('每个错误码都有 HTTP 状态与默认提示', () => { for (const code of Object.values(ErrorCode)) { expect(ERROR_HTTP_STATUS[code]).toBeGreaterThanOrEqual(400); expect(ERROR_HTTP_STATUS[code]).toBeLessThan(600); expect(ERROR_MESSAGES[code].length).toBeGreaterThan(0); } }); it('依赖不可用映射 503、超时映射 504', () => { expect(ERROR_HTTP_STATUS[ErrorCode.DEPENDENCY_UNAVAILABLE]).toBe(503); expect(ERROR_HTTP_STATUS[ErrorCode.TIMEOUT]).toBe(504); }); it('isErrorCode 只认可登记的错误码', () => { expect(isErrorCode(40001)).toBe(true); expect(isErrorCode(40099)).toBe(false); expect(isErrorCode(200)).toBe(false); }); it('httpStatusOf 从百位推导,非法码回退 500', () => { expect(httpStatusOf(42203)).toBe(422); expect(httpStatusOf(40101)).toBe(401); expect(httpStatusOf(123)).toBe(500); expect(httpStatusOf(70001)).toBe(500); }); });