testJobsRunOnTheirOwn
A background job is a process of its own, writing its output and how it ended to files: what's read from them is what it printed, its exit code, and its record (this process started it). Ids go on.
import { jobIds, jobWhen, startJob } from "#codebase/tcmts/cli/mcp"; import assert from "node:assert/strict"; import fs from "node:fs"; import os from "node:os"; import path from "node:path"; export const testJobsRunOnTheirOwn = async () => { const dir = fs.mkdtempSync(path.join(os.tmpdir(), "tcm jobs ")); try { const node = (code: string) => ({ cmd: [process.execPath, "-e", code], cwd: dir, env: process.env, }); const id = startJob( dir, { argv: ["run", "slow"] }, node( `console.log("one"); setTimeout(() => { console.error("two"); process.exit(3); }, 200);`, ), ); assert.equal(id, 1); const job = await jobWhen(dir, id, (j) => !!j.done); assert.equal(job.out, "one\ntwo\n"); assert.equal(job.done!.code, 3); assert.deepEqual(job.argv, ["run", "slow"]); assert.equal(job.server, process.pid); assert.equal(job.lost, undefined); assert.equal(startJob(dir, { argv: [] }, node("")), 2); assert.deepEqual(jobIds(dir), [1, 2]); await jobWhen(dir, 2, (j) => j.done?.code === 0); } finally { fs.rmSync(dir, { recursive: true, force: true }); } }