fix: add gateway close context
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
|
||||
const loadConfig = vi.fn();
|
||||
const resolveGatewayPort = vi.fn();
|
||||
@@ -7,7 +7,12 @@ const pickPrimaryTailnetIPv4 = vi.fn();
|
||||
let lastClientOptions: {
|
||||
url?: string;
|
||||
onHelloOk?: () => void | Promise<void>;
|
||||
onClose?: (code: number, reason: string) => void;
|
||||
} | null = null;
|
||||
type StartMode = "hello" | "close" | "silent";
|
||||
let startMode: StartMode = "hello";
|
||||
let closeCode = 1006;
|
||||
let closeReason = "";
|
||||
|
||||
vi.mock("../config/config.js", async (importOriginal) => {
|
||||
const actual = await importOriginal<typeof import("../config/config.js")>();
|
||||
@@ -27,6 +32,7 @@ vi.mock("./client.js", () => ({
|
||||
constructor(opts: {
|
||||
url?: string;
|
||||
onHelloOk?: () => void | Promise<void>;
|
||||
onClose?: (code: number, reason: string) => void;
|
||||
}) {
|
||||
lastClientOptions = opts;
|
||||
}
|
||||
@@ -34,7 +40,11 @@ vi.mock("./client.js", () => ({
|
||||
return { ok: true };
|
||||
}
|
||||
start() {
|
||||
void lastClientOptions?.onHelloOk?.();
|
||||
if (startMode === "hello") {
|
||||
void lastClientOptions?.onHelloOk?.();
|
||||
} else if (startMode === "close") {
|
||||
lastClientOptions?.onClose?.(closeCode, closeReason);
|
||||
}
|
||||
}
|
||||
stop() {}
|
||||
},
|
||||
@@ -48,6 +58,9 @@ describe("callGateway url resolution", () => {
|
||||
resolveGatewayPort.mockReset();
|
||||
pickPrimaryTailnetIPv4.mockReset();
|
||||
lastClientOptions = null;
|
||||
startMode = "hello";
|
||||
closeCode = 1006;
|
||||
closeReason = "";
|
||||
});
|
||||
|
||||
it("uses tailnet IP when local bind is tailnet", async () => {
|
||||
@@ -80,3 +93,63 @@ describe("callGateway url resolution", () => {
|
||||
expect(lastClientOptions?.url).toBe("ws://127.0.0.1:18800");
|
||||
});
|
||||
});
|
||||
|
||||
describe("callGateway error details", () => {
|
||||
beforeEach(() => {
|
||||
loadConfig.mockReset();
|
||||
resolveGatewayPort.mockReset();
|
||||
pickPrimaryTailnetIPv4.mockReset();
|
||||
lastClientOptions = null;
|
||||
startMode = "hello";
|
||||
closeCode = 1006;
|
||||
closeReason = "";
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
vi.useRealTimers();
|
||||
});
|
||||
|
||||
it("includes connection details when the gateway closes", async () => {
|
||||
startMode = "close";
|
||||
closeCode = 1006;
|
||||
closeReason = "";
|
||||
loadConfig.mockReturnValue({ gateway: { mode: "local", bind: "loopback" } });
|
||||
resolveGatewayPort.mockReturnValue(18789);
|
||||
pickPrimaryTailnetIPv4.mockReturnValue(undefined);
|
||||
|
||||
let err: Error | null = null;
|
||||
try {
|
||||
await callGateway({ method: "health" });
|
||||
} catch (caught) {
|
||||
err = caught as Error;
|
||||
}
|
||||
|
||||
expect(err?.message).toContain("gateway closed (1006");
|
||||
expect(err?.message).toContain("Gateway target: ws://127.0.0.1:18789");
|
||||
expect(err?.message).toContain("Source: local loopback");
|
||||
expect(err?.message).toContain("Bind: loopback");
|
||||
});
|
||||
|
||||
it("includes connection details on timeout", async () => {
|
||||
startMode = "silent";
|
||||
loadConfig.mockReturnValue({ gateway: { mode: "local", bind: "loopback" } });
|
||||
resolveGatewayPort.mockReturnValue(18789);
|
||||
pickPrimaryTailnetIPv4.mockReturnValue(undefined);
|
||||
|
||||
vi.useFakeTimers();
|
||||
let err: Error | null = null;
|
||||
const promise = callGateway({ method: "health", timeoutMs: 5 }).catch(
|
||||
(caught) => {
|
||||
err = caught as Error;
|
||||
},
|
||||
);
|
||||
|
||||
await vi.advanceTimersByTimeAsync(5);
|
||||
await promise;
|
||||
|
||||
expect(err?.message).toContain("gateway timeout after 5ms");
|
||||
expect(err?.message).toContain("Gateway target: ws://127.0.0.1:18789");
|
||||
expect(err?.message).toContain("Source: local loopback");
|
||||
expect(err?.message).toContain("Bind: loopback");
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user