/** * load-testcases.js * * ONE-TIME TRANSITION HELPER * Loads all testcases from the new YAML tree (testcases/) and converts them * to the legacy JSON shape that the editor frontend currently expects. * * This allows the UI to keep working unchanged while we migrate. * * TODO: Once the editor is updated to work natively with YAML, this can be removed. */ const fs = require('fs'); const path = require('path'); const yaml = require('js-yaml'); const TESTCASES_ROOT = path.join(__dirname, '..', '..', 'testcases'); /** * Recursively find all .yaml files under a directory (excluding SCHEMA.md etc.) */ function findYamlFiles(dir) { const results = []; const entries = fs.readdirSync(dir, { withFileTypes: true }); for (const entry of entries) { const fullPath = path.join(dir, entry.name); if (entry.isDirectory()) { results.push(...findYamlFiles(fullPath)); } else if (entry.name.endsWith('.yaml') && !entry.name.startsWith('SCHEMA')) { results.push(fullPath); } } return results; } /** * Convert a single YAML testcase object back to the legacy editor shape. */ function yamlToLegacy(yamlTest) { const cf = yamlTest.custom_fields || {}; const legacy = { id: yamlTest.id, group: yamlTest.group, module: yamlTest.module, action: cf.original_action || 'check', description: yamlTest.description || yamlTest.title || '', status: yamlTest.automation_status || 'manual', file: yamlTest.file || '', steps: (yamlTest.steps || []).map(s => { if (typeof s === 'string') { return { action: s, expected: '' }; } return { action: s.action || s, expected: s.expected || '' }; }), automatable: yamlTest.automatable || cf.original_automatable || [], notYet: yamlTest.notYet || cf.original_notYet || [], dependencies: yamlTest.dependencies || cf.original_dependencies || [], }; // Preserve extra fields that the old data sometimes had if (cf.manualReason) legacy.manualReason = cf.manualReason; if (cf.partialNotes) legacy.partialNotes = cf.partialNotes; return legacy; } /** * Main loader. Returns array of testcases in the old JSON format. */ function loadTestcases() { if (!fs.existsSync(TESTCASES_ROOT)) { return []; } const yamlFiles = findYamlFiles(TESTCASES_ROOT); const testcases = []; for (const filePath of yamlFiles) { try { const content = fs.readFileSync(filePath, 'utf8'); const doc = yaml.load(content); if (doc && doc.id) { testcases.push(yamlToLegacy(doc)); } } catch (err) { console.error('Failed to load YAML:', filePath, err.message); } } // Sort for stable output (same order every time) testcases.sort((a, b) => a.id.localeCompare(b.id)); return testcases; } module.exports = { loadTestcases };