Files

134 lines
4.5 KiB
JavaScript
Raw Permalink Normal View History

2026-06-03 14:15:55 +08:00
const { sanitizeInt, sanitizeFloat, sanitizeString } = require('../utils/validators')
describe('sanitizeInt', () => {
it('应返回有效的整数', () => {
expect(sanitizeInt(42)).toBe(42)
expect(sanitizeInt('42')).toBe(42)
expect(sanitizeInt(0)).toBe(0)
expect(sanitizeInt(-5)).toBe(-5)
})
it('应在输入为 null/undefined/空字符串时返回 fallback', () => {
expect(sanitizeInt(null, 0)).toBe(0)
expect(sanitizeInt(undefined, 10)).toBe(10)
expect(sanitizeInt('', 99)).toBe(99)
})
it('应在输入为 null/undefined/空字符串且无 fallback 时返回 undefined', () => {
expect(sanitizeInt(null)).toBeUndefined()
expect(sanitizeInt(undefined)).toBeUndefined()
expect(sanitizeInt('')).toBeUndefined()
})
it('应在无法解析为整数时返回 null', () => {
expect(sanitizeInt('abc')).toBeNull()
expect(sanitizeInt('12.5')).toBe(12) // parseInt 截断小数
expect(sanitizeInt({})).toBeNull()
expect(sanitizeInt(NaN)).toBeNull()
})
it('应在值小于 min 时返回 null', () => {
expect(sanitizeInt(3, undefined, 5)).toBeNull()
expect(sanitizeInt(5, undefined, 5)).toBe(5)
expect(sanitizeInt(6, undefined, 5)).toBe(6)
})
it('应在值大于 max 时返回 null', () => {
expect(sanitizeInt(11, undefined, undefined, 10)).toBeNull()
expect(sanitizeInt(10, undefined, undefined, 10)).toBe(10)
expect(sanitizeInt(9, undefined, undefined, 10)).toBe(9)
})
it('应同时检查 min 和 max', () => {
expect(sanitizeInt(5, undefined, 1, 10)).toBe(5)
expect(sanitizeInt(0, undefined, 1, 10)).toBeNull()
expect(sanitizeInt(11, undefined, 1, 10)).toBeNull()
})
it('应处理字符串形式的数字', () => {
expect(sanitizeInt('100')).toBe(100)
expect(sanitizeInt(' 50 ')).toBe(50)
})
})
describe('sanitizeFloat', () => {
it('应返回有效的浮点数', () => {
expect(sanitizeFloat(3.14)).toBeCloseTo(3.14)
expect(sanitizeFloat('2.5')).toBeCloseTo(2.5)
expect(sanitizeFloat(0)).toBe(0)
expect(sanitizeFloat(-1.5)).toBeCloseTo(-1.5)
})
it('应在输入为 null/undefined/空字符串时返回 fallback', () => {
expect(sanitizeFloat(null, 1.0)).toBeCloseTo(1.0)
expect(sanitizeFloat(undefined, 2.5)).toBeCloseTo(2.5)
expect(sanitizeFloat('', 0.0)).toBeCloseTo(0.0)
})
it('应在输入为 null/undefined/空字符串且无 fallback 时返回 undefined', () => {
expect(sanitizeFloat(null)).toBeUndefined()
expect(sanitizeFloat(undefined)).toBeUndefined()
expect(sanitizeFloat('')).toBeUndefined()
})
it('应在无法解析为浮点数时返回 null', () => {
expect(sanitizeFloat('abc')).toBeNull()
expect(sanitizeFloat({})).toBeNull()
expect(sanitizeFloat(NaN)).toBeNull()
})
it('应在值小于 min 时返回 null', () => {
expect(sanitizeFloat(0.5, undefined, 1.0)).toBeNull()
expect(sanitizeFloat(1.0, undefined, 1.0)).toBeCloseTo(1.0)
})
it('应在值大于 max 时返回 null', () => {
expect(sanitizeFloat(11.0, undefined, undefined, 10.0)).toBeNull()
expect(sanitizeFloat(10.0, undefined, undefined, 10.0)).toBeCloseTo(10.0)
})
it('应同时检查 min 和 max', () => {
expect(sanitizeFloat(5.5, undefined, 1.0, 10.0)).toBeCloseTo(5.5)
expect(sanitizeFloat(0.5, undefined, 1.0, 10.0)).toBeNull()
expect(sanitizeFloat(10.5, undefined, 1.0, 10.0)).toBeNull()
})
})
describe('sanitizeString', () => {
it('应返回有效的字符串', () => {
expect(sanitizeString('hello')).toBe('hello')
expect(sanitizeString('你好世界')).toBe('你好世界')
})
it('应在输入为 null/undefined 时返回空字符串', () => {
expect(sanitizeString(null)).toBe('')
expect(sanitizeString(undefined)).toBe('')
})
it('应将非字符串类型转为字符串', () => {
expect(sanitizeString(123)).toBe('123')
expect(sanitizeString(true)).toBe('true')
})
it('应截断超过最大长度的字符串', () => {
const longStr = 'a'.repeat(300)
expect(sanitizeString(longStr).length).toBe(255)
expect(sanitizeString(longStr)).toBe('a'.repeat(255))
})
it('应使用自定义最大长度', () => {
const str = 'abcdefghij'
expect(sanitizeString(str, 5)).toBe('abcde')
expect(sanitizeString(str, 20)).toBe('abcdefghij')
})
it('应不截断等于最大长度的字符串', () => {
const str = 'a'.repeat(255)
expect(sanitizeString(str)).toBe(str)
})
it('应处理空字符串', () => {
expect(sanitizeString('')).toBe('')
})
})