diff --git a/src/daemon/schtasks.install.test.ts b/src/daemon/schtasks.install.test.ts index f4b79bbee41..1bd3b6b0dce 100644 --- a/src/daemon/schtasks.install.test.ts +++ b/src/daemon/schtasks.install.test.ts @@ -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) => Promise, ) { @@ -36,6 +44,24 @@ describe("installScheduledTask", () => { } } + function installDefaultGatewayTask(env: Record) { + 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); }); });