import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; import { registerShutdownHandler } from "../../src/shutdown-handler.js"; describe("registerShutdownHandler", () => { let mockGateway: { shutdown: ReturnType }; let sigintListeners: Array<() => void>; let sigtermListeners: Array<() => void>; beforeEach(() => { mockGateway = { shutdown: vi.fn() }; sigintListeners = []; sigtermListeners = []; vi.spyOn(process, "on").mockImplementation((event: string, listener: (...args: unknown[]) => void) => { if (event === "SIGINT") sigintListeners.push(listener as () => void); if (event === "SIGTERM") sigtermListeners.push(listener as () => void); return process; }); vi.spyOn(console, "log").mockImplementation(() => {}); }); afterEach(() => { vi.restoreAllMocks(); }); it("registers listeners for SIGTERM and SIGINT", () => { registerShutdownHandler(mockGateway as never); expect(sigtermListeners).toHaveLength(1); expect(sigintListeners).toHaveLength(1); }); it("calls gateway.shutdown() on SIGTERM", () => { registerShutdownHandler(mockGateway as never); sigtermListeners[0](); expect(mockGateway.shutdown).toHaveBeenCalledOnce(); }); it("calls gateway.shutdown() on SIGINT", () => { registerShutdownHandler(mockGateway as never); sigintListeners[0](); expect(mockGateway.shutdown).toHaveBeenCalledOnce(); }); it("prevents double-shutdown on repeated signals", () => { registerShutdownHandler(mockGateway as never); sigtermListeners[0](); sigintListeners[0](); sigtermListeners[0](); expect(mockGateway.shutdown).toHaveBeenCalledOnce(); }); it("logs the signal name", () => { registerShutdownHandler(mockGateway as never); sigtermListeners[0](); expect(console.log).toHaveBeenCalledWith("Received SIGTERM, shutting down..."); }); });