Skip to main content
Glama
schema-utils.test.ts6.45 kB
/** * Tests for schema-utils.ts */ import { createZodRawShape } from '../../mcp/utils/schema-utils'; describe('createZodRawShape', () => { it('should handle integer type correctly', () => { const tool = { parameters: { properties: { size_bytes: { type: 'integer', description: 'File size in bytes', }, }, required: ['size_bytes'], }, }; const shape = createZodRawShape(tool); expect(shape.size_bytes).toBeDefined(); // Test that it accepts integers const result = shape.size_bytes.safeParse(42); expect(result.success).toBe(true); // Test that it rejects non-integers const floatResult = shape.size_bytes.safeParse(42.5); expect(floatResult.success).toBe(false); }); it('should handle enum values correctly', () => { const tool = { parameters: { properties: { itemType: { type: 'string', enum: ['Component', 'Decision', 'Rule', 'File', 'Context'], description: 'Type of the item', }, }, required: ['itemType'], }, }; const shape = createZodRawShape(tool); expect(shape.itemType).toBeDefined(); // Test that it accepts valid enum values const validResult = shape.itemType.safeParse('Component'); expect(validResult.success).toBe(true); // Test that it rejects invalid enum values const invalidResult = shape.itemType.safeParse('InvalidType'); expect(invalidResult.success).toBe(false); }); it('should handle array items correctly', () => { const tool = { parameters: { properties: { entityTypes: { type: 'array', items: { type: 'string', }, description: 'Types of entities to search', }, }, required: ['entityTypes'], }, }; const shape = createZodRawShape(tool); expect(shape.entityTypes).toBeDefined(); // Test that it accepts array of strings const validResult = shape.entityTypes.safeParse(['component', 'decision']); expect(validResult.success).toBe(true); // Test that it rejects array with wrong item types const invalidResult = shape.entityTypes.safeParse(['component', 123]); expect(invalidResult.success).toBe(false); }); it('should handle array with enum items correctly', () => { const tool = { parameters: { properties: { nodeTableNames: { type: 'array', items: { type: 'string', enum: ['Component', 'Decision', 'Rule'], }, description: 'Node table names', }, }, required: ['nodeTableNames'], }, }; const shape = createZodRawShape(tool); expect(shape.nodeTableNames).toBeDefined(); // Test that it accepts array of valid enum values const validResult = shape.nodeTableNames.safeParse(['Component', 'Decision']); expect(validResult.success).toBe(true); // Test that it rejects array with invalid enum values const invalidResult = shape.nodeTableNames.safeParse(['Component', 'InvalidType']); expect(invalidResult.success).toBe(false); }); it('should handle optional fields correctly', () => { const tool = { parameters: { properties: { required_field: { type: 'string', description: 'Required field', }, optional_field: { type: 'integer', description: 'Optional field', }, }, required: ['required_field'], }, }; const shape = createZodRawShape(tool); // Required field should not be optional const requiredResult = shape.required_field.safeParse(undefined); expect(requiredResult.success).toBe(false); // Optional field should accept undefined const optionalResult = shape.optional_field.safeParse(undefined); expect(optionalResult.success).toBe(true); // Optional field should also accept valid values const validOptionalResult = shape.optional_field.safeParse(42); expect(validOptionalResult.success).toBe(true); }); it('should maintain fallback to z.any() for unknown types', () => { const tool = { parameters: { properties: { unknown_field: { type: 'unknown_type', description: 'Unknown type field', }, }, required: ['unknown_field'], }, }; const shape = createZodRawShape(tool); expect(shape.unknown_field).toBeDefined(); // Should accept any value for unknown types const result1 = shape.unknown_field.safeParse('string'); expect(result1.success).toBe(true); const result2 = shape.unknown_field.safeParse(123); expect(result2.success).toBe(true); const result3 = shape.unknown_field.safeParse({ object: true }); expect(result3.success).toBe(true); }); it('should handle complex nested structures', () => { const tool = { parameters: { properties: { metadata: { type: 'object', description: 'Metadata object', }, tags: { type: 'array', items: { type: 'string', }, description: 'Array of tags', }, status: { type: 'string', enum: ['active', 'inactive'], description: 'Status enum', }, count: { type: 'integer', description: 'Count value', }, }, required: ['metadata', 'status'], }, }; const shape = createZodRawShape(tool); expect(Object.keys(shape)).toEqual(['metadata', 'tags', 'status', 'count']); // Test valid data const validData = { metadata: { key: 'value' }, tags: ['tag1', 'tag2'], status: 'active', count: 5, }; const metadataResult = shape.metadata.safeParse(validData.metadata); expect(metadataResult.success).toBe(true); const tagsResult = shape.tags.safeParse(validData.tags); expect(tagsResult.success).toBe(true); const statusResult = shape.status.safeParse(validData.status); expect(statusResult.success).toBe(true); const countResult = shape.count.safeParse(validData.count); expect(countResult.success).toBe(true); }); });

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/Jakedismo/KuzuMem-MCP'

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