Skip to main content
Glama
response-formatter.test.tsβ€’8.07 kB
import { formatSuccessResponse, formatListResponse, formatRecordResponse, formatJsonResponse, formatMarkdownResponse, formatMultiPartResponse, formatEmptyResponse, formatErrorResponse, } from '../../src/utils/response-formatter'; describe('response-formatter', () => { describe('formatSuccessResponse', () => { it('should create a simple success response', () => { const result = formatSuccessResponse('Operation successful'); expect(result.isError).toBe(false); expect(result.content).toHaveLength(1); expect(result.content[0].type).toBe('text'); expect(result.content[0].text).toBe('Operation successful'); expect(result.metadata).toBeUndefined(); }); it('should include metadata if provided', () => { const metadata = { id: '123', timestamp: Date.now() }; const result = formatSuccessResponse('Operation successful', metadata); expect(result.isError).toBe(false); expect(result.metadata).toEqual(metadata); }); }); describe('formatListResponse', () => { it('should format a list of items', () => { const items = [ { id: '1', name: 'Item 1' }, { id: '2', name: 'Item 2' }, { id: '3', name: 'Item 3' }, ]; const formatter = (item: any) => `${item.name} (ID: ${item.id})`; const result = formatListResponse('Test Items', items, formatter); expect(result.isError).toBe(false); expect(result.content).toHaveLength(1); expect(result.content[0].type).toBe('text'); expect(result.content[0].text).toContain('Test Items:'); expect(result.content[0].text).toContain('Item 1 (ID: 1)'); expect(result.content[0].text).toContain('Item 2 (ID: 2)'); expect(result.content[0].text).toContain('Item 3 (ID: 3)'); expect(result.content[0].text).toContain('Showing 3 items'); expect(result.metadata?.items).toEqual(items); }); it('should handle empty list', () => { const items: unknown[] = []; const formatter = (item: any) => `${item.name}`; const result = formatListResponse('Empty List', items, formatter); expect(result.isError).toBe(false); expect(result.content[0].text).toContain('Empty List:'); expect(result.content[0].text).toContain('No items found'); expect(result.content[0].text).toContain('Showing 0 items'); }); it('should include pagination info if provided', () => { const items = [{ id: '1', name: 'Item 1' }]; const formatter = (item: any) => `${item.name}`; const pagination = { total: 100, hasMore: true, nextCursor: 'abc123' }; const result = formatListResponse( 'Test Items', items, formatter, pagination ); expect(result.content[0].text).toContain('1 of 100 total'); expect(result.content[0].text).toContain('More items available'); expect(result.metadata?.pagination).toEqual(pagination); }); }); describe('formatRecordResponse', () => { it('should format a single record', () => { const record = { id: '123', name: 'Test Record', value: 42 }; const formatter = (r: any) => `Name: ${r.name}\nID: ${r.id}\nValue: ${r.value}`; const result = formatRecordResponse('Record Details', record, formatter); expect(result.isError).toBe(false); expect(result.content).toHaveLength(1); expect(result.content[0].type).toBe('text'); expect(result.content[0].text).toContain('Record Details:'); expect(result.content[0].text).toContain('Name: Test Record'); expect(result.content[0].text).toContain('ID: 123'); expect(result.content[0].text).toContain('Value: 42'); expect(result.metadata?.record).toEqual(record); }); }); describe('formatJsonResponse', () => { it('should format data as JSON', () => { const data = { id: '123', nested: { key: 'value', }, array: [1, 2, 3], }; const result = formatJsonResponse('JSON Data', data); expect(result.isError).toBe(false); expect(result.content).toHaveLength(1); expect(result.content[0].type).toBe('text'); expect(result.content[0].text).toContain('JSON Data:'); expect(result.content[0].text).toContain('"id": "123"'); expect(result.content[0].text).toContain('"key": "value"'); expect(result.content[0].text).toContain('"array": ['); expect(result.metadata?.data).toEqual(data); }); }); describe('formatMarkdownResponse', () => { it('should format markdown content', () => { const markdown = '## Subtitle\n\nThis is some **bold** text with a [link](https://example.com).'; const result = formatMarkdownResponse('Markdown Example', markdown); expect(result.isError).toBe(false); expect(result.content).toHaveLength(1); expect(result.content[0].type).toBe('markdown'); expect(result.content[0].text).toContain('# Markdown Example'); expect(result.content[0].text).toContain('## Subtitle'); expect(result.content[0].text).toContain('**bold**'); expect(result.content[0].text).toContain('[link](https://example.com)'); }); }); describe('formatMultiPartResponse', () => { it('should combine multiple content parts', () => { const parts = [ { type: 'text' as const, text: 'This is a text part' }, { type: 'markdown' as const, text: '**This** is a _markdown_ part' }, ]; const result = formatMultiPartResponse('Multi-part Response', parts); expect(result.isError).toBe(false); expect(result.content).toHaveLength(3); // Title + 2 parts expect(result.content[0].type).toBe('text'); expect(result.content[0].text).toBe('Multi-part Response'); expect(result.content[1]).toEqual(parts[0]); expect(result.content[2]).toEqual(parts[1]); }); }); describe('formatEmptyResponse', () => { it('should create a response with no content', () => { const result = formatEmptyResponse(); expect(result.isError).toBe(false); expect(result.content).toHaveLength(0); expect(result.metadata).toBeUndefined(); }); it('should include metadata if provided', () => { const metadata = { processed: true }; const result = formatEmptyResponse(metadata); expect(result.isError).toBe(false); expect(result.content).toHaveLength(0); expect(result.metadata).toEqual(metadata); }); }); describe('formatErrorResponse', () => { it('should create a standardized error response', () => { const result = formatErrorResponse( 'Something went wrong', 500, 'internal_error' ); expect(result.isError).toBe(true); expect(result.content).toHaveLength(1); expect(result.content[0].type).toBe('text'); expect(result.content[0].text).toContain('ERROR [internal_error]'); expect(result.content[0].text).toContain('Something went wrong'); expect(result.error).toBeDefined(); expect(result.error?.code).toBe(500); expect(result.error?.message).toBe('Something went wrong'); expect(result.error?.type).toBe('internal_error'); }); it('should include details if provided', () => { const details = { field: 'username', reason: 'required' }; const result = formatErrorResponse( 'Validation failed', 400, 'validation_error', details ); expect(result.isError).toBe(true); expect(result.content[0].text).toContain('ERROR [validation_error]'); expect(result.content[0].text).toContain('Details:'); expect(result.content[0].text).toContain('"field": "username"'); expect(result.error?.details).toEqual(details); }); it('should use default values if not provided', () => { const result = formatErrorResponse('Unknown error'); expect(result.isError).toBe(true); expect(result.error?.code).toBe(500); expect(result.error?.type).toBe('unknown_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/kesslerio/attio-mcp-server'

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