mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-10 09:10:45 +00:00
test: tighten process supervisor assertions
This commit is contained in:
@@ -38,15 +38,37 @@ function createBackgroundSession(id: string, pid?: number) {
|
||||
});
|
||||
}
|
||||
|
||||
function requireRecord(value: unknown, label: string): Record<string, unknown> {
|
||||
if (!value || typeof value !== "object") {
|
||||
throw new Error(`expected ${label}`);
|
||||
}
|
||||
return value as Record<string, unknown>;
|
||||
}
|
||||
|
||||
function expectSessionState(sessionId: string, expected: { exited?: boolean }) {
|
||||
expect(getSession(sessionId)).toMatchObject(expected);
|
||||
const session = requireRecord(getSession(sessionId), sessionId);
|
||||
if ("exited" in expected) {
|
||||
expect(session.exited).toBe(expected.exited);
|
||||
}
|
||||
}
|
||||
|
||||
function expectFinishedSessionState(
|
||||
sessionId: string,
|
||||
expected: { status?: string; exitSignal?: string | null },
|
||||
) {
|
||||
expect(getFinishedSession(sessionId)).toMatchObject(expected);
|
||||
const session = requireRecord(getFinishedSession(sessionId), sessionId);
|
||||
if ("status" in expected) {
|
||||
expect(session.status).toBe(expected.status);
|
||||
}
|
||||
if ("exitSignal" in expected) {
|
||||
expect(session.exitSignal).toBe(expected.exitSignal);
|
||||
}
|
||||
}
|
||||
|
||||
function expectTextContent(value: unknown, text: string) {
|
||||
const content = requireRecord(value, "tool content");
|
||||
expect(content.type).toBe("text");
|
||||
expect(content.text).toBe(text);
|
||||
}
|
||||
|
||||
describe("process tool supervisor cancellation", () => {
|
||||
@@ -85,10 +107,7 @@ describe("process tool supervisor cancellation", () => {
|
||||
|
||||
expect(supervisorMock.cancel).toHaveBeenCalledWith("sess", "manual-cancel");
|
||||
expectSessionState("sess", { exited: false });
|
||||
expect(result.content[0]).toMatchObject({
|
||||
type: "text",
|
||||
text: "Termination requested for session sess.",
|
||||
});
|
||||
expectTextContent(result.content[0], "Termination requested for session sess.");
|
||||
});
|
||||
|
||||
it("remove drops running session immediately when cancellation is requested", async () => {
|
||||
@@ -107,10 +126,7 @@ describe("process tool supervisor cancellation", () => {
|
||||
expect(supervisorMock.cancel).toHaveBeenCalledWith("sess", "manual-cancel");
|
||||
expect(getSession("sess")).toBeUndefined();
|
||||
expect(getFinishedSession("sess")).toBeUndefined();
|
||||
expect(result.content[0]).toMatchObject({
|
||||
type: "text",
|
||||
text: "Removed session sess (termination requested).",
|
||||
});
|
||||
expectTextContent(result.content[0], "Removed session sess (termination requested).");
|
||||
});
|
||||
|
||||
it("falls back to process-tree kill when supervisor record is missing", async () => {
|
||||
@@ -126,10 +142,7 @@ describe("process tool supervisor cancellation", () => {
|
||||
expect(killProcessTreeMock).toHaveBeenCalledWith(4242);
|
||||
expect(getSession("sess-fallback")).toBeUndefined();
|
||||
expectFinishedSessionState("sess-fallback", { status: "failed", exitSignal: "SIGKILL" });
|
||||
expect(result.content[0]).toMatchObject({
|
||||
type: "text",
|
||||
text: "Killed session sess-fallback.",
|
||||
});
|
||||
expectTextContent(result.content[0], "Killed session sess-fallback.");
|
||||
});
|
||||
|
||||
it("fails remove when no supervisor record and no pid is available", async () => {
|
||||
@@ -144,10 +157,10 @@ describe("process tool supervisor cancellation", () => {
|
||||
|
||||
expect(killProcessTreeMock).not.toHaveBeenCalled();
|
||||
expectSessionState("sess-no-pid", { exited: false });
|
||||
expect(result.details).toMatchObject({ status: "failed" });
|
||||
expect(result.content[0]).toMatchObject({
|
||||
type: "text",
|
||||
text: "Unable to remove session sess-no-pid: no active supervisor run or process id.",
|
||||
});
|
||||
expect(requireRecord(result.details, "result details").status).toBe("failed");
|
||||
expectTextContent(
|
||||
result.content[0],
|
||||
"Unable to remove session sess-no-pid: no active supervisor run or process id.",
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user