/** * 配置值校验器单元测试 * 覆盖正则范围约束(/正则/ 格式)、既有区间/枚举约束 * 运行:npm test */ const test = require("node:test"); const assert = require("node:assert"); const { validateByType, validateRange } = require("../src/utils/validator"); test("1-1 正则范围:手机号格式通过", () => { const range = "/^1[3-9]\\d{9}$/"; assert.strictEqual(validateRange("13800138000", range).valid, true); }); test("1-2 正则范围:手机号格式不通过", () => { const range = "/^1[3-9]\\d{9}$/"; assert.strictEqual(validateRange("2380013800", range).valid, false); }); test("1-3 正则范围:邮箱格式", () => { const range = "/^[\\w.%+-]+@[\\w.-]+\\.[A-Za-z]{2,}$/"; assert.strictEqual(validateRange("user@example.com", range).valid, true); assert.strictEqual(validateRange("not-an-email", range).valid, false); }); test("1-4 正则范围:身份证(18 位)", () => { const range = "/^\\d{17}[\\dXx]$/"; assert.strictEqual(validateRange("110101199003071234", range).valid, true); assert.strictEqual(validateRange("11010119900307", range).valid, false); }); test("1-5 正则范围:支持修饰符(i 忽略大小写)", () => { const range = "/^[A-Z]+$/i"; assert.strictEqual(validateRange("abc", range).valid, true); assert.strictEqual(validateRange("abc1", range).valid, false); }); test("1-6 正则范围:无效正则返回错误提示", () => { const res = validateRange("abc", "/[/"); assert.strictEqual(res.valid, false); assert.ok(res.message.includes("正则表达式无效")); }); test("1-7 正则格式:缺少结尾斜杠明确报格式错误(不静默放行)", () => { const res = validateRange("abc", "/abc"); assert.strictEqual(res.valid, false); assert.ok(res.message.includes("正则格式无效")); }); test("1-8 正则格式:pattern 中未转义的斜杠报格式错误", () => { const res = validateRange("a/b", "/a/b/i"); assert.strictEqual(res.valid, false); assert.ok(res.message.includes("正则格式无效")); }); test("1-9 正则格式:转义斜杠可用", () => { const res = validateRange("a/b", "/a\\/b/"); assert.strictEqual(res.valid, true); }); test("1-10 正则范围:g 标志 test 多次结果稳定", () => { const range = "/^abc$/g"; assert.strictEqual(validateRange("abc", range).valid, true); assert.strictEqual(validateRange("abc", range).valid, true); }); test("1-11 空值范围不做校验", () => { assert.strictEqual(validateRange("anything", "").valid, true); assert.strictEqual(validateRange("anything", " ").valid, true); }); test("1-12 正则格式:URL 预设(含转义斜杠)可正常校验", () => { const range = "/^https?:\\/\\/[\\w.-]+(?:\\.[a-zA-Z]{2,})?(?:\\/[^\\s]*)?$/"; assert.strictEqual(validateRange("https://example.com/path", range).valid, true); assert.strictEqual(validateRange("not a url", range).valid, false); }); test("1-13 正则格式:非法 flags 报错", () => { const res = validateRange("abc", "/^abc$/q"); assert.strictEqual(res.valid, false); assert.ok(res.message.includes("正则表达式无效") || res.message.includes("正则格式无效")); }); test("3-3 类型校验:number 拒绝 null", () => { assert.strictEqual(validateByType(null, "number").valid, false); }); test("2-1 区间范围仍生效", () => { assert.strictEqual(validateRange("50", "1-100").valid, true); assert.strictEqual(validateRange("150", "1-100").valid, false); }); test("2-2 区间下限大于上限时报错", () => { const res = validateRange("5", "10-1"); assert.strictEqual(res.valid, false); assert.ok(res.message.includes("大于上限")); }); test("2-3 枚举范围仍生效", () => { assert.strictEqual(validateRange("A", "枚举: A,B,C").valid, true); assert.strictEqual(validateRange("D", "枚举: A,B,C").valid, false); }); test("3-1 类型校验:number 拒绝非数字", () => { assert.strictEqual(validateByType("abc", "number").valid, false); }); test("3-2 类型校验:number 拒绝空串(不再当作 0 放行)", () => { assert.strictEqual(validateByType("", "number").valid, false); });