osc-mcp-server
Version:
Model Context Protocol server for OSC (Open Sound Control) endpoint management
270 lines • 15.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const validation_1 = require("./validation");
const index_1 = require("../types/index");
describe('Parameter Validation', () => {
describe('validatePort', () => {
it('should accept valid ports', () => {
expect((0, validation_1.validatePort)(1024).isValid).toBe(true);
expect((0, validation_1.validatePort)(8000).isValid).toBe(true);
expect((0, validation_1.validatePort)(65535).isValid).toBe(true);
});
it('should reject undefined/null ports', () => {
const result1 = (0, validation_1.validatePort)(undefined);
const result2 = (0, validation_1.validatePort)(null);
expect(result1.isValid).toBe(false);
expect(result1.error?.code).toBe(index_1.ErrorCode.MISSING_REQUIRED_PARAMETER);
expect(result2.isValid).toBe(false);
expect(result2.error?.code).toBe(index_1.ErrorCode.MISSING_REQUIRED_PARAMETER);
});
it('should reject non-integer ports', () => {
const result1 = (0, validation_1.validatePort)('8000');
const result2 = (0, validation_1.validatePort)(8000.5);
expect(result1.isValid).toBe(false);
expect(result1.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
expect(result2.isValid).toBe(false);
expect(result2.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
});
it('should reject ports out of range', () => {
const result1 = (0, validation_1.validatePort)(1023);
const result2 = (0, validation_1.validatePort)(65536);
expect(result1.isValid).toBe(false);
expect(result1.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
expect(result2.isValid).toBe(false);
expect(result2.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
});
});
describe('validateBufferSize', () => {
it('should accept valid buffer sizes', () => {
expect((0, validation_1.validateBufferSize)(1).isValid).toBe(true);
expect((0, validation_1.validateBufferSize)(1000).isValid).toBe(true);
expect((0, validation_1.validateBufferSize)(10000).isValid).toBe(true);
});
it('should accept undefined buffer size (optional)', () => {
expect((0, validation_1.validateBufferSize)(undefined).isValid).toBe(true);
expect((0, validation_1.validateBufferSize)(null).isValid).toBe(true);
});
it('should reject non-integer buffer sizes', () => {
const result1 = (0, validation_1.validateBufferSize)('1000');
const result2 = (0, validation_1.validateBufferSize)(1000.5);
expect(result1.isValid).toBe(false);
expect(result1.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
expect(result2.isValid).toBe(false);
expect(result2.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
});
it('should reject buffer sizes out of range', () => {
const result1 = (0, validation_1.validateBufferSize)(0);
const result2 = (0, validation_1.validateBufferSize)(10001);
expect(result1.isValid).toBe(false);
expect(result1.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
expect(result2.isValid).toBe(false);
expect(result2.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
});
});
describe('validateAddressPattern', () => {
it('should accept valid address patterns', () => {
expect((0, validation_1.validateAddressPattern)('/test').isValid).toBe(true);
expect((0, validation_1.validateAddressPattern)('/synth/freq').isValid).toBe(true);
expect((0, validation_1.validateAddressPattern)('/osc/*/param').isValid).toBe(true);
});
it('should reject patterns not starting with /', () => {
const result = (0, validation_1.validateAddressPattern)('test');
expect(result.isValid).toBe(false);
expect(result.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
});
it('should reject patterns with invalid characters', () => {
const result1 = (0, validation_1.validateAddressPattern)('/test<invalid>');
const result2 = (0, validation_1.validateAddressPattern)('/test"invalid"');
expect(result1.isValid).toBe(false);
expect(result1.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
expect(result2.isValid).toBe(false);
expect(result2.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
});
});
describe('validateAddressFilters', () => {
it('should accept valid address filter arrays', () => {
expect((0, validation_1.validateAddressFilters)(['/test', '/synth/*']).isValid).toBe(true);
expect((0, validation_1.validateAddressFilters)([]).isValid).toBe(true);
});
it('should accept undefined filters (optional)', () => {
expect((0, validation_1.validateAddressFilters)(undefined).isValid).toBe(true);
expect((0, validation_1.validateAddressFilters)(null).isValid).toBe(true);
});
it('should reject non-array filters', () => {
const result = (0, validation_1.validateAddressFilters)('/test');
expect(result.isValid).toBe(false);
expect(result.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
});
it('should reject arrays with non-string elements', () => {
const result = (0, validation_1.validateAddressFilters)(['/test', 123]);
expect(result.isValid).toBe(false);
expect(result.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
});
it('should reject arrays with invalid address patterns', () => {
const result = (0, validation_1.validateAddressFilters)(['/test', 'invalid']);
expect(result.isValid).toBe(false);
expect(result.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
});
});
describe('validateEndpointId', () => {
it('should accept valid endpoint IDs', () => {
expect((0, validation_1.validateEndpointId)('endpoint-1').isValid).toBe(true);
expect((0, validation_1.validateEndpointId)('test-endpoint').isValid).toBe(true);
});
it('should reject undefined/null/empty endpoint IDs', () => {
const result1 = (0, validation_1.validateEndpointId)(undefined);
const result2 = (0, validation_1.validateEndpointId)(null);
const result3 = (0, validation_1.validateEndpointId)('');
expect(result1.isValid).toBe(false);
expect(result1.error?.code).toBe(index_1.ErrorCode.MISSING_REQUIRED_PARAMETER);
expect(result2.isValid).toBe(false);
expect(result2.error?.code).toBe(index_1.ErrorCode.MISSING_REQUIRED_PARAMETER);
expect(result3.isValid).toBe(false);
expect(result3.error?.code).toBe(index_1.ErrorCode.MISSING_REQUIRED_PARAMETER);
});
it('should reject non-string endpoint IDs', () => {
const result = (0, validation_1.validateEndpointId)(123);
expect(result.isValid).toBe(false);
expect(result.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
});
it('should reject whitespace-only endpoint IDs', () => {
const result = (0, validation_1.validateEndpointId)(' ');
expect(result.isValid).toBe(false);
expect(result.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
});
});
describe('validateTimeWindow', () => {
it('should accept valid time windows', () => {
expect((0, validation_1.validateTimeWindow)(1).isValid).toBe(true);
expect((0, validation_1.validateTimeWindow)(3600).isValid).toBe(true);
expect((0, validation_1.validateTimeWindow)(86400).isValid).toBe(true);
});
it('should accept undefined time window (optional)', () => {
expect((0, validation_1.validateTimeWindow)(undefined).isValid).toBe(true);
expect((0, validation_1.validateTimeWindow)(null).isValid).toBe(true);
});
it('should reject non-number time windows', () => {
const result = (0, validation_1.validateTimeWindow)('3600');
expect(result.isValid).toBe(false);
expect(result.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
});
it('should reject time windows out of range', () => {
const result1 = (0, validation_1.validateTimeWindow)(0);
const result2 = (0, validation_1.validateTimeWindow)(86401);
expect(result1.isValid).toBe(false);
expect(result1.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
expect(result2.isValid).toBe(false);
expect(result2.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
});
});
describe('validateLimit', () => {
it('should accept valid limits', () => {
expect((0, validation_1.validateLimit)(1).isValid).toBe(true);
expect((0, validation_1.validateLimit)(100).isValid).toBe(true);
expect((0, validation_1.validateLimit)(1000).isValid).toBe(true);
});
it('should accept undefined limit (optional)', () => {
expect((0, validation_1.validateLimit)(undefined).isValid).toBe(true);
expect((0, validation_1.validateLimit)(null).isValid).toBe(true);
});
it('should reject non-integer limits', () => {
const result1 = (0, validation_1.validateLimit)('100');
const result2 = (0, validation_1.validateLimit)(100.5);
expect(result1.isValid).toBe(false);
expect(result1.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
expect(result2.isValid).toBe(false);
expect(result2.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
});
it('should reject limits out of range', () => {
const result1 = (0, validation_1.validateLimit)(0);
const result2 = (0, validation_1.validateLimit)(1001);
expect(result1.isValid).toBe(false);
expect(result1.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
expect(result2.isValid).toBe(false);
expect(result2.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
});
});
describe('ParameterValidator', () => {
describe('validateCreateEndpoint', () => {
it('should accept valid create endpoint parameters', () => {
const params = {
port: 8000,
bufferSize: 1000,
addressFilters: ['/test', '/synth/*'],
};
expect(validation_1.ParameterValidator.validateCreateEndpoint(params).isValid).toBe(true);
});
it('should accept minimal valid parameters', () => {
const params = { port: 8000 };
expect(validation_1.ParameterValidator.validateCreateEndpoint(params).isValid).toBe(true);
});
it('should reject non-object parameters', () => {
const result = validation_1.ParameterValidator.validateCreateEndpoint('invalid');
expect(result.isValid).toBe(false);
expect(result.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
});
it('should reject parameters with invalid port', () => {
const params = { port: 100 };
const result = validation_1.ParameterValidator.validateCreateEndpoint(params);
expect(result.isValid).toBe(false);
expect(result.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
});
it('should reject parameters with invalid buffer size', () => {
const params = { port: 8000, bufferSize: 0 };
const result = validation_1.ParameterValidator.validateCreateEndpoint(params);
expect(result.isValid).toBe(false);
expect(result.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
});
it('should reject parameters with invalid address filters', () => {
const params = { port: 8000, addressFilters: ['invalid'] };
const result = validation_1.ParameterValidator.validateCreateEndpoint(params);
expect(result.isValid).toBe(false);
expect(result.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
});
});
describe('validateStopEndpoint', () => {
it('should accept valid stop endpoint parameters', () => {
const params = { endpointId: 'endpoint-1' };
expect(validation_1.ParameterValidator.validateStopEndpoint(params).isValid).toBe(true);
});
it('should reject parameters without endpoint ID', () => {
const params = {};
const result = validation_1.ParameterValidator.validateStopEndpoint(params);
expect(result.isValid).toBe(false);
expect(result.error?.code).toBe(index_1.ErrorCode.MISSING_REQUIRED_PARAMETER);
});
});
describe('validateGetMessages', () => {
it('should accept valid get messages parameters', () => {
const params = {
endpointId: 'endpoint-1',
addressPattern: '/test',
timeWindowSeconds: 3600,
limit: 100,
};
expect(validation_1.ParameterValidator.validateGetMessages(params).isValid).toBe(true);
});
it('should accept empty parameters', () => {
const params = {};
expect(validation_1.ParameterValidator.validateGetMessages(params).isValid).toBe(true);
});
it('should reject parameters with invalid address pattern', () => {
const params = { addressPattern: 'invalid' };
const result = validation_1.ParameterValidator.validateGetMessages(params);
expect(result.isValid).toBe(false);
expect(result.error?.code).toBe(index_1.ErrorCode.INVALID_PARAMETERS);
});
});
describe('validateGetEndpointStatus', () => {
it('should accept valid get endpoint status parameters', () => {
const params = { endpointId: 'endpoint-1' };
expect(validation_1.ParameterValidator.validateGetEndpointStatus(params).isValid).toBe(true);
});
it('should accept empty parameters', () => {
const params = {};
expect(validation_1.ParameterValidator.validateGetEndpointStatus(params).isValid).toBe(true);
});
});
});
});
//# sourceMappingURL=validation.test.js.map