34 lines
1.1 KiB
TypeScript
34 lines
1.1 KiB
TypeScript
import { afterEach, beforeEach, describe, expect, it } from "bun:test";
|
|
import { mkdtemp, readdir, rm } from "node:fs/promises";
|
|
import { tmpdir } from "node:os";
|
|
import { join } from "node:path";
|
|
|
|
import { atomicWriteFile, readTextFile } from "../../src/utils/fileStore.js";
|
|
|
|
describe("fileStore", () => {
|
|
const originalDateNow = Date.now;
|
|
let tempDir: string;
|
|
|
|
beforeEach(async () => {
|
|
tempDir = await mkdtemp(join(tmpdir(), "tjwater-file-store-"));
|
|
});
|
|
|
|
afterEach(async () => {
|
|
Date.now = originalDateNow;
|
|
await rm(tempDir, { force: true, recursive: true });
|
|
});
|
|
|
|
it("uses unique temp paths for concurrent writes in the same millisecond", async () => {
|
|
Date.now = () => 1_801_578_600_000;
|
|
const path = join(tempDir, "state.json");
|
|
const values = Array.from({ length: 24 }, (_, index) => `value-${index}`);
|
|
|
|
await Promise.all(values.map((value) => atomicWriteFile(path, value)));
|
|
|
|
const written = await readTextFile(path);
|
|
expect(written).not.toBeNull();
|
|
expect(values).toContain(written as string);
|
|
expect((await readdir(tempDir)).filter((name) => name.endsWith(".tmp"))).toEqual([]);
|
|
});
|
|
});
|