Files
obsidian-foundry-sync/tests/mode.test.ts
2026-06-20 19:15:38 +00:00

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 });
});
});