import { describe, expect, test } from "bun:test" import { ServerConnection } from "@/context/server" import { legacySessionHref, legacySessionServer, requireServerKey, rootSession, sessionHref } from "./session-route" describe("session routes", () => { test("uses the unique persisted server for a legacy session route", () => { expect( legacySessionServer( [{ type: "session", server: ServerConnection.Key.make("server-b"), sessionId: "session-1" }], "session-1", ServerConnection.Key.make("server-a"), ), ).toBe(ServerConnection.Key.make("server-b")) }) test("prefers the active server when a legacy session ID is ambiguous", () => { expect( legacySessionServer( [ { type: "session", server: ServerConnection.Key.make("server-a"), sessionId: "session-1" }, { type: "session", server: ServerConnection.Key.make("server-b"), sessionId: "session-1" }, ], "session-1", ServerConnection.Key.make("server-b"), ), ).toBe(ServerConnection.Key.make("server-b")) }) test("builds and decodes a server-keyed session route", () => { const server = ServerConnection.Key.make("https://example.com:4096") const href = sessionHref(server, "session-1") expect(href).toBe("/server/aHR0cHM6Ly9leGFtcGxlLmNvbTo0MDk2/session/session-1") expect(requireServerKey(href.split("/")[2])).toBe(server) }) test("rejects malformed server keys", () => { expect(() => requireServerKey("not-base64")).toThrow("Invalid server route") }) test("builds the legacy directory-keyed route", () => { expect(legacySessionHref("/Users/example/project", "session-1")).toBe( "/L1VzZXJzL2V4YW1wbGUvcHJvamVjdA/session/session-1", ) }) test("resolves the root session", async () => { const sessions: Record = { child: { id: "child", parentID: "parent" }, parent: { id: "parent", parentID: "root" }, root: { id: "root" }, } expect( await rootSession(sessions.child, async (id) => { const session = sessions[id] if (!session) throw new Error(`Missing session: ${id}`) return session }), ).toBe(sessions.root) }) test("rejects a parent cycle", async () => { const sessions: Record = { child: { id: "child", parentID: "parent" }, parent: { id: "parent", parentID: "child" }, } expect(rootSession(sessions.child, async (id) => sessions[id]!)).rejects.toThrow("Session parent cycle: child") }) })