UNPKG

agile-planner-mcp-server

Version:

Serveur MCP pour la génération d'artefacts agiles (backlogs, features, user stories) avec IA - compatible Windsurf, Claude et Cursor

71 lines (63 loc) 2.86 kB
// Tests unitaires TDD pour la refactorisation de generateBacklog const { processBacklogParams, createApiMessages, determineModel, createBacklogSchema, attemptBacklogGeneration, harmonizeStories, handleBacklogError } = require('./backlog-generator'); describe('generateBacklog - Refactor TDD', () => { describe('processBacklogParams', () => { it('retourne valid=false si projectName est vide', () => { const res = processBacklogParams('', 'desc', {}); expect(res.valid).toBe(false); }); it('retourne valid=false si projectDescription est vide', () => { const res = processBacklogParams('name', '', {}); expect(res.valid).toBe(false); }); it('retourne valid=false si client est null', () => { const res = processBacklogParams('name', 'desc', null); expect(res.valid).toBe(false); }); it('retourne valid=true si tous les paramètres sont valides', () => { const res = processBacklogParams('name', 'desc', { api: true }); expect(res.valid).toBe(true); }); }); describe('createApiMessages', () => { it('génère un tableau de messages API cohérent', () => { const project = { name: 'Test', description: 'desc' }; const messages = createApiMessages(project); expect(Array.isArray(messages)).toBe(true); expect(messages[0]).toHaveProperty('role'); }); }); describe('determineModel', () => { it('retourne un modèle selon le provider', () => { expect(typeof determineModel({ provider: 'openai' })).toBe('string'); }); }); describe('createBacklogSchema', () => { it('retourne un objet schema', () => { const schema = createBacklogSchema(); expect(typeof schema).toBe('object'); }); }); describe('attemptBacklogGeneration', () => { it('retourne un objet {success, result} ou {success, error}', async () => { const fakeClient = { generate: jest.fn().mockResolvedValue({ result: { epics: [] } }) }; const res = await attemptBacklogGeneration(fakeClient, 'gpt-3', [], {}); expect(res).toHaveProperty('success'); }); }); describe('harmonizeStories', () => { it('garantit que chaque feature possède un tableau stories', () => { const epics = [{ features: [{ title: 'f1', stories: undefined }, { title: 'f2', stories: [] }] }]; harmonizeStories({ epics }); expect(Array.isArray(epics[0].features[0].stories)).toBe(true); expect(Array.isArray(epics[0].features[1].stories)).toBe(true); }); }); describe('handleBacklogError', () => { it('retourne un objet d’erreur formaté', () => { const err = handleBacklogError(new Error('fail')); expect(err).toHaveProperty('success', false); expect(err.error).toHaveProperty('message'); }); }); });