Files
brain/tools/plan-skills.test.mjs
T

32 lines
1.8 KiB
JavaScript

// tools/plan-skills.test.mjs
import { describe, it, expect } from 'vitest';
import { parsePlanSkills, extractPlanGoal } from './plan-skills.mjs';
describe('parsePlanSkills', () => {
const md = ['# План', '```skills-json', '["executing-plans","test-driven-development"]', '```', '## Цель', 'x'].join('\n');
it('достаёт список скилов из ```skills-json блока', () => {
expect(parsePlanSkills(md)).toEqual(['executing-plans', 'test-driven-development']);
});
it('нет блока → пустой массив', () => { expect(parsePlanSkills('# План\nтекст')).toEqual([]); });
it('битый JSON → пустой массив (fail-safe)', () => {
expect(parsePlanSkills('```skills-json\n[не json\n```')).toEqual([]);
});
it('не-массив / не-строки отфильтрованы', () => {
expect(parsePlanSkills('```skills-json\n["ok", 5, null, "two"]\n```')).toEqual(['ok', 'two']);
});
});
describe('extractPlanGoal (зеркало extractGoal судьи)', () => {
it('секция ## Цель → её текст до след. заголовка', () => {
const md = ['# План', '## Цель', 'починить парсер X', '', '## Шаги', 'шаг 1'].join('\n');
expect(extractPlanGoal(md)).toBe('починить парсер X');
});
it('секция ## Goal → её текст', () => {
expect(extractPlanGoal('## Goal\nfix the bug\n## Steps')).toBe('fix the bug');
});
it('нет секции цели → первый непустой не-заголовок абзац', () => {
expect(extractPlanGoal('# План\n\nделаем фичу\n')).toBe('делаем фичу');
});
it('пусто → пустая строка', () => { expect(extractPlanGoal('')).toBe(''); });
});