Skip to main content
Glama

DollhouseMCP

by DollhouseMCP
elementId.test.tsโ€ข5.76 kB
/** * Tests for element ID utility functions */ import { parseElementId, parseElementIdStrict, parseElementIdWithFallback, formatElementId, isValidElementId, parseElementIds, batchParseElementIds, ELEMENT_ID_SEPARATOR } from '../../../src/utils/elementId.js'; describe('Element ID Utilities', () => { describe('parseElementId', () => { it('should parse valid element ID', () => { const result = parseElementId('personas:creative-writer'); expect(result).toEqual({ type: 'personas', name: 'creative-writer' }); }); it('should return null for invalid formats', () => { expect(parseElementId('')).toBeNull(); expect(parseElementId('invalid')).toBeNull(); expect(parseElementId('too:many:parts')).toBeNull(); expect(parseElementId(':missing-type')).toBeNull(); expect(parseElementId('missing-name:')).toBeNull(); expect(parseElementId(null as any)).toBeNull(); expect(parseElementId(undefined as any)).toBeNull(); expect(parseElementId(123 as any)).toBeNull(); }); it('should handle IDs with special characters', () => { const result = parseElementId('skills:code-review_v2'); expect(result).toEqual({ type: 'skills', name: 'code-review_v2' }); }); }); describe('parseElementIdStrict', () => { it('should parse valid element ID', () => { const result = parseElementIdStrict('templates:meeting-notes'); expect(result).toEqual({ type: 'templates', name: 'meeting-notes' }); }); it('should throw error for invalid formats', () => { expect(() => parseElementIdStrict('')).toThrow('Invalid element ID format'); expect(() => parseElementIdStrict('invalid')).toThrow('Invalid element ID format'); expect(() => parseElementIdStrict('too:many:parts')).toThrow('Invalid element ID format'); }); }); describe('parseElementIdWithFallback', () => { it('should parse valid element ID', () => { const result = parseElementIdWithFallback('agents:research-assistant'); expect(result).toEqual({ type: 'agents', name: 'research-assistant' }); }); it('should use fallbacks for invalid IDs', () => { const result = parseElementIdWithFallback('invalid-id'); expect(result).toEqual({ type: 'unknown', name: 'invalid-id' }); }); it('should use custom fallbacks', () => { const result = parseElementIdWithFallback('bad-format', 'custom-type', 'custom-name'); expect(result).toEqual({ type: 'custom-type', name: 'custom-name' }); }); }); describe('formatElementId', () => { it('should format element ID correctly', () => { expect(formatElementId('personas', 'creative-writer')).toBe('personas:creative-writer'); expect(formatElementId('memories', 'session-2025-09-24')).toBe('memories:session-2025-09-24'); }); it('should throw error for invalid inputs', () => { expect(() => formatElementId('', 'name')).toThrow('Both type and name are required'); expect(() => formatElementId('type', '')).toThrow('Both type and name are required'); expect(() => formatElementId(null as any, 'name')).toThrow('Both type and name are required'); }); it('should throw error if type or name contains separator', () => { expect(() => formatElementId('type:with:colon', 'name')).toThrow('cannot contain separator'); expect(() => formatElementId('type', 'name:with:colon')).toThrow('cannot contain separator'); }); }); describe('isValidElementId', () => { it('should validate element IDs correctly', () => { expect(isValidElementId('personas:creative-writer')).toBe(true); expect(isValidElementId('skills:code-review')).toBe(true); expect(isValidElementId('')).toBe(false); expect(isValidElementId('invalid')).toBe(false); expect(isValidElementId('too:many:parts')).toBe(false); }); }); describe('parseElementIds', () => { it('should parse multiple element IDs', () => { const ids = [ 'personas:writer', 'skills:debugger', 'invalid-id', 'templates:report', '' ]; const result = parseElementIds(ids); expect(result).toEqual([ { type: 'personas', name: 'writer' }, { type: 'skills', name: 'debugger' }, { type: 'templates', name: 'report' } ]); }); it('should handle empty array', () => { expect(parseElementIds([])).toEqual([]); }); }); describe('batchParseElementIds', () => { it('should batch parse with detailed error reporting', () => { const ids = [ 'personas:writer', '', 'invalid', 'skills:debugger', ':missing-type', 'missing-name:', 'too:many:parts', 'templates:report' ]; const result = batchParseElementIds(ids); expect(result.valid).toEqual([ { type: 'personas', name: 'writer', originalId: 'personas:writer' }, { type: 'skills', name: 'debugger', originalId: 'skills:debugger' }, { type: 'templates', name: 'report', originalId: 'templates:report' } ]); expect(result.invalid).toEqual([ { id: '', reason: 'Empty ID' }, { id: 'invalid', reason: 'Missing separator ":"' }, { id: ':missing-type', reason: 'Missing type' }, { id: 'missing-name:', reason: 'Missing name' }, { id: 'too:many:parts', reason: 'Multiple separators found' } ]); }); }); describe('ELEMENT_ID_SEPARATOR', () => { it('should export the separator constant', () => { expect(ELEMENT_ID_SEPARATOR).toBe(':'); }); }); });

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/DollhouseMCP/DollhouseMCP'

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