query-analyzer
Version:
A utility for enhancing Sequelize queries with EXPLAIN options and logging detailed query plans.
171 lines (140 loc) • 5.66 kB
text/typescript
import {
AnalyzerError,
ExplainError,
CsvError,
QueryExecutionError,
ParseError
} from '../src/errors';
describe('Error Classes', () => {
describe('AnalyzerError', () => {
it('should create error with all properties', () => {
const originalError = new Error('Original error');
const error = new AnalyzerError(
'Test error',
'TEST_CODE',
'SELECT * FROM users',
originalError
);
expect(error).toBeInstanceOf(Error);
expect(error).toBeInstanceOf(AnalyzerError);
expect(error.name).toBe('AnalyzerError');
expect(error.message).toBe('Test error');
expect(error.code).toBe('TEST_CODE');
expect(error.query).toBe('SELECT * FROM users');
expect(error.originalError).toBe(originalError);
expect(error.timestamp).toBeInstanceOf(Date);
});
it('should generate formatted error message', () => {
const error = new AnalyzerError(
'Test error',
'TEST_CODE',
'SELECT * FROM users'
);
const formatted = error.getFormattedMessage();
expect(formatted).toContain('[TEST_CODE]');
expect(formatted).toContain('Test error');
expect(formatted).toContain('Query: SELECT * FROM users');
expect(formatted).toContain('Time:');
});
it('should convert to JSON', () => {
const originalError = new Error('Original');
const error = new AnalyzerError(
'Test error',
'TEST_CODE',
'SELECT 1',
originalError
);
const json = error.toJSON();
expect(json.name).toBe('AnalyzerError');
expect(json.code).toBe('TEST_CODE');
expect(json.message).toBe('Test error');
expect(json.query).toBe('SELECT 1');
expect(json.timestamp).toBeDefined();
expect(json.originalError).toBe('Original');
expect(json.stack).toBeDefined();
});
it('should handle missing original error', () => {
const error = new AnalyzerError(
'Test error',
'TEST_CODE',
'SELECT 1'
);
expect(error.originalError).toBeUndefined();
const json = error.toJSON();
expect(json.originalError).toBeUndefined();
});
});
describe('ExplainError', () => {
it('should create ExplainError with correct properties', () => {
const originalError = new Error('EXPLAIN failed');
const error = new ExplainError('SELECT * FROM users', originalError);
expect(error).toBeInstanceOf(AnalyzerError);
expect(error.name).toBe('ExplainError');
expect(error.code).toBe('EXPLAIN_FAILED');
expect(error.message).toBe('Failed to analyze query with EXPLAIN');
expect(error.query).toBe('SELECT * FROM users');
expect(error.originalError).toBe(originalError);
});
it('should work without original error', () => {
const error = new ExplainError('SELECT 1');
expect(error.name).toBe('ExplainError');
expect(error.originalError).toBeUndefined();
});
});
describe('CsvError', () => {
it('should create CsvError with correct properties', () => {
const originalError = new Error('Disk full');
const error = new CsvError('SELECT * FROM users', originalError);
expect(error).toBeInstanceOf(AnalyzerError);
expect(error.name).toBe('CsvError');
expect(error.code).toBe('CSV_WRITE_FAILED');
expect(error.message).toBe('Failed to log query analysis to CSV');
expect(error.query).toBe('SELECT * FROM users');
});
});
describe('QueryExecutionError', () => {
it('should create QueryExecutionError with correct properties', () => {
const originalError = new Error('Connection lost');
const error = new QueryExecutionError('SELECT * FROM users', originalError);
expect(error).toBeInstanceOf(AnalyzerError);
expect(error.name).toBe('QueryExecutionError');
expect(error.code).toBe('QUERY_EXECUTION_FAILED');
expect(error.message).toBe('Query execution failed');
expect(error.query).toBe('SELECT * FROM users');
});
});
describe('ParseError', () => {
it('should create ParseError with correct properties', () => {
const error = new ParseError('SELECT * FROM users', 'execution time');
expect(error).toBeInstanceOf(AnalyzerError);
expect(error.name).toBe('ParseError');
expect(error.code).toBe('PARSE_FAILED');
expect(error.message).toBe('Failed to parse execution time from query plan');
expect(error.query).toBe('SELECT * FROM users');
});
});
describe('Error Stack Traces', () => {
it('should capture stack trace', () => {
const error = new AnalyzerError('Test', 'CODE', 'SELECT 1');
expect(error.stack).toBeDefined();
expect(error.stack).toContain('AnalyzerError');
});
it('should have proper stack trace for extended errors', () => {
const error = new ExplainError('SELECT 1');
expect(error.stack).toBeDefined();
expect(error.stack).toContain('ExplainError');
});
});
describe('Error Message Formatting', () => {
it('should include timestamp in formatted message', () => {
const error = new AnalyzerError('Test', 'CODE', 'SELECT 1');
const formatted = error.getFormattedMessage();
expect(formatted).toMatch(/Time: \d{4}-\d{2}-\d{2}T/);
});
it('should include query in formatted message', () => {
const error = new ExplainError('SELECT * FROM very_long_table_name WHERE complex_condition = true');
const formatted = error.getFormattedMessage();
expect(formatted).toContain('SELECT * FROM very_long_table_name');
});
});
});