Files
peardock/test/validation.test.js
T
2026-07-16 00:01:07 -04:00

88 lines
3.3 KiB
JavaScript

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'));
t.ok(validation.isValidVolumeMount('/host/path:/container/path:rw'));
t.ok(validation.isValidVolumeMount('/host:/container:ro,Z'));
// Named volumes must be accepted (deploy filters with this helper)
t.ok(validation.isValidVolumeMount('mydata:/data'));
t.ok(validation.isValidVolumeMount('my-volume:/var/lib/app:rw'));
t.ok(validation.isValidVolumeMount('app_data:/app/data:ro'));
});
test('isValidVolumeMount - invalid volumes', (t) => {
t.not(validation.isValidVolumeMount(''));
t.not(validation.isValidVolumeMount('no-colon'));
t.not(validation.isValidVolumeMount('/host/../container')); // Path traversal
t.not(validation.isValidVolumeMount('myvol:relative-dest')); // dest must be absolute
});
test('sanitizeEnvVarName - valid names', (t) => {
t.is(validation.sanitizeEnvVarName('MY_VAR'), 'MY_VAR');
t.is(validation.sanitizeEnvVarName('_PRIVATE'), '_PRIVATE');
t.is(validation.sanitizeEnvVarName('var123'), 'var123');
});
test('sanitizeEnvVarName - invalid names', (t) => {
t.is(validation.sanitizeEnvVarName('123VAR'), null);
t.is(validation.sanitizeEnvVarName('var-with-dash'), null);
t.is(validation.sanitizeEnvVarName(''), null);
});
test('validateNumber - valid numbers', (t) => {
t.is(validation.validateNumber(5, 0, 10), 5);
t.is(validation.validateNumber('5', 0, 10), 5);
t.is(validation.validateNumber(0, 0, 10), 0);
});
test('validateNumber - invalid numbers', (t) => {
t.is(validation.validateNumber(15, 0, 10), null);
t.is(validation.validateNumber('invalid', 0, 10), null);
t.is(validation.validateNumber(null, 0, 10), null);
});