registry/test/validator.test.js
Cheney f9f3184f98
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 31s
fix
2026-08-07 14:46:52 +08:00

111 lines
4.1 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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