57 lines
2.0 KiB
TypeScript
57 lines
2.0 KiB
TypeScript
|
|
import TextBuffer from "../src/lib/text-buffer";
|
|||
|
|
import { describe, it, expect, vi } from "vitest";
|
|||
|
|
|
|||
|
|
/* -------------------------------------------------------------------------
|
|||
|
|
* External $EDITOR integration – behavioural contract
|
|||
|
|
* ---------------------------------------------------------------------- */
|
|||
|
|
|
|||
|
|
describe("TextBuffer – open in external $EDITOR", () => {
|
|||
|
|
it("replaces the buffer with the contents saved by the editor", async () => {
|
|||
|
|
// Initial text put into the file.
|
|||
|
|
const initial = [
|
|||
|
|
"// TODO: draft release notes",
|
|||
|
|
"",
|
|||
|
|
"* Fixed memory leak in xyz module.",
|
|||
|
|
].join("\n");
|
|||
|
|
|
|||
|
|
const buf = new TextBuffer(initial);
|
|||
|
|
|
|||
|
|
// -------------------------------------------------------------------
|
|||
|
|
// Stub the child_process.spawnSync call so no real editor launches.
|
|||
|
|
// -------------------------------------------------------------------
|
|||
|
|
const mockSpawn = vi
|
|||
|
|
.spyOn(require("node:child_process"), "spawnSync")
|
|||
|
|
.mockImplementation((_cmd, args: any) => {
|
|||
|
|
const argv = args as Array<string>;
|
|||
|
|
const file = argv[argv.length - 1];
|
|||
|
|
// Lazily append a dummy line – our faux "edit".
|
|||
|
|
require("node:fs").appendFileSync(
|
|||
|
|
file,
|
|||
|
|
"\n* Added unit tests for external editor integration.",
|
|||
|
|
);
|
|||
|
|
return { status: 0 } as any;
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
await buf.openInExternalEditor({ editor: "nano" }); // editor param ignored in stub
|
|||
|
|
} finally {
|
|||
|
|
mockSpawn.mockRestore();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const want = [
|
|||
|
|
"// TODO: draft release notes",
|
|||
|
|
"",
|
|||
|
|
"* Fixed memory leak in xyz module.",
|
|||
|
|
"* Added unit tests for external editor integration.",
|
|||
|
|
].join("\n");
|
|||
|
|
|
|||
|
|
expect(buf.getText()).toBe(want);
|
|||
|
|
// Cursor should land at the *end* of the newly imported text.
|
|||
|
|
const [row, col] = buf.getCursor();
|
|||
|
|
expect(row).toBe(3); // 4th line (0‑based)
|
|||
|
|
expect(col).toBe(
|
|||
|
|
"* Added unit tests for external editor integration.".length,
|
|||
|
|
);
|
|||
|
|
});
|
|||
|
|
});
|