UNPKG

n4s

Version:

typed schema validation version of enforce

68 lines (53 loc) 1.91 kB
import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { enforce } from '../n4s'; declare global { namespace n4s { interface EnforceMatchers { toNumber: (value: unknown) => { pass: boolean; type: number }; } } } describe('parse()', () => { let originalToNumber: unknown; beforeEach(() => { originalToNumber = (enforce as unknown as Record<string, unknown>).toNumber; enforce.extend({ toNumber: (value: unknown) => { const parsed = Number(value); return Number.isNaN(parsed) ? { pass: false, type: value } : { pass: true, type: parsed }; }, }); }); afterEach(() => { if (originalToNumber === undefined) { delete (enforce as unknown as Record<string, unknown>).toNumber; return; } (enforce as unknown as Record<string, unknown>).toNumber = originalToNumber; }); it('should expose parse on lazy rules', () => { const validator = enforce.isString(); expect(typeof validator.parse).toBe('function'); expect(validator.parse('hello')).toBe('hello'); }); it('should throw on failed parse', () => { const validator = enforce.isString().message('Must be string'); expect(() => validator.parse(100)).toThrow('Must be string'); }); it('should return transformed output for schema rules', () => { const schema = enforce.shape({ age: enforce.toNumber(), }); expect(schema.parse({ age: '42' })).toEqual({ age: 42 }); }); it('should transform items when used in isArrayOf', () => { const schema = enforce.isArrayOf(enforce.toNumber()); expect(schema.parse(['42', '100', 5])).toEqual([42, 100, 5]); }); it('should throw an error if an item in isArrayOf fails to parse', () => { const schema = enforce.isArrayOf(enforce.toNumber()); expect(() => schema.parse(['42', 'not-a-number'])).toThrow(); }); });