11import { describe , expect , test } from "vitest" ;
2- import { resolveMainSessionKeyFromConfig } from "../config/sessions.js" ;
2+ import { resolveAgentMainSessionKey , resolveMainSessionKeyFromConfig } from "../config/sessions.js" ;
33import { drainSystemEvents , peekSystemEvents } from "../infra/system-events.js" ;
44import {
55 cronIsolatedRun ,
@@ -12,8 +12,21 @@ import {
1212installGatewayTestHooks ( { scope : "suite" } ) ;
1313
1414const resolveMainKey = ( ) => resolveMainSessionKeyFromConfig ( ) ;
15+ const resolveHooksMainKey = ( ) => resolveAgentMainSessionKey ( { agentId : "hooks" } ) ;
1516const 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+
1730function 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