78 lines
2.4 KiB
TypeScript
78 lines
2.4 KiB
TypeScript
import { EventEmitter } from "node:events";
|
|
import { describe, expect, it, vi } from "vitest";
|
|
import { loadWithoutEmbeddedPostgresExitHooks } from "./embedded-postgres-lifecycle.js";
|
|
|
|
describe("loadWithoutEmbeddedPostgresExitHooks", () => {
|
|
it("removes every eager exit hook from the real embedded-postgres import", async () => {
|
|
const eventNames = [
|
|
"exit",
|
|
"beforeExit",
|
|
"SIGHUP",
|
|
"SIGINT",
|
|
"SIGTERM",
|
|
"SIGBREAK",
|
|
"message",
|
|
];
|
|
const before = new Map(eventNames.map((eventName) => [
|
|
eventName,
|
|
process.rawListeners(eventName),
|
|
]));
|
|
const moduleName = "embedded-postgres";
|
|
|
|
await loadWithoutEmbeddedPostgresExitHooks(() => import(moduleName));
|
|
|
|
for (const eventName of eventNames) {
|
|
expect(process.rawListeners(eventName)).toEqual(before.get(eventName));
|
|
}
|
|
});
|
|
|
|
it("removes dependency exit hooks while preserving existing listeners", async () => {
|
|
const target = new EventEmitter();
|
|
const existingSignalListener = vi.fn();
|
|
const existingExitListener = vi.fn();
|
|
target.on("SIGTERM", existingSignalListener);
|
|
target.on("exit", existingExitListener);
|
|
|
|
const dependencyListener = vi.fn();
|
|
const loaded = await loadWithoutEmbeddedPostgresExitHooks(
|
|
async () => {
|
|
for (const eventName of [
|
|
"exit",
|
|
"beforeExit",
|
|
"SIGHUP",
|
|
"SIGINT",
|
|
"SIGTERM",
|
|
"SIGBREAK",
|
|
"message",
|
|
]) {
|
|
target.on(eventName, dependencyListener);
|
|
}
|
|
return { default: class EmbeddedPostgres {} };
|
|
},
|
|
target,
|
|
);
|
|
|
|
expect(loaded.default.name).toBe("EmbeddedPostgres");
|
|
expect(target.rawListeners("SIGTERM")).toEqual([existingSignalListener]);
|
|
expect(target.rawListeners("exit")).toEqual([existingExitListener]);
|
|
for (const eventName of ["beforeExit", "SIGHUP", "SIGINT", "SIGBREAK", "message"]) {
|
|
expect(target.rawListeners(eventName)).toEqual([]);
|
|
}
|
|
});
|
|
|
|
it("cleans up listeners even when the import fails", async () => {
|
|
const target = new EventEmitter();
|
|
const dependencyListener = vi.fn();
|
|
|
|
await expect(loadWithoutEmbeddedPostgresExitHooks(
|
|
async () => {
|
|
target.on("SIGTERM", dependencyListener);
|
|
throw new Error("import failed");
|
|
},
|
|
target,
|
|
)).rejects.toThrow("import failed");
|
|
|
|
expect(target.rawListeners("SIGTERM")).toEqual([]);
|
|
});
|
|
});
|