import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; import { registerShutdownHandler } from "../../src/shutdown-handler.js"; vi.mock("../../src/logger.js", () => ({ logger: { info: vi.fn(), debug: vi.fn(), warn: vi.fn(), error: vi.fn(), }, })); import { logger } from "../../src/logger.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.mocked(logger.info).mockClear(); }); 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(logger.info).toHaveBeenCalledWith( expect.objectContaining({ signal: "SIGTERM" }), expect.stringContaining("shutting down") ); }); });