Skip to content

Commit 43da87f

Browse files
committed
test(gateway): cover delete timeout cleanup path
1 parent 93b329c commit 43da87f

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed

src/gateway/server.sessions.gateway-server-sessions-a.e2e.test.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,4 +691,60 @@ describe("gateway server sessions", () => {
691691

692692
ws.close();
693693
});
694+
695+
test("sessions.delete returns unavailable when active run does not stop", async () => {
696+
const dir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-sessions-"));
697+
const storePath = path.join(dir, "sessions.json");
698+
testState.sessionStorePath = storePath;
699+
700+
await fs.writeFile(
701+
path.join(dir, "sess-active.jsonl"),
702+
`${JSON.stringify({ role: "user", content: "active" })}\n`,
703+
"utf-8",
704+
);
705+
706+
await writeSessionStore({
707+
entries: {
708+
"discord:group:dev": {
709+
sessionId: "sess-active",
710+
updatedAt: Date.now(),
711+
},
712+
},
713+
});
714+
715+
embeddedRunMock.activeIds.add("sess-active");
716+
embeddedRunMock.waitResults.set("sess-active", false);
717+
718+
const { ws } = await openClient();
719+
720+
const deleted = await rpcReq(ws, "sessions.delete", {
721+
key: "discord:group:dev",
722+
});
723+
expect(deleted.ok).toBe(false);
724+
expect(deleted.error?.code).toBe("UNAVAILABLE");
725+
expect(deleted.error?.message ?? "").toMatch(/still active/i);
726+
expect(sessionCleanupMocks.stopSubagentsForRequester).toHaveBeenCalledWith({
727+
cfg: expect.any(Object),
728+
requesterSessionKey: "agent:main:discord:group:dev",
729+
});
730+
expect(sessionCleanupMocks.clearSessionQueues).toHaveBeenCalledTimes(1);
731+
const clearedKeys = sessionCleanupMocks.clearSessionQueues.mock.calls[0]?.[0] as string[];
732+
expect(clearedKeys).toEqual(
733+
expect.arrayContaining(["discord:group:dev", "agent:main:discord:group:dev", "sess-active"]),
734+
);
735+
expect(embeddedRunMock.abortCalls).toEqual(["sess-active"]);
736+
expect(embeddedRunMock.waitCalls).toEqual(["sess-active"]);
737+
738+
const store = JSON.parse(await fs.readFile(storePath, "utf-8")) as Record<
739+
string,
740+
{ sessionId?: string }
741+
>;
742+
expect(store["agent:main:discord:group:dev"]?.sessionId).toBe("sess-active");
743+
const filesAfterDeleteAttempt = await fs.readdir(dir);
744+
expect(filesAfterDeleteAttempt.some((f) => f.startsWith("sess-active.jsonl.deleted."))).toBe(
745+
false,
746+
);
747+
748+
ws.close();
749+
});
694750
});

0 commit comments

Comments
 (0)