Skip to main content
Glama
parse-prd-schema.test.js4.02 kB
import { describe, expect, it } from '@jest/globals'; import { prdResponseSchema } from '../../../../../scripts/modules/task-manager/parse-prd/parse-prd-config.js'; describe('PRD Response Schema', () => { const validTask = { id: 1, title: 'Test Task', description: 'Test description', details: 'Test details', testStrategy: 'Test strategy', priority: 'high', dependencies: [], status: 'pending' }; describe('Valid responses', () => { it('should accept response with tasks and metadata', () => { const response = { tasks: [validTask], metadata: { projectName: 'Test Project', totalTasks: 1, sourceFile: 'test.txt', generatedAt: '2025-01-01T00:00:00Z' } }; const result = prdResponseSchema.safeParse(response); expect(result.success).toBe(true); }); it('should accept response with tasks and null metadata', () => { const response = { tasks: [validTask], metadata: null }; const result = prdResponseSchema.safeParse(response); expect(result.success).toBe(true); }); it('should accept response with only tasks (no metadata field)', () => { // This is what ZAI returns - just the tasks array without metadata const response = { tasks: [validTask] }; const result = prdResponseSchema.safeParse(response); expect(result.success).toBe(true); if (result.success) { // With .default(null), omitted metadata becomes null expect(result.data.metadata).toBeNull(); } }); it('should accept response with multiple tasks', () => { const response = { tasks: [validTask, { ...validTask, id: 2, title: 'Second Task' }] }; const result = prdResponseSchema.safeParse(response); expect(result.success).toBe(true); }); }); describe('Invalid responses', () => { it('should reject response without tasks field', () => { const response = { metadata: null }; const result = prdResponseSchema.safeParse(response); expect(result.success).toBe(false); }); it('should reject response with empty tasks array and invalid metadata', () => { const response = { tasks: [], metadata: 'invalid' }; const result = prdResponseSchema.safeParse(response); expect(result.success).toBe(false); }); it('should reject task with missing required fields', () => { const response = { tasks: [ { id: 1, title: 'Test' // missing other required fields } ] }; const result = prdResponseSchema.safeParse(response); expect(result.success).toBe(false); }); it('should reject task with invalid priority', () => { const response = { tasks: [ { ...validTask, priority: 'invalid' } ] }; const result = prdResponseSchema.safeParse(response); expect(result.success).toBe(false); }); }); describe('ZAI-specific response format', () => { it('should handle ZAI response format (tasks only, no metadata)', () => { // This is the actual format ZAI returns const zaiResponse = { tasks: [ { id: 24, title: 'Core Todo Data Management', description: 'Implement the core data structure and CRUD operations', status: 'pending', dependencies: [], priority: 'high', details: 'Create a Todo data model with properties...', testStrategy: 'Unit tests for TodoManager class...' }, { id: 25, title: 'Todo UI and User Interactions', description: 'Create the user interface components', status: 'pending', dependencies: [24], priority: 'high', details: 'Build a simple HTML/CSS/JS interface...', testStrategy: 'UI component tests...' } ] }; const result = prdResponseSchema.safeParse(zaiResponse); expect(result.success).toBe(true); if (result.success) { expect(result.data.tasks).toHaveLength(2); // With .default(null), omitted metadata becomes null (not undefined) expect(result.data.metadata).toBeNull(); } }); }); });

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/eyaltoledano/claude-task-master'

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