/** * scaffold-screen-controller — real entry-point run: JSON on stdout ALWAYS, * `errors[]` (never a singular `error`), the sweep / skips / warnings in the * payload (audit 2026-09-24, A-WARN-01 / R5 / A-WARN-12). Before: a human * summary by default and an EMPTY stdout on every failure unless --json. */ import { describe, it, expect, beforeAll, afterAll } from 'vitest' import { mkdirSync, mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { dirname, join, resolve } from 'node:path' import { fileURLToPath } from 'node:url' import { runCli } from '../../../../../../lib/__tests__/helpers/run-cli.js' const INDEX = resolve(dirname(fileURLToPath(import.meta.url)), '../index.ts') let root: string beforeAll(() => { root = mkdtempSync(join(tmpdir(), 'ss-screen-entry-')) mkdirSync(join(root, 'ba', 'CRM', 'PIPELINE', 'pagespecs'), { recursive: true }) mkdirSync(join(root, 'app'), { recursive: true }) }) afterAll(() => rmSync(root, { recursive: true, force: true })) describe('scaffold-screen-controller entry', () => { it('no --spec: JSON envelope, errors[], exit 2 — without --json', () => { const r = runCli(INDEX, []) expect(r.envelope, r.stderr).not.toBeNull() expect(r.status).toBe(2) expect(r.envelope).toMatchObject({ success: false, errors: ['--spec is required'], filesGenerated: 0, files: [], todos: [], filesRemoved: [], skipped: [], warnings: [] }) expect(r.envelope).not.toHaveProperty('error') }) it('a refused spec lists the Zod issues in errors[]', () => { const r = runCli(INDEX, ['--spec', '{"section":"opportunites"}']) expect(r.envelope, r.stderr).not.toBeNull() expect(r.status).toBe(2) expect(r.envelope.success).toBe(false) expect(r.envelope.errors.length).toBeGreaterThan(0) expect(r.envelope.errors.join('\n')).toMatch(/entity/) }) it('no pagespec for the (section, entity): success:false, errors[] names it, exit 1', () => { const spec = { section: 'opportunites', entity: 'Opportunite', module: 'pipeline', appCode: 'crm', namespace: 'Crm', moduleDir: join(root, 'ba/CRM/PIPELINE'), projectPath: join(root, 'app') } const r = runCli(INDEX, ['--spec', JSON.stringify(spec)]) expect(r.envelope, r.stderr).not.toBeNull() expect(r.status, JSON.stringify(r.envelope?.errors)).toBe(1) expect(r.envelope.success).toBe(false) expect(r.envelope.errors.join('\n')).toMatch(/No pagespecs found/) expect(Array.isArray(r.envelope.warnings)).toBe(true) }) })