72 lines
2.0 KiB
TypeScript
72 lines
2.0 KiB
TypeScript
/* eslint-disable @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars, @typescript-eslint/require-await, @typescript-eslint/unbound-method */
|
|
import { describe, expect, test } from "bun:test";
|
|
|
|
import type { StartServerOptions } from "../../src/server/server";
|
|
|
|
import { bootstrap, type BootstrapDependencies } from "../../src/server/bootstrap";
|
|
|
|
const origExit = process.exit;
|
|
|
|
describe("bootstrap", () => {
|
|
test("使用默认依赖启动", async () => {
|
|
let started = false;
|
|
let signalRegistered = false;
|
|
|
|
const mockLoadConfig = (async () => ({
|
|
host: "127.0.0.1",
|
|
port: 0,
|
|
})) as unknown as BootstrapDependencies["loadConfig"];
|
|
const mockLogError = () => {};
|
|
const mockOnSignal = (_signal: string, _handler: () => void) => {
|
|
signalRegistered = true;
|
|
};
|
|
const mockStartServer = (_options: StartServerOptions) => {
|
|
started = true;
|
|
return {};
|
|
};
|
|
|
|
const deps: BootstrapDependencies = {
|
|
loadConfig: mockLoadConfig,
|
|
logError: mockLogError,
|
|
onSignal: mockOnSignal,
|
|
startServer: mockStartServer,
|
|
};
|
|
|
|
await bootstrap({ mode: "production" }, deps);
|
|
|
|
expect(started).toBe(true);
|
|
expect(signalRegistered).toBe(true);
|
|
});
|
|
|
|
test("启动失败时调用 logError", async () => {
|
|
let errorLogged = false;
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
|
|
process.exit = ((code?: number) => {
|
|
throw new Error("process.exit called");
|
|
}) as unknown as typeof process.exit;
|
|
|
|
const deps: BootstrapDependencies = {
|
|
loadConfig: async () => {
|
|
throw new Error("test config error");
|
|
},
|
|
logError: () => {
|
|
errorLogged = true;
|
|
},
|
|
startServer: () => {
|
|
throw new Error("should not reach");
|
|
},
|
|
};
|
|
|
|
try {
|
|
await bootstrap({ mode: "production" }, deps);
|
|
} catch {
|
|
// process.exit throws to interrupt flow
|
|
}
|
|
|
|
process.exit = origExit;
|
|
|
|
expect(errorLogged).toBe(true);
|
|
});
|
|
});
|