diff --git a/src/gateway/server.node-invoke-approval-bypass.e2e.test.ts b/src/gateway/server.node-invoke-approval-bypass.e2e.test.ts index d7e3137fc12..3721c885a10 100644 --- a/src/gateway/server.node-invoke-approval-bypass.e2e.test.ts +++ b/src/gateway/server.node-invoke-approval-bypass.e2e.test.ts @@ -19,6 +19,13 @@ import { installGatewayTestHooks({ scope: "suite" }); +async function expectNoForwardedInvoke(hasInvoke: () => boolean): Promise { + // Yield a couple of macrotasks so any accidental async forwarding would fire. + await sleep(0); + await sleep(0); + expect(hasInvoke()).toBe(false); +} + async function getConnectedNodeId(ws: WebSocket): Promise { const nodes = await rpcReq<{ nodes?: Array<{ nodeId: string; connected?: boolean }> }>( ws, @@ -171,8 +178,7 @@ describe("node.invoke approval bypass", () => { expect(res.ok).toBe(false); expect(res.error?.message ?? "").toContain("rawCommand does not match command"); - await sleep(50); - expect(sawInvoke).toBe(false); + await expectNoForwardedInvoke(() => sawInvoke); ws.close(); node.stop(); @@ -201,8 +207,7 @@ describe("node.invoke approval bypass", () => { expect(res.error?.message ?? "").toContain("params.runId"); // Ensure the node didn't receive the invoke (gateway should fail early). - await sleep(50); - expect(sawInvoke).toBe(false); + await expectNoForwardedInvoke(() => sawInvoke); ws.close(); node.stop(); @@ -225,8 +230,7 @@ describe("node.invoke approval bypass", () => { expect(res.ok).toBe(false); expect(res.error?.message ?? "").toContain("exec.approvals.node"); - await sleep(50); - expect(sawInvoke).toBe(false); + await expectNoForwardedInvoke(() => sawInvoke); ws.close(); node.stop(); @@ -305,8 +309,7 @@ describe("node.invoke approval bypass", () => { }); expect(invoke.ok).toBe(false); expect(invoke.error?.message ?? "").toContain("not valid for this device"); - await sleep(50); - expect(sawInvoke).toBe(false); + await expectNoForwardedInvoke(() => sawInvoke); ws.close(); wsOtherDevice.close();