import { describe, expect, it, vi } from "vitest"; import { resolveGatewayBindUrl } from "./gateway-bind-url.js"; describe("shared/gateway-bind-url", () => { it("returns null for loopback/default binds", () => { const pickTailnetHost = vi.fn(() => "100.64.0.1"); const pickLanHost = vi.fn(() => "192.168.1.2"); expect( resolveGatewayBindUrl({ scheme: "ws", port: 18789, pickTailnetHost, pickLanHost, }), ).toBeNull(); expect(pickTailnetHost).not.toHaveBeenCalled(); expect(pickLanHost).not.toHaveBeenCalled(); }); it("resolves custom binds only when custom host is present after trimming", () => { const pickTailnetHost = vi.fn(); const pickLanHost = vi.fn(); expect( resolveGatewayBindUrl({ bind: "custom", customBindHost: " gateway.local ", scheme: "wss", port: 443, pickTailnetHost, pickLanHost, }), ).toEqual({ url: "wss://gateway.local:443", source: "gateway.bind=custom", }); expect( resolveGatewayBindUrl({ bind: "custom", customBindHost: " ", scheme: "ws", port: 18789, pickTailnetHost, pickLanHost, }), ).toEqual({ error: "gateway.bind=custom requires gateway.customBindHost.", }); expect(pickTailnetHost).not.toHaveBeenCalled(); expect(pickLanHost).not.toHaveBeenCalled(); }); it("resolves tailnet and lan binds or returns clear errors", () => { expect( resolveGatewayBindUrl({ bind: "tailnet", scheme: "ws", port: 18789, pickTailnetHost: () => "100.64.0.1", pickLanHost: vi.fn(), }), ).toEqual({ url: "ws://100.64.0.1:18789", source: "gateway.bind=tailnet", }); expect( resolveGatewayBindUrl({ bind: "tailnet", scheme: "ws", port: 18789, pickTailnetHost: () => null, pickLanHost: vi.fn(), }), ).toEqual({ error: "gateway.bind=tailnet set, but no tailnet IP was found.", }); expect( resolveGatewayBindUrl({ bind: "lan", scheme: "wss", port: 8443, pickTailnetHost: vi.fn(), pickLanHost: () => "192.168.1.2", }), ).toEqual({ url: "wss://192.168.1.2:8443", source: "gateway.bind=lan", }); expect( resolveGatewayBindUrl({ bind: "lan", scheme: "ws", port: 18789, pickTailnetHost: vi.fn(), pickLanHost: () => null, }), ).toEqual({ error: "gateway.bind=lan set, but no private LAN IP was found.", }); }); it("returns null for unrecognized bind values without probing pickers", () => { const pickTailnetHost = vi.fn(() => "100.64.0.1"); const pickLanHost = vi.fn(() => "192.168.1.2"); expect( resolveGatewayBindUrl({ bind: "loopbackish", scheme: "ws", port: 18789, pickTailnetHost, pickLanHost, }), ).toBeNull(); expect(pickTailnetHost).not.toHaveBeenCalled(); expect(pickLanHost).not.toHaveBeenCalled(); }); });