()
| 300 | } |
| 301 | |
| 302 | function runTests() { |
| 303 | console.log('\n=== Testing operator-readiness-dashboard.js ===\n'); |
| 304 | |
| 305 | let passed = 0; |
| 306 | let failed = 0; |
| 307 | |
| 308 | if (test('parseArgs accepts dashboard flags and rejects invalid values', () => { |
| 309 | const rootDir = createTempDir('operator-dashboard-args-'); |
| 310 | |
| 311 | try { |
| 312 | const parsed = parseArgs([ |
| 313 | 'node', |
| 314 | 'script', |
| 315 | '--format=json', |
| 316 | `--root=${rootDir}`, |
| 317 | '--skip-github', |
| 318 | '--allow-untracked', |
| 319 | 'docs/drafts/', |
| 320 | '--repo', |
| 321 | 'affaan-m/ECC', |
| 322 | '--generated-at', |
| 323 | '2026-05-15T00:00:00.000Z' |
| 324 | ]); |
| 325 | |
| 326 | assert.strictEqual(parsed.format, 'json'); |
| 327 | assert.strictEqual(parsed.root, path.resolve(rootDir)); |
| 328 | assert.strictEqual(parsed.skipGithub, true); |
| 329 | assert.deepStrictEqual(parsed.allowUntracked, ['docs/drafts/']); |
| 330 | assert.deepStrictEqual(parsed.repos, ['affaan-m/ECC']); |
| 331 | assert.strictEqual(parsed.generatedAt, '2026-05-15T00:00:00.000Z'); |
| 332 | |
| 333 | assert.throws(() => parseArgs(['node', 'script', '--format', 'xml']), /Invalid format/); |
| 334 | assert.throws(() => parseArgs(['node', 'script', '--write', 'dashboard.md', '--format', 'text']), /--write requires/); |
| 335 | assert.throws(() => parseArgs(['node', 'script', '--max-open-prs', 'x']), /Invalid --max-open-prs/); |
| 336 | assert.throws(() => parseArgs(['node', 'script', '--unknown']), /Unknown argument/); |
| 337 | } finally { |
| 338 | cleanup(rootDir); |
| 339 | } |
| 340 | })) passed++; else failed++; |
| 341 | |
| 342 | if (test('seeded repo emits an objective audit with remaining work', () => { |
| 343 | const rootDir = createTempDir('operator-dashboard-report-'); |
| 344 | |
| 345 | try { |
| 346 | seedRepo(rootDir); |
| 347 | const report = buildSeededReport(rootDir); |
| 348 | |
| 349 | assert.strictEqual(report.schema_version, 'ecc.operator-readiness-dashboard.v1'); |
| 350 | assert.strictEqual(report.generatedAt, '2026-05-15T00:00:00.000Z'); |
| 351 | assert.strictEqual(report.dashboardReady, true); |
| 352 | assert.strictEqual(report.ready, false); |
| 353 | assert.strictEqual(report.publicationReady, false); |
| 354 | assert.ok(report.requirements.some(item => item.id === 'completion-dashboard' && item.status === 'complete')); |
| 355 | assert.ok(report.requirements.some(item => ( |
| 356 | item.id === 'ecc-preview-pack' |
| 357 | && item.status === 'current' |
| 358 | && item.evidence.includes('deterministic smoke gate') |
| 359 | && item.gap === 'repeat clean-checkout preview-pack smoke before publication' |
no test coverage detected