feat(M2): Background Job Manager
This commit is contained in:
@@ -394,6 +394,37 @@ describe("cancelJob", () => {
|
||||
(err: unknown) => err instanceof JobNotFoundError
|
||||
);
|
||||
});
|
||||
|
||||
it("is a no-op when job is not running", () => {
|
||||
const fs = createMockFs();
|
||||
const jobDir = "/tmp/jobs";
|
||||
const now = new Date().toISOString();
|
||||
const completedRecord: JobRecord = {
|
||||
id: "job-completed",
|
||||
client: "codex",
|
||||
prompt: "done",
|
||||
status: "completed",
|
||||
startedAt: now,
|
||||
completedAt: now,
|
||||
stdout: "ok",
|
||||
stderr: "",
|
||||
result: {
|
||||
stdout: "ok",
|
||||
stderr: "",
|
||||
exitCode: 0,
|
||||
client: "codex",
|
||||
durationMs: 100,
|
||||
},
|
||||
};
|
||||
|
||||
fs.mkdirSync(jobDir, { recursive: true });
|
||||
fs.writeFileSync(`${jobDir}/job-completed.json`, JSON.stringify(completedRecord));
|
||||
|
||||
cancelJob("job-completed", { jobDir, fs });
|
||||
|
||||
const record = readJobRecord(fs, `${jobDir}/job-completed.json`);
|
||||
assert.strictEqual(record.status, "completed");
|
||||
});
|
||||
});
|
||||
|
||||
describe("listJobs", () => {
|
||||
@@ -425,6 +456,43 @@ describe("listJobs", () => {
|
||||
assert.strictEqual(jobs[1].id, job1.id);
|
||||
});
|
||||
|
||||
it("returns empty array when jobDir does not exist", () => {
|
||||
const fs = createMockFs();
|
||||
const jobs = listJobs({ jobDir: "/tmp/jobs", fs });
|
||||
assert.deepStrictEqual(jobs, []);
|
||||
});
|
||||
|
||||
it("ignores corrupt or unreadable job files", () => {
|
||||
const fs = createMockFs();
|
||||
const jobDir = "/tmp/jobs";
|
||||
const now = new Date().toISOString();
|
||||
const validRecord: JobRecord = {
|
||||
id: "job-valid",
|
||||
client: "codex",
|
||||
prompt: "ok",
|
||||
status: "completed",
|
||||
startedAt: now,
|
||||
completedAt: now,
|
||||
stdout: "ok",
|
||||
stderr: "",
|
||||
result: {
|
||||
stdout: "ok",
|
||||
stderr: "",
|
||||
exitCode: 0,
|
||||
client: "codex",
|
||||
durationMs: 100,
|
||||
},
|
||||
};
|
||||
|
||||
fs.mkdirSync(jobDir, { recursive: true });
|
||||
fs.writeFileSync(`${jobDir}/job-valid.json`, JSON.stringify(validRecord));
|
||||
fs.writeFileSync(`${jobDir}/job-corrupt.json`, "not-json");
|
||||
|
||||
const jobs = listJobs({ jobDir, fs });
|
||||
assert.strictEqual(jobs.length, 1);
|
||||
assert.strictEqual(jobs[0].id, "job-valid");
|
||||
});
|
||||
|
||||
it("filters jobs by status when filter is provided", () => {
|
||||
const fs = createMockFs();
|
||||
const jobDir = "/tmp/jobs";
|
||||
@@ -555,4 +623,11 @@ describe("cleanupJobs", () => {
|
||||
|
||||
assert.strictEqual(fs.existsSync(path), false);
|
||||
});
|
||||
|
||||
it("is a no-op when jobDir does not exist", () => {
|
||||
const fs = createMockFs();
|
||||
// Should not throw
|
||||
cleanupJobs({ jobDir: "/tmp/jobs", fs });
|
||||
assert.strictEqual(fs.existsSync("/tmp/jobs"), false);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user