import type { DiscoveredLocalServer } from "@t3tools/contracts"; import { describe, expect, it } from "vite-plus/test"; import { mergeServers } from "./useDiscoveredLocalServers"; const scannerServer = ( overrides: Partial, ): DiscoveredLocalServer & { requestedUrl: string } => ({ host: "localhost", port: 5173, url: "http://localhost:5173", requestedUrl: overrides.url ?? "http://localhost:5173", processName: "vite", pid: 1234, terminal: null, ...overrides, }); describe("mergeServers", () => { it("returns scanner-only entries unchanged", () => { const result = mergeServers({ scanner: [scannerServer({})], configuredUrls: [], }); expect(result).toHaveLength(1); expect(result[0]).toMatchObject({ host: "localhost", port: 5173, requestedUrl: "http://localhost:5173", source: "scanner", processName: "vite", }); }); it("enriches a configured entry with live process metadata when scanner sees it", () => { const result = mergeServers({ scanner: [scannerServer({ port: 5173, processName: "node", pid: 9999 })], configuredUrls: ["http://localhost:5173"], }); expect(result).toHaveLength(1); expect(result[0]).toMatchObject({ port: 5173, source: "configured", processName: "node", pid: 9999, }); }); it("excludes configured entries that the live scanner doesn't see", () => { const result = mergeServers({ scanner: [], configuredUrls: ["http://localhost:5173"], }); expect(result).toHaveLength(0); }); it("ignores non-loopback configured URLs", () => { const result = mergeServers({ scanner: [scannerServer({})], configuredUrls: ["https://example.com", "ws://localhost:5173"], }); expect(result).toHaveLength(1); expect(result[0]?.source).toBe("scanner"); }); it("sorts configured live servers before scanner-only servers", () => { const result = mergeServers({ scanner: [scannerServer({ port: 8080 }), scannerServer({ port: 3000 })], configuredUrls: ["http://localhost:8080"], }); expect(result.map((s) => `${s.source}:${s.port}`)).toEqual(["configured:8080", "scanner:3000"]); }); it("dedupes by lowercased host", () => { const result = mergeServers({ scanner: [scannerServer({ host: "Localhost", port: 5173 })], configuredUrls: ["http://localhost:5173"], }); expect(result).toHaveLength(1); expect(result[0]?.source).toBe("configured"); }); it.each(["127.0.0.1", "0.0.0.0", "[::1]"])( "matches configured loopback alias %s to a live localhost server", (host) => { const result = mergeServers({ scanner: [ scannerServer({ requestedUrl: `http://localhost:5173/dashboard?mode=test#results` }), ], configuredUrls: [`http://${host}:5173/dashboard?mode=test#results`], }); expect(result).toHaveLength(1); expect(result[0]?.source).toBe("configured"); expect(result[0]?.requestedUrl).toBe("http://localhost:5173/dashboard?mode=test#results"); }, ); it("keeps the scanner-verified path and protocol", () => { const result = mergeServers({ scanner: [ scannerServer({ url: "https://env-42.example.dev:5173/", requestedUrl: "http://localhost:5173/dashboard?mode=test#results", }), ], configuredUrls: ["https://localhost:5173/dashboard?mode=test#results"], }); expect(result[0]?.url).toBe("https://env-42.example.dev:5173/"); expect(result[0]?.requestedUrl).toBe("http://localhost:5173/dashboard?mode=test#results"); }); it("overlays a configured path when an older server does not advertise path probing", () => { const result = mergeServers({ scanner: [scannerServer({ requestedUrl: "http://localhost:5173/" })], configuredUrls: ["https://localhost:5173/docs?mode=test#results"], configuredUrlProbing: false, }); expect(result[0]?.requestedUrl).toBe("https://localhost:5173/docs?mode=test#results"); }); it("does not overlay an unverified configured path when the server probes paths", () => { const result = mergeServers({ scanner: [scannerServer({ requestedUrl: "http://localhost:5173/" })], configuredUrls: ["http://localhost:5173/docs"], configuredUrlProbing: true, }); expect(result[0]?.requestedUrl).toBe("http://localhost:5173/"); }); it("keeps a scanner entry's pre-resolution requestedUrl distinct from a resolved url", () => { const result = mergeServers({ scanner: [ scannerServer({ port: 5173, url: "https://env-42.example.dev:5173/", requestedUrl: "http://localhost:5173/", }), ], configuredUrls: [], }); expect(result[0]?.url).toBe("https://env-42.example.dev:5173/"); expect(result[0]?.requestedUrl).toBe("http://localhost:5173/"); }); });