Skip to main content
Glama
pshempel

MCP Time Server Node

by pshempel
errors.test.ts4.86 kB
/** * Tests for MCP SDK Adapter error classes * * These tests verify our custom error hierarchy */ import { BaseError, TimeCalculationError, TimezoneError, BusinessHoursError, HolidayDataError, DateParsingError, ValidationError, } from '../../../src/adapters/mcp-sdk/errors'; describe('MCP SDK Adapter - Error Classes', () => { describe('BaseError', () => { it('should create error with message, code, status and details', () => { const error = new BaseError('Test error', 'TEST_ERROR', 400, { field: 'test' }); expect(error).toBeInstanceOf(Error); expect(error.message).toBe('Test error'); expect(error.code).toBe('TEST_ERROR'); expect(error.status).toBe(400); expect(error.details).toEqual({ field: 'test' }); expect(error.name).toBe('BaseError'); }); it('should capture stack trace', () => { const error = new BaseError('Test error', 'TEST_ERROR', 500); expect(error.stack).toBeDefined(); expect(error.stack).toContain('BaseError'); }); }); describe('ValidationError', () => { it('should create validation error with 400 status', () => { const error = new ValidationError('Invalid input', { field: 'timezone' }); expect(error).toBeInstanceOf(BaseError); expect(error.message).toBe('Invalid input'); expect(error.code).toBe('VALIDATION_ERROR'); expect(error.status).toBe(400); expect(error.details).toEqual({ field: 'timezone' }); expect(error.name).toBe('ValidationError'); }); it('should work without details', () => { const error = new ValidationError('Invalid input'); expect(error.details).toBeUndefined(); }); }); describe('TimezoneError', () => { it('should create timezone error with correct code and status', () => { const error = new TimezoneError('Invalid timezone: XYZ', 'XYZ'); expect(error).toBeInstanceOf(BaseError); expect(error.message).toBe('Invalid timezone: XYZ'); expect(error.code).toBe('TIMEZONE_ERROR'); expect(error.status).toBe(400); expect(error.invalidTimezone).toBe('XYZ'); }); it('should work without timezone parameter', () => { const error = new TimezoneError('Timezone not found'); expect(error.invalidTimezone).toBeUndefined(); }); }); describe('DateParsingError', () => { it('should create date parsing error with input details', () => { const error = new DateParsingError('Cannot parse date', { input: '2025-13-45', format: 'YYYY-MM-DD', }); expect(error).toBeInstanceOf(BaseError); expect(error.code).toBe('DATE_PARSING_ERROR'); expect(error.status).toBe(400); expect(error.details).toEqual({ input: '2025-13-45', format: 'YYYY-MM-DD', }); }); }); describe('BusinessHoursError', () => { it('should create business hours error with 400 status', () => { const error = new BusinessHoursError('Invalid business hours config'); expect(error).toBeInstanceOf(BaseError); expect(error.code).toBe('BUSINESS_HOURS_ERROR'); expect(error.status).toBe(400); }); }); describe('HolidayDataError', () => { it('should create holiday data error with 503 status', () => { const error = new HolidayDataError('Failed to fetch holidays', { source: 'external-api', statusCode: 500, }); expect(error).toBeInstanceOf(BaseError); expect(error.code).toBe('HOLIDAY_DATA_ERROR'); expect(error.status).toBe(503); // Service unavailable expect(error.details).toEqual({ source: 'external-api', statusCode: 500, }); }); }); describe('TimeCalculationError', () => { it('should create time calculation error with 500 status', () => { const error = new TimeCalculationError('Arithmetic overflow'); expect(error).toBeInstanceOf(BaseError); expect(error.code).toBe('TIME_CALCULATION_ERROR'); expect(error.status).toBe(500); }); it('should include calculation details', () => { const error = new TimeCalculationError('Overflow', { operation: 'add', value: Number.MAX_SAFE_INTEGER, }); expect(error.details).toEqual({ operation: 'add', value: Number.MAX_SAFE_INTEGER, }); }); }); describe('Error inheritance', () => { it('should all extend BaseError', () => { const errors = [ new ValidationError('test'), new TimezoneError('test'), new DateParsingError('test'), new BusinessHoursError('test'), new HolidayDataError('test'), new TimeCalculationError('test'), ]; errors.forEach((error) => { expect(error).toBeInstanceOf(BaseError); expect(error).toBeInstanceOf(Error); }); }); }); });

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/pshempel/mcp-time-server-node'

If you have feedback or need assistance with the MCP directory API, please join our Discord server