test: share schtasks install fixtures

This commit is contained in:
Peter Steinberger
2026-04-20 18:29:18 +01:00
parent af134f1dd9
commit 800572e9c6

View File

@@ -21,6 +21,14 @@ beforeEach(() => {
});
describe("installScheduledTask", () => {
const okSchtasksResponse = { code: 0, stdout: "", stderr: "" };
const accessDeniedResponse = { code: 1, stdout: "", stderr: "ERROR: Access is denied." };
const missingTaskResponse = {
code: 1,
stdout: "",
stderr: "ERROR: The system cannot find the file specified.",
};
async function withUserProfileDir(
run: (tmpDir: string, env: Record<string, string>) => Promise<void>,
) {
@@ -36,6 +44,24 @@ describe("installScheduledTask", () => {
}
}
function installDefaultGatewayTask(env: Record<string, string>) {
return installScheduledTask({
env,
stdout: new PassThrough(),
programArguments: ["node", "gateway.js"],
environment: {},
});
}
function expectInitialTaskQueries(): void {
expect(schtasksCalls[0]).toEqual(["/Query"]);
expect(schtasksCalls[1]).toEqual(["/Query", "/TN", "OpenClaw Gateway"]);
}
function expectTaskRunCall(index: number): void {
expect(schtasksCalls[index]).toEqual(["/Run", "/TN", "OpenClaw Gateway"]);
}
it("writes quoted set assignments and escapes metacharacters", async () => {
await withUserProfileDir(async (_tmpDir, env) => {
const { scriptPath } = await installScheduledTask({
@@ -139,95 +165,64 @@ describe("installScheduledTask", () => {
it("uses /Create when the task does not exist yet", async () => {
await withUserProfileDir(async (_tmpDir, env) => {
schtasksResponses.push(
{ code: 0, stdout: "", stderr: "" },
{ code: 1, stdout: "", stderr: "ERROR: The system cannot find the file specified." },
);
schtasksResponses.push(okSchtasksResponse, missingTaskResponse);
await installScheduledTask({
env,
stdout: new PassThrough(),
programArguments: ["node", "gateway.js"],
environment: {},
});
await installDefaultGatewayTask(env);
expect(schtasksCalls[0]).toEqual(["/Query"]);
expect(schtasksCalls[1]).toEqual(["/Query", "/TN", "OpenClaw Gateway"]);
expectInitialTaskQueries();
expect(schtasksCalls[2]?.[0]).toBe("/Create");
expect(schtasksCalls[3]).toEqual(["/Run", "/TN", "OpenClaw Gateway"]);
expectTaskRunCall(3);
});
});
it("falls back to /Create when /Change fails on an existing task", async () => {
await withUserProfileDir(async (_tmpDir, env) => {
schtasksResponses.push(
{ code: 0, stdout: "", stderr: "" },
{ code: 0, stdout: "", stderr: "" },
{ code: 1, stdout: "", stderr: "ERROR: Access is denied." },
);
schtasksResponses.push(okSchtasksResponse, okSchtasksResponse, accessDeniedResponse);
await installScheduledTask({
env,
stdout: new PassThrough(),
programArguments: ["node", "gateway.js"],
environment: {},
});
await installDefaultGatewayTask(env);
expect(schtasksCalls[0]).toEqual(["/Query"]);
expect(schtasksCalls[1]).toEqual(["/Query", "/TN", "OpenClaw Gateway"]);
expectInitialTaskQueries();
expect(schtasksCalls[2]?.[0]).toBe("/Change");
expect(schtasksCalls[3]?.[0]).toBe("/Create");
expect(schtasksCalls[4]).toEqual(["/Run", "/TN", "OpenClaw Gateway"]);
expectTaskRunCall(4);
});
});
it("throws when /Run fails after updating an existing task", async () => {
await withUserProfileDir(async (_tmpDir, env) => {
schtasksResponses.push(
{ code: 0, stdout: "", stderr: "" },
{ code: 0, stdout: "", stderr: "" },
{ code: 0, stdout: "", stderr: "" },
{ code: 1, stdout: "", stderr: "ERROR: Access is denied." },
okSchtasksResponse,
okSchtasksResponse,
okSchtasksResponse,
accessDeniedResponse,
);
await expect(
installScheduledTask({
env,
stdout: new PassThrough(),
programArguments: ["node", "gateway.js"],
environment: {},
}),
).rejects.toThrow("schtasks run failed: ERROR: Access is denied.");
await expect(installDefaultGatewayTask(env)).rejects.toThrow(
"schtasks run failed: ERROR: Access is denied.",
);
expect(schtasksCalls[0]).toEqual(["/Query"]);
expect(schtasksCalls[1]).toEqual(["/Query", "/TN", "OpenClaw Gateway"]);
expectInitialTaskQueries();
expect(schtasksCalls[2]?.[0]).toBe("/Change");
expect(schtasksCalls[3]).toEqual(["/Run", "/TN", "OpenClaw Gateway"]);
expectTaskRunCall(3);
});
});
it("throws when /Run fails after creating a new task", async () => {
await withUserProfileDir(async (_tmpDir, env) => {
schtasksResponses.push(
{ code: 0, stdout: "", stderr: "" },
{ code: 1, stdout: "", stderr: "ERROR: The system cannot find the file specified." },
{ code: 0, stdout: "", stderr: "" },
{ code: 1, stdout: "", stderr: "ERROR: Access is denied." },
okSchtasksResponse,
missingTaskResponse,
okSchtasksResponse,
accessDeniedResponse,
);
await expect(
installScheduledTask({
env,
stdout: new PassThrough(),
programArguments: ["node", "gateway.js"],
environment: {},
}),
).rejects.toThrow("schtasks run failed: ERROR: Access is denied.");
await expect(installDefaultGatewayTask(env)).rejects.toThrow(
"schtasks run failed: ERROR: Access is denied.",
);
expect(schtasksCalls[0]).toEqual(["/Query"]);
expect(schtasksCalls[1]).toEqual(["/Query", "/TN", "OpenClaw Gateway"]);
expectInitialTaskQueries();
expect(schtasksCalls[2]?.[0]).toBe("/Create");
expect(schtasksCalls[3]).toEqual(["/Run", "/TN", "OpenClaw Gateway"]);
expectTaskRunCall(3);
});
});