54 lines
1.8 KiB
TypeScript
54 lines
1.8 KiB
TypeScript
import { test, expect, describe, beforeEach, afterEach } from 'vitest';
|
|
import * as fs from 'fs';
|
|
import * as os from 'os';
|
|
import * as path from 'path';
|
|
import { writeFileAtomicSync } from './fs-atomic';
|
|
|
|
let tmpDir: string;
|
|
beforeEach(() => {
|
|
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'fsatomic-'));
|
|
});
|
|
afterEach(() => {
|
|
try { fs.rmSync(tmpDir, { recursive: true, force: true }); } catch { /* ignore */ }
|
|
});
|
|
|
|
describe('writeFileAtomicSync', () => {
|
|
test('writes a string payload', () => {
|
|
const target = path.join(tmpDir, 'a.txt');
|
|
writeFileAtomicSync(target, 'hello');
|
|
expect(fs.readFileSync(target, 'utf-8')).toBe('hello');
|
|
});
|
|
|
|
test('writes a buffer payload', () => {
|
|
const target = path.join(tmpDir, 'b.bin');
|
|
writeFileAtomicSync(target, Buffer.from([1, 2, 3, 4]));
|
|
expect(fs.readFileSync(target)).toEqual(Buffer.from([1, 2, 3, 4]));
|
|
});
|
|
|
|
test('overwrites existing file', () => {
|
|
const target = path.join(tmpDir, 'c.txt');
|
|
fs.writeFileSync(target, 'old');
|
|
writeFileAtomicSync(target, 'new');
|
|
expect(fs.readFileSync(target, 'utf-8')).toBe('new');
|
|
});
|
|
|
|
test('cleans up tmp file after success', () => {
|
|
const target = path.join(tmpDir, 'd.txt');
|
|
writeFileAtomicSync(target, 'x');
|
|
expect(fs.existsSync(target + '.tmp')).toBe(false);
|
|
});
|
|
|
|
test('utf-8 multibyte chars roundtrip', () => {
|
|
const target = path.join(tmpDir, 'e.txt');
|
|
writeFileAtomicSync(target, 'aeoeue-aeoeue');
|
|
expect(fs.readFileSync(target, 'utf-8')).toBe('aeoeue-aeoeue');
|
|
});
|
|
|
|
test('empty payload writes empty file', () => {
|
|
const target = path.join(tmpDir, 'f.txt');
|
|
writeFileAtomicSync(target, '');
|
|
expect(fs.readFileSync(target, 'utf-8')).toBe('');
|
|
expect(fs.statSync(target).size).toBe(0);
|
|
});
|
|
});
|