183 lines · 7.5 KB · TypeScript
RawDownload
import { EnvironmentId } from "@t3tools/contracts";import { beforeEach, describe, expect, it, vi } from "vite-plus/test"; const readPreparedConnection = vi.fn(); vi.mock("~/state/session", () => ({ readPreparedConnection })); describe("browser target resolver", () => {  beforeEach(() => readPreparedConnection.mockReset());   it("maps environment ports onto a private network host", async () => {    readPreparedConnection.mockReturnValue({ httpBaseUrl: "http://192.168.1.25:3773" });    const { resolveBrowserNavigationTarget } = await import("./browserTargetResolver");    expect(      resolveBrowserNavigationTarget(EnvironmentId.make("environment-1"), {        kind: "environment-port",        port: 5173,        path: "/dashboard",      }),    ).toEqual({      requestedUrl: "http://localhost:5173/dashboard",      resolvedUrl: "http://192.168.1.25:5173/dashboard",      resolutionKind: "direct-private-network",      environmentId: "environment-1",    });  });   it("maps localhost URL navigation onto a remote Tailscale IPv4 host", async () => {    readPreparedConnection.mockReturnValue({ httpBaseUrl: "http://100.65.180.100:3773" });    const { resolveBrowserNavigationTarget } = await import("./browserTargetResolver");    expect(      resolveBrowserNavigationTarget(EnvironmentId.make("environment-1"), {        kind: "url",        url: "http://localhost:5173/dashboard?mode=test#results",      }),    ).toEqual({      requestedUrl: "http://localhost:5173/dashboard?mode=test#results",      resolvedUrl: "http://100.65.180.100:5173/dashboard?mode=test#results",      resolutionKind: "direct-private-network",      environmentId: "environment-1",    });  });   it("preserves URL credentials when mapping localhost onto a remote host", async () => {    readPreparedConnection.mockReturnValue({ httpBaseUrl: "http://100.65.180.100:3773" });    const { resolveBrowserNavigationTarget } = await import("./browserTargetResolver");    expect(      resolveBrowserNavigationTarget(EnvironmentId.make("environment-1"), {        kind: "url",        url: "http://user:p%40ss@localhost:5173/dashboard",      }).resolvedUrl,    ).toBe("http://user:p%40ss@100.65.180.100:5173/dashboard");  });   it("maps credentialed localhost URLs onto private IPv6 hosts", async () => {    readPreparedConnection.mockReturnValue({      httpBaseUrl: "http://[fd7a:115c:a1e0::53]:3773",    });    const { resolveBrowserNavigationTarget } = await import("./browserTargetResolver");    expect(      resolveBrowserNavigationTarget(EnvironmentId.make("environment-1"), {        kind: "url",        url: "http://user:p%40ss@localhost:5173/dashboard?mode=test#results",      }).resolvedUrl,    ).toBe("http://user:p%40ss@[fd7a:115c:a1e0::53]:5173/dashboard?mode=test#results");  });   it("maps schemeless localhost navigation onto a remote environment host", async () => {    readPreparedConnection.mockReturnValue({ httpBaseUrl: "http://192.168.1.25:3773" });    const { resolveBrowserNavigationTarget } = await import("./browserTargetResolver");    expect(      resolveBrowserNavigationTarget(EnvironmentId.make("environment-1"), {        kind: "url",        url: "localhost:3000/app",      }).resolvedUrl,    ).toBe("http://192.168.1.25:3000/app");  });   it("keeps localhost navigation local for a local environment", async () => {    readPreparedConnection.mockReturnValue({ httpBaseUrl: "http://127.0.0.1:3773" });    const { resolveBrowserNavigationTarget } = await import("./browserTargetResolver");    expect(      resolveBrowserNavigationTarget(EnvironmentId.make("environment-1"), {        kind: "url",        url: "localhost:3000/app",      }),    ).toEqual({      requestedUrl: "localhost:3000/app",      resolvedUrl: "localhost:3000/app",      resolutionKind: "direct",      environmentId: "environment-1",    });  });   it("keeps localhost navigation local for the full IPv4 loopback range", async () => {    readPreparedConnection.mockReturnValue({ httpBaseUrl: "http://127.0.0.2:3773" });    const { resolveBrowserNavigationTarget } = await import("./browserTargetResolver");    expect(      resolveBrowserNavigationTarget(EnvironmentId.make("environment-1"), {        kind: "url",        url: "http://localhost:3000/app",      }),    ).toEqual({      requestedUrl: "http://localhost:3000/app",      resolvedUrl: "http://localhost:3000/app",      resolutionKind: "direct",      environmentId: "environment-1",    });  });   it("refuses public relay hosts until the authenticated gateway exists", async () => {    readPreparedConnection.mockReturnValue({ httpBaseUrl: "https://relay.example.com" });    const { resolveBrowserNavigationTarget } = await import("./browserTargetResolver");    expect(() =>      resolveBrowserNavigationTarget(EnvironmentId.make("environment-1"), {        kind: "environment-port",        port: 5173,      }),    ).toThrow(/authenticated preview gateway/);    expect(() =>      resolveBrowserNavigationTarget(EnvironmentId.make("environment-1"), {        kind: "url",        url: "http://localhost:5173",      }),    ).toThrow(/authenticated preview gateway/);  });   it("normalizes schemeless localhost server-picker values", async () => {    readPreparedConnection.mockReturnValue({ httpBaseUrl: "http://localhost:3773" });    const { resolveDiscoveredServerUrl } = await import("./browserTargetResolver");    expect(resolveDiscoveredServerUrl(EnvironmentId.make("environment-1"), "localhost:5173")).toBe(      "http://localhost:5173/",    );    expect(      resolveDiscoveredServerUrl(EnvironmentId.make("environment-1"), "0.0.0.0:3000/app"),    ).toBe("http://localhost:3000/app");  });   it("preserves localhost server-picker values when the prepared base is 127.0.0.1", async () => {    readPreparedConnection.mockReturnValue({ httpBaseUrl: "http://127.0.0.1:3773" });    const { resolveDiscoveredServerUrl } = await import("./browserTargetResolver");    expect(      resolveDiscoveredServerUrl(EnvironmentId.make("environment-1"), "localhost:5173/app?x=1#top"),    ).toBe("http://localhost:5173/app?x=1#top");  });   it("normalizes public URLs without treating them as environment ports", async () => {    const { resolveDiscoveredServerUrl } = await import("./browserTargetResolver");    expect(resolveDiscoveredServerUrl(EnvironmentId.make("environment-1"), "example.com/app")).toBe(      "https://example.com/app",    );  });   it("supports private IPv6 environment hosts", async () => {    readPreparedConnection.mockReturnValue({      httpBaseUrl: "http://[fd7a:115c:a1e0::53]:3773",    });    const { resolveBrowserNavigationTarget } = await import("./browserTargetResolver");    expect(      resolveBrowserNavigationTarget(EnvironmentId.make("environment-1"), {        kind: "environment-port",        port: 5173,        path: "/app?mode=test",      }).resolvedUrl,    ).toBe("http://[fd7a:115c:a1e0::53]:5173/app?mode=test");  });   it("supports a local IPv6 environment host", async () => {    readPreparedConnection.mockReturnValue({ httpBaseUrl: "http://[::1]:3773" });    const { resolveBrowserNavigationTarget } = await import("./browserTargetResolver");    expect(      resolveBrowserNavigationTarget(EnvironmentId.make("environment-1"), {        kind: "environment-port",        port: 5173,      }).resolvedUrl,    ).toBe("http://[::1]:5173/");  });   it("leaves malformed input for the normal navigation error path", async () => {    const { resolveDiscoveredServerUrl } = await import("./browserTargetResolver");    expect(resolveDiscoveredServerUrl(EnvironmentId.make("environment-1"), "   ")).toBe("   ");  });});