import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; import { describe, expect, it } from 'vitest'; import { scaffoldQualityRails } from '../src/scaffolder.js'; import type { RailsConfig } from '../src/types.js'; async function withTempDir(run: (directory: string) => Promise): Promise { const directory = await mkdtemp(join(tmpdir(), 'quality-rails-scaffold-')); try { await run(directory); } finally { await rm(directory, { recursive: true, force: true }); } } describe('scaffoldQualityRails', () => { it('writes expected node quality rails files', async () => { await withTempDir(async (directory) => { await writeFile(join(directory, 'package.json'), '{"name":"fixture"}\n', 'utf8'); const previous = process.env.MOSAIC_QUALITY_RAILS_SKIP_INSTALL; process.env.MOSAIC_QUALITY_RAILS_SKIP_INSTALL = '1'; const config: RailsConfig = { projectPath: directory, kind: 'node', profile: 'strict', linters: ['eslint', 'biome'], formatters: ['prettier'], hooks: true, }; const result = await scaffoldQualityRails(config); process.env.MOSAIC_QUALITY_RAILS_SKIP_INSTALL = previous; await expect(readFile(join(directory, '.eslintrc'), 'utf8')).resolves.toContain('parser'); await expect(readFile(join(directory, 'biome.json'), 'utf8')).resolves.toContain('"formatter"'); await expect(readFile(join(directory, '.githooks', 'pre-commit'), 'utf8')).resolves.toContain('pnpm lint'); await expect(readFile(join(directory, 'PR-CHECKLIST.md'), 'utf8')).resolves.toContain('Code Review Checklist'); expect(result.filesWritten).toEqual( expect.arrayContaining([ '.eslintrc', 'biome.json', '.githooks/pre-commit', 'PR-CHECKLIST.md', ]), ); expect(result.commandsToRun).toContain('git config core.hooksPath .githooks'); expect(result.warnings).toHaveLength(0); }); }); });