import { mkdtempSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, describe, expect, it } from 'vitest' import { writeFileAtomic } from '../fs.js' let dir: string afterEach(() => { if (dir) rmSync(dir, { recursive: true, force: true }) }) describe('fs — writeFileAtomic', () => { it('writes new content and leaves NO temp file behind', async () => { dir = mkdtempSync(join(tmpdir(), 'ss-atomic-')) const target = join(dir, 'verdict.md') await writeFileAtomic(target, '# Audit\ncontenu') expect(readFileSync(target, 'utf8')).toBe('# Audit\ncontenu') expect(readdirSync(dir)).toEqual(['verdict.md']) }) it('replaces an existing file in place (idempotent re-run)', async () => { dir = mkdtempSync(join(tmpdir(), 'ss-atomic-')) const target = join(dir, 'verdict.md') writeFileSync(target, 'ancien contenu') await writeFileAtomic(target, 'nouveau contenu') expect(readFileSync(target, 'utf8')).toBe('nouveau contenu') expect(readdirSync(dir)).toEqual(['verdict.md']) }) it('creates missing parent directories', async () => { dir = mkdtempSync(join(tmpdir(), 'ss-atomic-')) const target = join(dir, '_audit', 'nested', 'verdict.md') await writeFileAtomic(target, 'ok') expect(readFileSync(target, 'utf8')).toBe('ok') }) })