111 lines
4.1 KiB
JavaScript
111 lines
4.1 KiB
JavaScript
/**
|
||
* 配置值校验器单元测试
|
||
* 覆盖正则范围约束(/正则/ 格式)、既有区间/枚举约束
|
||
* 运行: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);
|
||
});
|