BMAD-METHOD/test/test-codex-transform.js

91 lines
3.4 KiB
JavaScript

/**
* Tests for CodexSetup.transformToSkillFormat
*
* Demonstrates that the description regex mangles descriptions containing quotes.
*
* Usage: node test/test-codex-transform.js
*/
const path = require('node:path');
// ANSI colors
const colors = {
reset: '\u001B[0m',
green: '\u001B[32m',
red: '\u001B[31m',
cyan: '\u001B[36m',
dim: '\u001B[2m',
};
let passed = 0;
let failed = 0;
function assert(condition, testName, detail) {
if (condition) {
console.log(` ${colors.green}PASS${colors.reset} ${testName}`);
passed++;
} else {
console.log(` ${colors.red}FAIL${colors.reset} ${testName}`);
if (detail) console.log(` ${colors.dim}${detail}${colors.reset}`);
failed++;
}
}
// Import the class under test
const { CodexSetup } = require(path.join(__dirname, '..', 'tools', 'cli', 'installers', 'lib', 'ide', 'codex.js'));
const setup = new CodexSetup();
console.log(`\n${colors.cyan}CodexSetup.transformToSkillFormat tests${colors.reset}\n`);
// --- Passing case: simple description, no quotes ---
{
const input = `---\ndescription: A simple description\n---\n\nBody content here.`;
const result = setup.transformToSkillFormat(input, 'my-skill');
const expected = `---\nname: my-skill\ndescription: 'A simple description'\n---\n\nBody content here.`;
assert(result === expected, 'simple description without quotes', `got: ${JSON.stringify(result)}`);
}
// --- Description with embedded single quotes (from double-quoted YAML input) ---
{
const input = `---\ndescription: "can't stop won't stop"\n---\n\nBody content here.`;
const result = setup.transformToSkillFormat(input, 'my-skill');
// Output should have properly escaped YAML single-quoted scalar: '' for each '
const expected = `---\nname: my-skill\ndescription: 'can''t stop won''t stop'\n---\n\nBody content here.`;
assert(result === expected, 'description with embedded single quotes produces valid escaped YAML', `got: ${JSON.stringify(result)}`);
}
// --- Description with embedded single quote produces valid YAML ---
{
const input = `---\ndescription: "it's a test"\n---\n\nBody.`;
const result = setup.transformToSkillFormat(input, 'test-skill');
// Verify the inner quote is escaped: description: 'it''s a test'
const descLine = result.split('\n').find((l) => l.startsWith('description:'));
const value = descLine.replace('description: ', '');
// Check that single quotes inside the value are properly escaped
// In YAML single-quoted scalars, a literal ' must be written as ''
const innerContent = value.slice(1, -1); // strip outer quotes
const hasUnescapedQuote = innerContent.match(/[^']'[^']/);
assert(
!hasUnescapedQuote,
'description with apostrophe produces valid YAML (no unescaped inner quotes)',
`description line: ${descLine}`,
);
}
// --- Single-quoted input with pre-escaped apostrophe (YAML '' escape) ---
{
const input = `---\ndescription: 'don''t panic'\n---\n\nBody.`;
const result = setup.transformToSkillFormat(input, 'test-skill');
// Input has don''t (YAML-escaped). Should round-trip to don''t in output.
const expected = `---\nname: test-skill\ndescription: 'don''t panic'\n---\n\nBody.`;
assert(result === expected, 'single-quoted description with escaped apostrophe round-trips correctly', `got: ${JSON.stringify(result)}`);
}
// --- Summary ---
console.log(`\n${passed} passed, ${failed} failed\n`);
process.exit(failed > 0 ? 1 : 0);