/** * Tests for the per-session .drawio auto-save (src/persistence.ts). */ import { chmodSync, existsSync, mkdtempSync, readdirSync, readFileSync, rmSync, utimesSync, writeFileSync, } from "node:fs" import { homedir, tmpdir } from "node:os" import { join } from "node:path" import { afterEach, beforeAll, describe, expect, it } from "vitest" import { installDomPolyfill } from "../src/dom.ts" import { Autosaver, defaultDataDir } from "../src/persistence.ts" beforeAll(() => { installDomPolyfill() }) const DIAGRAM = `` const BLANK = `` const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms)) const tempDir = () => mkdtempSync(join(tmpdir(), "mcp-autosave-")) describe("Autosaver", () => { it("writes the latest XML once changes settle", async () => { const dir = tempDir() const saver = new Autosaver(dir, 30) saver.schedule("mcp-a", DIAGRAM.replace('id="a"', 'id="first"')) saver.schedule("mcp-a", DIAGRAM) const path = saver.pathFor("mcp-a") as string expect(existsSync(path)).toBe(false) await sleep(80) expect(readFileSync(path, "utf-8")).toBe(DIAGRAM) expect(readdirSync(dir)).toEqual(["mcp-a.drawio"]) }) it("saves a new document of empty pages the user named", async () => { const dir = tempDir() const saver = new Autosaver(dir, 10) const emptyPage = (name: string) => `` const pages = `${emptyPage("Planning")}${emptyPage("Notes")}` saver.schedule("mcp-pages", pages) saver.flush() expect( readFileSync(saver.pathFor("mcp-pages") as string, "utf-8"), ).toBe(pages) }) it("skips a blank page that was never saved, but saves clearing a diagram", async () => { const dir = tempDir() const saver = new Autosaver(dir, 10) saver.schedule("mcp-blank", BLANK) await sleep(40) expect(existsSync(saver.pathFor("mcp-blank") as string)).toBe(false) saver.schedule("mcp-b", DIAGRAM) saver.flush() saver.schedule("mcp-b", BLANK) saver.flush() expect(readFileSync(saver.pathFor("mcp-b") as string, "utf-8")).toBe( BLANK, ) }) it("keeps only the newest session files and never touches other files", () => { const dir = tempDir() const saver = new Autosaver(dir, 10, 2) // Session ids look like mcp-