import { describe, expect, it } from "vite-plus/test"; import { RemoteBackendUrlInvalidError, RemoteBackendUrlMissingError, RemotePairingTokenMissingError, RemotePairingUrlInvalidError, resolveRemotePairingTarget, } from "./remote.ts"; describe("remote", () => { it("derives backend urls and token from a pairing url", () => { expect( resolveRemotePairingTarget({ pairingUrl: "https://remote.example.com/pair#token=pairing-token", }), ).toEqual({ credential: "pairing-token", httpBaseUrl: "https://remote.example.com/", wsBaseUrl: "wss://remote.example.com/", }); }); it("accepts pairing urls that still use a query token", () => { expect( resolveRemotePairingTarget({ pairingUrl: "https://remote.example.com/pair?token=pairing-token", }), ).toEqual({ credential: "pairing-token", httpBaseUrl: "https://remote.example.com/", wsBaseUrl: "wss://remote.example.com/", }); }); it("derives backend urls from hosted app pairing links", () => { expect( resolveRemotePairingTarget({ pairingUrl: "https://app.t3.codes/pair?host=https%3A%2F%2Fdesktop.tailnet.ts.net%3A44342%2F#token=pairing-token", }), ).toEqual({ credential: "pairing-token", httpBaseUrl: "https://desktop.tailnet.ts.net:44342/", wsBaseUrl: "wss://desktop.tailnet.ts.net:44342/", }); }); it("derives backend urls from a host and pairing code", () => { expect( resolveRemotePairingTarget({ host: "https://remote.example.com", pairingCode: "pairing-token", }), ).toEqual({ credential: "pairing-token", httpBaseUrl: "https://remote.example.com/", wsBaseUrl: "wss://remote.example.com/", }); }); it("preserves host ports when normalizing a bare host input", () => { expect( resolveRemotePairingTarget({ host: "myserver.com:3000", pairingCode: "pairing-token", }), ).toEqual({ credential: "pairing-token", httpBaseUrl: "https://myserver.com:3000/", wsBaseUrl: "wss://myserver.com:3000/", }); }); it("uses distinct structural errors for missing pairing inputs", () => { expect(() => resolveRemotePairingTarget({})).toThrowError(RemoteBackendUrlMissingError); expect(() => resolveRemotePairingTarget({ pairingUrl: "https://remote.example.com/pair" }), ).toThrowError(RemotePairingTokenMissingError); expect(() => resolveRemotePairingTarget({ host: "https://user:secret@remote.example.com/path?token=sensitive#fragment", }), ).toThrowError( expect.objectContaining({ _tag: "RemotePairingCodeMissingError", host: "remote.example.com", }), ); }); it("preserves URL parsing causes with their input source", () => { let pairingUrlError: unknown; try { resolveRemotePairingTarget({ pairingUrl: "not a url" }); } catch (cause) { pairingUrlError = cause; } expect(pairingUrlError).toBeInstanceOf(RemotePairingUrlInvalidError); expect((pairingUrlError as RemotePairingUrlInvalidError).cause).toBeInstanceOf(TypeError); let hostError: unknown; try { resolveRemotePairingTarget({ host: "https://[invalid", pairingCode: "pairing-token" }); } catch (cause) { hostError = cause; } expect(hostError).toBeInstanceOf(RemoteBackendUrlInvalidError); expect(hostError).toMatchObject({ source: "direct-host" }); expect((hostError as RemoteBackendUrlInvalidError).cause).toBeInstanceOf(TypeError); }); });