test enhancements
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
import test from 'brittle';
|
||||
import { AppError, ErrorType, createErrorResponse, sanitizeErrorMessage } from '../utils/errorHandler.js';
|
||||
|
||||
test('AppError - creates error with type and code', (t) => {
|
||||
const error = new AppError('Test error', ErrorType.VALIDATION, 'TEST_CODE');
|
||||
t.equal(error.message, 'Test error');
|
||||
t.equal(error.type, ErrorType.VALIDATION);
|
||||
t.equal(error.code, 'TEST_CODE');
|
||||
t.ok(error.timestamp);
|
||||
});
|
||||
|
||||
test('AppError - toJSON serialization', (t) => {
|
||||
const error = new AppError('Test error', ErrorType.NETWORK);
|
||||
const json = error.toJSON();
|
||||
t.equal(json.error, 'Test error');
|
||||
t.equal(json.type, ErrorType.NETWORK);
|
||||
t.ok(json.timestamp);
|
||||
});
|
||||
|
||||
test('createErrorResponse - AppError', (t) => {
|
||||
const error = new AppError('Test error', ErrorType.VALIDATION, 'TEST_CODE');
|
||||
const response = createErrorResponse(error);
|
||||
t.equal(response.error, 'Test error');
|
||||
t.equal(response.code, 'TEST_CODE');
|
||||
t.equal(response.type, ErrorType.VALIDATION);
|
||||
});
|
||||
|
||||
test('createErrorResponse - standard Error', (t) => {
|
||||
const error = new Error('Standard error');
|
||||
error.code = 'ETIMEDOUT';
|
||||
const response = createErrorResponse(error);
|
||||
t.equal(response.error, 'Standard error');
|
||||
t.equal(response.code, 'ETIMEDOUT');
|
||||
t.equal(response.type, ErrorType.NETWORK);
|
||||
});
|
||||
|
||||
test('sanitizeErrorMessage - removes sensitive info', (t) => {
|
||||
const message = 'Error accessing /var/run/docker.sock';
|
||||
const sanitized = sanitizeErrorMessage(message);
|
||||
t.not(sanitized.includes('/var/run/docker.sock'));
|
||||
t.ok(sanitized.includes('[REDACTED]'));
|
||||
});
|
||||
|
||||
test('sanitizeErrorMessage - truncates long messages', (t) => {
|
||||
const longMessage = 'a'.repeat(300);
|
||||
const sanitized = sanitizeErrorMessage(longMessage);
|
||||
t.ok(sanitized.length <= 200);
|
||||
t.ok(sanitized.endsWith('...'));
|
||||
});
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
import test from 'brittle';
|
||||
import * as validation from '../server/utils/validation.js';
|
||||
|
||||
test('isValidContainerName - valid names', (t) => {
|
||||
t.ok(validation.isValidContainerName('my-container'));
|
||||
t.ok(validation.isValidContainerName('container_123'));
|
||||
t.ok(validation.isValidContainerName('a'));
|
||||
t.ok(validation.isValidContainerName('a'.repeat(63)));
|
||||
});
|
||||
|
||||
test('isValidContainerName - invalid names', (t) => {
|
||||
t.not(validation.isValidContainerName(''));
|
||||
t.not(validation.isValidContainerName('container with spaces'));
|
||||
t.not(validation.isValidContainerName('container@invalid'));
|
||||
t.not(validation.isValidContainerName('a'.repeat(64))); // Too long
|
||||
});
|
||||
|
||||
test('isValidImageName - valid images', (t) => {
|
||||
t.ok(validation.isValidImageName('nginx:latest'));
|
||||
t.ok(validation.isValidImageName('registry.example.com/namespace/image:tag'));
|
||||
t.ok(validation.isValidImageName('my-image'));
|
||||
});
|
||||
|
||||
test('isValidImageName - invalid images', (t) => {
|
||||
t.not(validation.isValidImageName(''));
|
||||
t.not(validation.isValidImageName('image with spaces'));
|
||||
t.not(validation.isValidImageName('a'.repeat(256))); // Too long
|
||||
});
|
||||
|
||||
test('isValidPortMapping - valid ports', (t) => {
|
||||
t.ok(validation.isValidPortMapping('8080:80/tcp'));
|
||||
t.ok(validation.isValidPortMapping('80/tcp'));
|
||||
t.ok(validation.isValidPortMapping('8080:80/udp'));
|
||||
});
|
||||
|
||||
test('isValidPortMapping - invalid ports', (t) => {
|
||||
t.not(validation.isValidPortMapping(''));
|
||||
t.not(validation.isValidPortMapping('invalid'));
|
||||
t.not(validation.isValidPortMapping('99999:80/tcp')); // Invalid port
|
||||
});
|
||||
|
||||
test('isValidVolumeMount - valid volumes', (t) => {
|
||||
t.ok(validation.isValidVolumeMount('/host:/container'));
|
||||
t.ok(validation.isValidVolumeMount('/host:/container:ro'));
|
||||
});
|
||||
|
||||
test('isValidVolumeMount - invalid volumes', (t) => {
|
||||
t.not(validation.isValidVolumeMount(''));
|
||||
t.not(validation.isValidVolumeMount('no-colon'));
|
||||
t.not(validation.isValidVolumeMount('/host/../container')); // Path traversal
|
||||
});
|
||||
|
||||
test('sanitizeEnvVarName - valid names', (t) => {
|
||||
t.equal(validation.sanitizeEnvVarName('MY_VAR'), 'MY_VAR');
|
||||
t.equal(validation.sanitizeEnvVarName('_PRIVATE'), '_PRIVATE');
|
||||
t.equal(validation.sanitizeEnvVarName('var123'), 'var123');
|
||||
});
|
||||
|
||||
test('sanitizeEnvVarName - invalid names', (t) => {
|
||||
t.equal(validation.sanitizeEnvVarName('123VAR'), null);
|
||||
t.equal(validation.sanitizeEnvVarName('var-with-dash'), null);
|
||||
t.equal(validation.sanitizeEnvVarName(''), null);
|
||||
});
|
||||
|
||||
test('validateNumber - valid numbers', (t) => {
|
||||
t.equal(validation.validateNumber(5, 0, 10), 5);
|
||||
t.equal(validation.validateNumber('5', 0, 10), 5);
|
||||
t.equal(validation.validateNumber(0, 0, 10), 0);
|
||||
});
|
||||
|
||||
test('validateNumber - invalid numbers', (t) => {
|
||||
t.equal(validation.validateNumber(15, 0, 10), null);
|
||||
t.equal(validation.validateNumber('invalid', 0, 10), null);
|
||||
t.equal(validation.validateNumber(null, 0, 10), null);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user