import { chmodSync, mkdirSync, mkdtempSync, rmSync, statSync, writeFileSync, } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { afterEach, beforeEach, describe, expect, test } from "vitest"; import { OWNER_ONLY_DIRECTORY_MODE, OWNER_ONLY_FILE_MODE, restrictExistingPathToOwner, } from "#src/log-file-permissions"; describe("restrictExistingPathToOwner", () => { let baseDir: string; beforeEach(() => { baseDir = mkdtempSync(join(tmpdir(), "pi-permission-system-modes-")); }); afterEach(() => { rmSync(baseDir, { recursive: true, force: true }); }); test("tightens a world-readable file to owner-only", () => { const filePath = join(baseDir, "review.jsonl"); writeFileSync(filePath, "{}\n", "utf-8"); chmodSync(filePath, 0o644); restrictExistingPathToOwner(filePath, OWNER_ONLY_FILE_MODE); expect(statSync(filePath).mode & 0o777).toBe(0o600); }); test("tightens a world-readable directory to owner-only", () => { const dirPath = join(baseDir, "logs"); mkdirSync(dirPath); chmodSync(dirPath, 0o755); restrictExistingPathToOwner(dirPath, OWNER_ONLY_DIRECTORY_MODE); expect(statSync(dirPath).mode & 0o777).toBe(0o700); }); test("does not throw for a path that does not exist", () => { expect(() => { restrictExistingPathToOwner( join(baseDir, "absent.jsonl"), OWNER_ONLY_FILE_MODE, ); }).not.toThrow(); }); test("exposes the POSIX owner-only modes", () => { expect(OWNER_ONLY_FILE_MODE).toBe(0o600); expect(OWNER_ONLY_DIRECTORY_MODE).toBe(0o700); }); });