fix
build-and-deploy / build-and-deploy (push) Successful in 31s

This commit is contained in:
Cheney
2026-08-07 14:46:52 +08:00
parent e3e5d5bd8f
commit f9f3184f98
9 changed files with 572 additions and 70 deletions
+110
View File
@@ -0,0 +1,110 @@
/**
* 配置值校验器单元测试
* 覆盖正则范围约束(/正则/ 格式)、既有区间/枚举约束
* 运行: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);
});