Files
llmx/codex-cli/tests/external-editor.test.ts

57 lines
2.0 KiB
TypeScript
Raw Normal View History

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 (0based)
expect(col).toBe(
"* Added unit tests for external editor integration.".length,
);
});
});