72 lines
2.1 KiB
TypeScript
72 lines
2.1 KiB
TypeScript
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<typeof vi.fn> };
|
|
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")
|
|
);
|
|
});
|
|
});
|