import { describe, expect, it, vi } from "vitest"; import { buildWebSurfaceWindowUrl, openWebSurfaceInBrowser, parseWebSurfaceWindowParams, } from "./webSurfaceNavigation"; describe("web surface navigation (#204)", () => { it("builds and parses a detached web surface URL", () => { const url = buildWebSurfaceWindowUrl({ baseHref: "https://idea.local/workspace?old=1#ignored", panel: "tickets", projectId: "p-1", projectRoot: "/srv/demo project", projectName: "Demo", focusSprintId: "s-1", }); expect(url).toBe( "https://idea.local/workspace?webPanel=tickets&projectId=p-1&projectRoot=%2Fsrv%2Fdemo+project&projectName=Demo&focusSprintId=s-1", ); expect(parseWebSurfaceWindowParams(new URL(url).search)).toEqual({ panel: "tickets", projectId: "p-1", projectRoot: "/srv/demo project", projectName: "Demo", focusSprintId: "s-1", }); }); it("rejects non-openable or incomplete detached surface URLs", () => { expect(parseWebSurfaceWindowParams("?webPanel=projects&projectId=p&projectRoot=/x&projectName=X")).toBeNull(); expect(parseWebSurfaceWindowParams("?webPanel=tickets&projectId=p&projectRoot=/x")).toBeNull(); }); it("falls back from browser window to tab when the popup is blocked", () => { const open = vi .fn((..._args: Parameters): ReturnType => null) .mockReturnValueOnce(null) .mockReturnValueOnce({ closed: false } as Window); const outcome = openWebSurfaceInBrowser( { baseHref: "https://idea.local/", panel: "git", projectId: "p-1", projectRoot: "/srv/demo", projectName: "Demo", }, "window", open, ); expect(outcome.result).toBe("tab"); expect(open).toHaveBeenNthCalledWith( 1, outcome.url, "idea-web-git", "popup,width=1280,height=900,noopener,noreferrer", ); expect(open).toHaveBeenNthCalledWith(2, outcome.url, "_blank", "noopener,noreferrer"); }); });