From c788aa025e6a77ca861d42410f72be5273061ddd Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 28 Apr 2026 08:52:20 +0100 Subject: [PATCH] test: route session lifecycle test through fast lane --- src/sessions/session-lifecycle-events.test.ts | 48 ++++++++++++------- test/vitest-unit-fast-config.test.ts | 1 + 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/sessions/session-lifecycle-events.test.ts b/src/sessions/session-lifecycle-events.test.ts index 07f34bb57e9..d8654925405 100644 --- a/src/sessions/session-lifecycle-events.test.ts +++ b/src/sessions/session-lifecycle-events.test.ts @@ -1,9 +1,22 @@ -import { describe, expect, it, vi } from "vitest"; +import { describe, expect, it } from "vitest"; import { emitSessionLifecycleEvent, onSessionLifecycleEvent } from "./session-lifecycle-events.js"; +function createListenerSpy(options: { throws?: boolean } = {}) { + const calls: unknown[][] = []; + return { + calls, + listener: (...args: unknown[]) => { + calls.push(args); + if (options.throws) { + throw new Error("boom"); + } + }, + }; +} + describe("session lifecycle events", () => { it("delivers events to active listeners and stops after unsubscribe", () => { - const listener = vi.fn(); + const { calls, listener } = createListenerSpy(); const unsubscribe = onSessionLifecycleEvent(listener); emitSessionLifecycleEvent({ @@ -11,28 +24,29 @@ describe("session lifecycle events", () => { reason: "created", label: "Main", }); - expect(listener).toHaveBeenCalledTimes(1); - expect(listener).toHaveBeenCalledWith({ - sessionKey: "agent:main:main", - reason: "created", - label: "Main", - }); + expect(calls).toEqual([ + [ + { + sessionKey: "agent:main:main", + reason: "created", + label: "Main", + }, + ], + ]); unsubscribe(); emitSessionLifecycleEvent({ sessionKey: "agent:main:main", reason: "updated", }); - expect(listener).toHaveBeenCalledTimes(1); + expect(calls).toHaveLength(1); }); it("keeps notifying other listeners when one throws", () => { - const noisy = vi.fn(() => { - throw new Error("boom"); - }); - const healthy = vi.fn(); - const unsubscribeNoisy = onSessionLifecycleEvent(noisy); - const unsubscribeHealthy = onSessionLifecycleEvent(healthy); + const noisy = createListenerSpy({ throws: true }); + const healthy = createListenerSpy(); + const unsubscribeNoisy = onSessionLifecycleEvent(noisy.listener); + const unsubscribeHealthy = onSessionLifecycleEvent(healthy.listener); expect(() => emitSessionLifecycleEvent({ @@ -41,8 +55,8 @@ describe("session lifecycle events", () => { }), ).not.toThrow(); - expect(noisy).toHaveBeenCalledTimes(1); - expect(healthy).toHaveBeenCalledTimes(1); + expect(noisy.calls).toHaveLength(1); + expect(healthy.calls).toHaveLength(1); unsubscribeNoisy(); unsubscribeHealthy(); diff --git a/test/vitest-unit-fast-config.test.ts b/test/vitest-unit-fast-config.test.ts index 76ff0f40196..f0e1528123f 100644 --- a/test/vitest-unit-fast-config.test.ts +++ b/test/vitest-unit-fast-config.test.ts @@ -36,6 +36,7 @@ describe("unit-fast vitest lane", () => { expect(config.test?.include).toContain("src/plugins/config-policy.test.ts"); expect(config.test?.include).toContain("src/proxy-capture/proxy-server.test.ts"); expect(config.test?.include).toContain("src/realtime-voice/agent-consult-tool.test.ts"); + expect(config.test?.include).toContain("src/sessions/session-lifecycle-events.test.ts"); expect(config.test?.include).toContain("src/sessions/transcript-events.test.ts"); expect(config.test?.include).toContain( "src/security/audit-channel-source-config-slack.test.ts",