Files
rea/tests/boundary/process/processCaptureTerminal.test.ts
T

88 lines
2.8 KiB
TypeScript

import { rm, writeFile } from "node:fs/promises";
import { join } from "node:path";
import { expect } from "vitest";
import { createTestTempDirectory } from "../../fixtures/temporaryDirectory.js";
import { itWithCaptureCapability } from "./processCaptureCapability.js";
import { captureProcessScenario } from "../../../src/process/capture/ProcessHarness.js";
import { parseProcessScenario } from "../../../src/domain/process/processScenario.js";
itWithCaptureCapability(
"normalizes wide terminal cells without inventing blank cells",
async () => {
const result = await captureProcessScenario(
parseProcessScenario({
executable: process.execPath,
arguments: ["-e", 'process.stdout.write("界")'],
terminal: { columns: 4, rows: 1, scrollback: 0 },
normalization: {
patterns: [{ pattern: " ", replacement: "_" }],
},
}),
);
if (!result.ok) throw result.error;
expect(
result.value.frames
.map(({ raw_data, data }) => raw_data ?? data)
.join(""),
).toBe("界");
expect(result.value.rendered_frames.at(-1)).toMatchObject({
columns: 4,
cursor_x: 2,
lines: ["界__"],
});
expect(result.value.cleanup).toMatchObject({
owned_process_group: "verified",
temporary_root: "removed",
});
},
20_000,
);
itWithCaptureCapability(
"captures one command's terminal output, selected files, and owned cleanup",
async () => {
const root = await createTestTempDirectory("rea-process-capture-");
const script = join(root, "task.mjs");
await writeFile(
script,
[
'import { writeFile } from "node:fs/promises";',
"process.stdout.write(`value:${process.env.CAPTURE_VALUE}\\n`);",
'await writeFile("state.txt", "created");',
].join("\n"),
);
try {
const result = await captureProcessScenario(
parseProcessScenario({
executable: process.execPath,
arguments: [script],
working_directory: root,
environment: { CAPTURE_VALUE: "caller-selected" },
filesystem_observation_paths: ["."],
}),
);
if (!result.ok) throw result.error;
expect(result.value.frames.map(({ data }) => data).join("")).toContain(
"value:caller-selected",
);
expect(result.value.files_after).toContainEqual(
expect.objectContaining({ path: "root_0:state.txt" }),
);
expect(result.value.filesystem_effects).toContainEqual(
expect.objectContaining({
status: "created",
path: "root_0:state.txt",
}),
);
expect(result.value.cleanup).toMatchObject({
owned_process_group: "verified",
temporary_root: "removed",
});
} finally {
await rm(root, { recursive: true, force: true });
}
},
20_000,
);