UNPKG

osc-mcp-server

Version:

Model Context Protocol server for OSC (Open Sound Control) endpoint management

270 lines 15.2 kB
"use strict"; 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