54 lines
2.6 KiB
TypeScript
54 lines
2.6 KiB
TypeScript
import { describe, it, expect, beforeAll } from "vitest";
|
|
import { mkdtempSync, readdirSync, writeFileSync, rmSync, existsSync } from "node:fs";
|
|
import { tmpdir } from "node:os";
|
|
import { join, dirname } from "node:path";
|
|
import { cmdToObsidian, cmdToFoundry } from "../src/cli.js";
|
|
import { ensureJournalFixture, ensureVaultFixture, ROLAND_ID } from "./helpers.js";
|
|
|
|
let journal: string;
|
|
beforeAll(() => { journal = ensureJournalFixture(); });
|
|
|
|
describe("dev / dry-run safety", () => {
|
|
it("--dry-run writes nothing to --out", async () => {
|
|
const out = mkdtempSync(join(tmpdir(), "mode-dry-"));
|
|
await cmdToObsidian({ mode: "dev", dryRun: true, journal, out, emitJson: false, id: ROLAND_ID });
|
|
expect(readdirSync(out).length).toBe(0);
|
|
rmSync(out, { recursive: true, force: true });
|
|
});
|
|
|
|
it("dev mode never writes into the source vault directory", async () => {
|
|
const vaultNote = ensureVaultFixture("Roland Raventhorne.md");
|
|
const out = mkdtempSync(join(tmpdir(), "mode-dev-"));
|
|
await cmdToFoundry({ mode: "dev", dryRun: false, journal, out, vault: vaultNote, emitJson: false });
|
|
// The fixture vault dir must contain only the original note — no cc.md leaked into it.
|
|
const files = readdirSync(dirname(vaultNote)).sort();
|
|
expect(files).toEqual(["Roland Raventhorne.md"]);
|
|
// Output landed in the sandbox instead.
|
|
expect(existsSync(join(out, "Roland Raventhornecc.md"))).toBe(true);
|
|
rmSync(out, { recursive: true, force: true });
|
|
});
|
|
|
|
it("refuses --out equal to --journal", async () => {
|
|
await expect(
|
|
cmdToObsidian({ mode: "dev", dryRun: false, journal, out: journal, emitJson: false, id: ROLAND_ID }),
|
|
).rejects.toThrow(/--out must not equal --journal/);
|
|
});
|
|
|
|
it("dev mode refuses --out equal to the source vault directory", async () => {
|
|
const vaultNote = ensureVaultFixture("Roland Raventhorne.md");
|
|
const vaultDir = dirname(vaultNote);
|
|
await expect(
|
|
cmdToFoundry({ mode: "dev", dryRun: false, journal, out: vaultDir, vault: vaultNote, emitJson: false }),
|
|
).rejects.toThrow(/--out must not be the source vault directory/);
|
|
});
|
|
|
|
it("--apply writes a timestamped backup before overwriting", async () => {
|
|
const out = mkdtempSync(join(tmpdir(), "mode-apply-"));
|
|
const target = join(out, "Roland Raventhorne.md");
|
|
writeFileSync(target, "OLD CONTENT\n");
|
|
await cmdToObsidian({ mode: "apply", dryRun: false, journal, out, emitJson: false, id: ROLAND_ID });
|
|
const files = readdirSync(out);
|
|
expect(files.some((f) => f.startsWith("Roland Raventhorne.md.bak-"))).toBe(true);
|
|
rmSync(out, { recursive: true, force: true });
|
|
});
|
|
}); |