test: tighten process supervisor assertions

This commit is contained in:
Peter Steinberger
2026-05-09 18:33:53 +01:00
parent 8be0c72e97
commit ca8bcea186

View File

@@ -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.",
);
});
});