UNPKG

n4s

Version:

typed schema validation version of enforce

86 lines (71 loc) 2.85 kB
import { describe, expect, it } from 'vitest'; import { checkDangerousKeys, findDangerousOwnKey, ownKeys, } from '../schemaObjectUtils'; describe('schemaObjectUtils', () => { describe('ownKeys', () => { it('Should return only own enumerable properties', () => { const obj = { a: 1, b: 2 }; Object.defineProperty(obj, 'c', { value: 3, enumerable: false }); const proto = { inherited: true }; Object.setPrototypeOf(obj, proto); const keys = ownKeys(obj); expect(keys).toEqual(['a', 'b']); expect(keys).not.toContain('c'); expect(keys).not.toContain('inherited'); }); it('Should work with empty objects', () => { expect(ownKeys({})).toEqual([]); }); it('Should return empty array for non-objects', () => { expect(ownKeys(null)).toEqual([]); expect(ownKeys(undefined)).toEqual([]); expect(ownKeys('string')).toEqual([]); }); }); describe('findDangerousOwnKey', () => { it('Should identify __proto__, constructor, and prototype as dangerous', () => { expect(findDangerousOwnKey(JSON.parse('{"__proto__": {}}'))).toBe( '__proto__', ); expect(findDangerousOwnKey(JSON.parse('{"constructor": {}}'))).toBe( 'constructor', ); expect(findDangerousOwnKey(JSON.parse('{"prototype": {}}'))).toBe( 'prototype', ); }); it('Should not flag regular keys as dangerous', () => { expect(findDangerousOwnKey({ name: 'john' })).toBeNull(); expect(findDangerousOwnKey({ id: 1 })).toBeNull(); expect(findDangerousOwnKey({ admin: true })).toBeNull(); }); }); describe('checkDangerousKeys', () => { it('Should return false pass and path if the payload contains dangerous keys', () => { const payload = JSON.parse('{"__proto__": {"admin": true}}'); const schema = { id: 1 }; const result = checkDangerousKeys(payload, schema); expect(result).toEqual({ pass: false, path: ['__proto__'] }); }); it('Should return null if there are no dangerous keys', () => { const payload = { username: 'john' }; const schema = { username: 1 }; const result = checkDangerousKeys(payload, schema); expect(result).toBeNull(); }); it('Should return false pass and path if the schema contains dangerous keys', () => { const payload = { id: 1 }; const schema = JSON.parse('{"constructor": 1}'); const result = checkDangerousKeys(payload, schema); expect(result).toEqual({ pass: false, path: ['constructor'] }); }); it('Should handle non-object payloads gracefully (returns null)', () => { expect(checkDangerousKeys(null, {})).toBeNull(); expect(checkDangerousKeys(undefined, {})).toBeNull(); expect(checkDangerousKeys('string', {})).toBeNull(); }); }); });