splatoon3.ink/app/common/fs.test.mjs
Matt Isenhower 6e4b57f6a7 Add unit tests for fs utilities and ValueCache
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 16:45:20 -08:00

50 lines
1.5 KiB
JavaScript

import { describe, it, expect, vi } from 'vitest';
import { mkdirp, exists, olderThan } from './fs.mjs';
vi.mock('fs/promises', () => ({
default: {
mkdir: vi.fn(),
access: vi.fn(),
stat: vi.fn(),
},
}));
const fs = (await import('fs/promises')).default;
describe('mkdirp', () => {
it('calls fs.mkdir with recursive: true', async () => {
fs.mkdir.mockResolvedValue(undefined);
await mkdirp('/some/path');
expect(fs.mkdir).toHaveBeenCalledWith('/some/path', { recursive: true });
});
});
describe('exists', () => {
it('returns true when fs.access succeeds', async () => {
fs.access.mockResolvedValue(undefined);
expect(await exists('/some/file')).toBe(true);
});
it('returns false when fs.access throws', async () => {
fs.access.mockRejectedValue(new Error('ENOENT'));
expect(await exists('/missing/file')).toBe(false);
});
});
describe('olderThan', () => {
it('returns true when mtime is before cutoff', async () => {
fs.stat.mockResolvedValue({ mtime: new Date('2024-01-01') });
expect(await olderThan('/file', new Date('2024-06-01'))).toBe(true);
});
it('returns false when mtime is after cutoff', async () => {
fs.stat.mockResolvedValue({ mtime: new Date('2024-06-01') });
expect(await olderThan('/file', new Date('2024-01-01'))).toBe(false);
});
it('returns true when file is missing', async () => {
fs.stat.mockRejectedValue(new Error('ENOENT'));
expect(await olderThan('/missing', new Date())).toBe(true);
});
});