82 lines
2.4 KiB
TypeScript
82 lines
2.4 KiB
TypeScript
import {
|
|
validateEmail,
|
|
validateIdentifier,
|
|
isValidIdentifier,
|
|
validateTableName,
|
|
getIdentifierErrorMessage,
|
|
escapeSqlLikePattern,
|
|
escapeRegexPattern,
|
|
} from '../../src/utils/validations';
|
|
import { AppError } from '../../src/utils/errors';
|
|
import { describe, test, expect } from 'vitest';
|
|
|
|
describe('Validations Utils', () => {
|
|
describe('validateEmail', () => {
|
|
test('valid email returns true', () => {
|
|
expect(validateEmail('test@example.com')).toBe(true);
|
|
});
|
|
|
|
test('invalid email returns false', () => {
|
|
expect(validateEmail('invalid-email')).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('validateIdentifier', () => {
|
|
test('valid identifier returns true', () => {
|
|
expect(validateIdentifier('my_table')).toBe(true);
|
|
});
|
|
|
|
test('empty identifier throws AppError', () => {
|
|
expect(() => validateIdentifier('')).toThrow(AppError);
|
|
});
|
|
|
|
test('identifier with quotes throws AppError', () => {
|
|
expect(() => validateIdentifier('bad"identifier')).toThrow(AppError);
|
|
});
|
|
});
|
|
|
|
describe('isValidIdentifier', () => {
|
|
test('valid identifier returns true', () => {
|
|
expect(isValidIdentifier('column1')).toBe(true);
|
|
});
|
|
|
|
test('invalid identifier returns false', () => {
|
|
expect(isValidIdentifier('')).toBe(false);
|
|
expect(isValidIdentifier('bad"identifier')).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('validateTableName', () => {
|
|
test('valid table name returns true', () => {
|
|
expect(validateTableName('users')).toBe(true);
|
|
});
|
|
|
|
// _ prefix is allowed since system tables moved to separate schemas (system.*, auth.*, etc.)
|
|
test('table name starting with _ is valid', () => {
|
|
expect(validateTableName('_internal')).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe('getIdentifierErrorMessage', () => {
|
|
test('empty identifier returns proper message', () => {
|
|
expect(getIdentifierErrorMessage('')).toContain('cannot be empty');
|
|
});
|
|
|
|
test('bad identifier returns proper message', () => {
|
|
expect(getIdentifierErrorMessage('bad"identifier')).toContain('cannot contain quotes');
|
|
});
|
|
});
|
|
|
|
describe('escapeSqlLikePattern', () => {
|
|
test('escapes % and _ and \\', () => {
|
|
expect(escapeSqlLikePattern('50%_test\\')).toBe('50\\%\\_test\\\\');
|
|
});
|
|
});
|
|
|
|
describe('escapeRegexPattern', () => {
|
|
test('escapes regex metacharacters', () => {
|
|
expect(escapeRegexPattern('test.file(1)')).toBe('test\\.file\\(1\\)');
|
|
});
|
|
});
|
|
});
|