test(gateway): dedupe update and chat abort persistence fixtures

This commit is contained in:
Peter Steinberger
2026-02-18 12:43:54 +00:00
parent bb84452c62
commit 2aec380fb3
2 changed files with 128 additions and 97 deletions

View File

@@ -88,19 +88,26 @@ beforeEach(() => {
scheduleGatewaySigusr1RestartMock.mockReturnValue({ scheduled: true });
});
async function invokeUpdateRun(
params: Record<string, unknown>,
respond: ((ok: boolean, response?: unknown) => void) | undefined = undefined,
) {
const { updateHandlers } = await import("./update.js");
const onRespond = respond ?? (() => {});
await updateHandlers["update.run"]({
params,
respond: onRespond as never,
} as never);
}
describe("update.run sentinel deliveryContext", () => {
it("includes deliveryContext in sentinel payload when sessionKey is provided", async () => {
capturedPayload = undefined;
const { updateHandlers } = await import("./update.js");
const handler = updateHandlers["update.run"];
let responded = false;
await handler({
params: { sessionKey: "agent:main:webchat:dm:user-123" },
respond: () => {
responded = true;
},
} as never);
await invokeUpdateRun({ sessionKey: "agent:main:webchat:dm:user-123" }, () => {
responded = true;
});
expect(responded).toBe(true);
expect(capturedPayload).toBeDefined();
@@ -113,13 +120,8 @@ describe("update.run sentinel deliveryContext", () => {
it("omits deliveryContext when no sessionKey is provided", async () => {
capturedPayload = undefined;
const { updateHandlers } = await import("./update.js");
const handler = updateHandlers["update.run"];
await handler({
params: {},
respond: () => {},
} as never);
await invokeUpdateRun({});
expect(capturedPayload).toBeDefined();
expect(capturedPayload!.deliveryContext).toBeUndefined();
@@ -128,13 +130,8 @@ describe("update.run sentinel deliveryContext", () => {
it("includes threadId in sentinel payload for threaded sessions", async () => {
capturedPayload = undefined;
const { updateHandlers } = await import("./update.js");
const handler = updateHandlers["update.run"];
await handler({
params: { sessionKey: "agent:main:slack:dm:C0123ABC:thread:1234567890.123456" },
respond: () => {},
} as never);
await invokeUpdateRun({ sessionKey: "agent:main:slack:dm:C0123ABC:thread:1234567890.123456" });
expect(capturedPayload).toBeDefined();
expect(capturedPayload!.deliveryContext).toEqual({
@@ -146,18 +143,26 @@ describe("update.run sentinel deliveryContext", () => {
});
});
describe("update.run timeout normalization", () => {
it("enforces a 1000ms minimum timeout for tiny values", async () => {
await invokeUpdateRun({ timeoutMs: 1 });
expect(runGatewayUpdateMock).toHaveBeenCalledWith(
expect.objectContaining({
timeoutMs: 1000,
}),
);
});
});
describe("update.run restart scheduling", () => {
it("schedules restart when update succeeds", async () => {
const { updateHandlers } = await import("./update.js");
const handler = updateHandlers["update.run"];
let payload: { ok: boolean; restart: unknown } | undefined;
await handler({
params: {},
respond: (_ok: boolean, response: { ok: boolean; restart: unknown }) => {
payload = response;
},
} as never);
await invokeUpdateRun({}, (_ok: boolean, response: unknown) => {
const typed = response as { ok: boolean; restart: unknown };
payload = typed;
});
expect(scheduleGatewaySigusr1RestartMock).toHaveBeenCalledTimes(1);
expect(payload?.ok).toBe(true);
@@ -173,16 +178,12 @@ describe("update.run restart scheduling", () => {
durationMs: 100,
});
const { updateHandlers } = await import("./update.js");
const handler = updateHandlers["update.run"];
let payload: { ok: boolean; restart: unknown } | undefined;
await handler({
params: {},
respond: (_ok: boolean, response: { ok: boolean; restart: unknown }) => {
payload = response;
},
} as never);
await invokeUpdateRun({}, (_ok: boolean, response: unknown) => {
const typed = response as { ok: boolean; restart: unknown };
payload = typed;
});
expect(scheduleGatewaySigusr1RestartMock).not.toHaveBeenCalled();
expect(payload?.ok).toBe(false);