Skip to content

Commit 913a1f6

Browse files
committed
Tests: cover hook event agent isolation
1 parent 87d9d06 commit 913a1f6

1 file changed

Lines changed: 24 additions & 7 deletions

File tree

src/gateway/server.hooks.test.ts

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { describe, expect, test } from "vitest";
2-
import { resolveMainSessionKeyFromConfig } from "../config/sessions.js";
2+
import { resolveAgentMainSessionKey, resolveMainSessionKeyFromConfig } from "../config/sessions.js";
33
import { drainSystemEvents, peekSystemEvents } from "../infra/system-events.js";
44
import {
55
cronIsolatedRun,
@@ -12,8 +12,21 @@ import {
1212
installGatewayTestHooks({ scope: "suite" });
1313

1414
const resolveMainKey = () => resolveMainSessionKeyFromConfig();
15+
const resolveHooksMainKey = () => resolveAgentMainSessionKey({ agentId: "hooks" });
1516
const HOOK_TOKEN = "hook-secret";
1617

18+
async function waitForEventsForSession(sessionKey: string, timeoutMs = 2_000): Promise<string[]> {
19+
const deadline = Date.now() + timeoutMs;
20+
while (Date.now() < deadline) {
21+
const events = peekSystemEvents(sessionKey);
22+
if (events.length > 0) {
23+
return events;
24+
}
25+
await new Promise((resolve) => setTimeout(resolve, 10));
26+
}
27+
throw new Error(`timeout waiting for system event in ${sessionKey}`);
28+
}
29+
1730
function buildHookJsonHeaders(options?: {
1831
token?: string | null;
1932
headers?: Record<string, string>;
@@ -98,12 +111,14 @@ describe("gateway server hooks", () => {
98111
agentId: "hooks",
99112
});
100113
expect(resAgentWithId.status).toBe(200);
101-
await waitForSystemEvent();
114+
const hookEvents = await waitForEventsForSession(resolveHooksMainKey());
115+
expect(hookEvents.some((e) => e.includes("Hook Email: done"))).toBe(true);
116+
expect(peekSystemEvents(resolveMainKey()).length).toBe(0);
102117
const routedCall = (cronIsolatedRun.mock.calls[0] as unknown[] | undefined)?.[0] as {
103118
job?: { agentId?: string };
104119
};
105120
expect(routedCall?.job?.agentId).toBe("hooks");
106-
drainSystemEvents(resolveMainKey());
121+
drainSystemEvents(resolveHooksMainKey());
107122

108123
mockIsolatedRunOkOnce();
109124
const resAgentUnknown = await postHook(port, "/hooks/agent", {
@@ -264,14 +279,15 @@ describe("gateway server hooks", () => {
264279
sessionKey: "agent:hooks:slack:channel:c123",
265280
});
266281
expect(resAgent.status).toBe(200);
267-
await waitForSystemEvent();
282+
await waitForEventsForSession(resolveHooksMainKey());
268283

269284
const routedCall = (cronIsolatedRun.mock.calls[0] as unknown[] | undefined)?.[0] as
270285
| { sessionKey?: string; job?: { agentId?: string } }
271286
| undefined;
272287
expect(routedCall?.job?.agentId).toBe("hooks");
273288
expect(routedCall?.sessionKey).toBe("slack:channel:c123");
274-
drainSystemEvents(resolveMainKey());
289+
expect(peekSystemEvents(resolveMainKey()).length).toBe(0);
290+
drainSystemEvents(resolveHooksMainKey());
275291
});
276292
});
277293

@@ -307,12 +323,13 @@ describe("gateway server hooks", () => {
307323
agentId: "hooks",
308324
});
309325
expect(resAllowed.status).toBe(200);
310-
await waitForSystemEvent();
326+
await waitForEventsForSession(resolveHooksMainKey());
311327
const allowedCall = (cronIsolatedRun.mock.calls[0] as unknown[] | undefined)?.[0] as {
312328
job?: { agentId?: string };
313329
};
314330
expect(allowedCall?.job?.agentId).toBe("hooks");
315-
drainSystemEvents(resolveMainKey());
331+
expect(peekSystemEvents(resolveMainKey()).length).toBe(0);
332+
drainSystemEvents(resolveHooksMainKey());
316333

317334
const resDenied = await postHook(port, "/hooks/agent", {
318335
message: "Denied",

0 commit comments

Comments
 (0)