| 1 | import assert from "node:assert/strict"; |
| 2 | import { test } from "node:test"; |
| 3 | |
| 4 | import { workspaceRedirect, workspaceTab, workspaceTabs } from "./workspace-nav.ts"; |
| 5 | |
| 6 | test("everyone sees Overview, Projects and Packages; members and owners see more", () => { |
| 7 | const keys = (member: boolean, owner: boolean) => workspaceTabs("acme", { member, owner }).map((tab) => tab.key); |
| 8 | assert.deepEqual(keys(false, false), ["overview", "projects", "packages"]); |
| 9 | assert.deepEqual(keys(true, false), ["overview", "projects", "packages", "teams", "people", "insights"]); |
| 10 | assert.deepEqual(keys(true, true), ["overview", "projects", "packages", "teams", "people", "insights", "settings"]); |
| 11 | }); |
| 12 | |
| 13 | test("tabs carry counts, and say which are coming", () => { |
| 14 | const tabs = workspaceTabs("acme", { member: true, owner: false, projects: 412, people: 7 }); |
| 15 | assert.equal(tabs.find((tab) => tab.key === "projects")?.count, 412); |
| 16 | assert.equal(tabs.find((tab) => tab.key === "people")?.count, 7); |
| 17 | assert.equal(tabs.find((tab) => tab.key === "teams")?.soon, true); |
| 18 | assert.equal(tabs.find((tab) => tab.key === "overview")?.to, "/acme"); |
| 19 | assert.equal(tabs.find((tab) => tab.key === "projects")?.to, "/acme/-/projects"); |
| 20 | }); |
| 21 | |
| 22 | test("a path is a tab, or one of the workspace's other pages", () => { |
| 23 | assert.equal(workspaceTab("/acme", "acme"), "overview"); |
| 24 | assert.equal(workspaceTab("/Acme/", "acme"), "overview"); |
| 25 | assert.equal(workspaceTab("/acme/-/projects", "acme"), "projects"); |
| 26 | assert.equal(workspaceTab("/acme/-/people", "acme"), "people"); |
| 27 | assert.equal(workspaceTab("/acme/-/packages", "acme"), "packages"); |
| 28 | // One package has a page of its own; settings and the rest have headings. |
| 29 | assert.equal(workspaceTab("/acme/-/packages/npm/web", "acme"), null); |
| 30 | assert.equal(workspaceTab("/acme/-/settings", "acme"), null); |
| 31 | assert.equal(workspaceTab("/acme/-/agents", "acme"), null); |
| 32 | assert.equal(workspaceTab("/acme/web", "acme"), null); |
| 33 | assert.equal(workspaceTab("/other", "acme"), null); |
| 34 | }); |
| 35 | |
| 36 | test("old addresses go to where their pages are now", () => { |
| 37 | assert.equal(workspaceRedirect("/acme/-/members"), "/acme/-/people"); |
| 38 | assert.equal(workspaceRedirect("/acme/-/overview"), "/acme"); |
| 39 | assert.equal(workspaceRedirect("/acme/-/soon/teams"), "/acme/-/teams"); |
| 40 | assert.equal(workspaceRedirect("/acme/-/soon/insights", "?x=1"), "/acme/-/insights?x=1"); |
| 41 | assert.equal(workspaceRedirect("/acme/-/soon/board"), null); |
| 42 | assert.equal(workspaceRedirect("/acme/-/people"), null); |
| 43 | assert.equal(workspaceRedirect("/acme/web"), null); |
| 44 | }); |
| 45 | |
| 46 | test("?tab= opens that tab, keeping the rest of the query", () => { |
| 47 | assert.equal(workspaceRedirect("/acme", "?tab=repositories"), "/acme/-/projects"); |
| 48 | assert.equal(workspaceRedirect("/acme", "?tab=projects&q=api"), "/acme/-/projects?q=api"); |
| 49 | assert.equal(workspaceRedirect("/acme", "?tab=members"), "/acme/-/people"); |
| 50 | assert.equal(workspaceRedirect("/acme", "?tab=overview"), "/acme"); |
| 51 | assert.equal(workspaceRedirect("/acme", "?tab=nonsense"), null); |
| 52 | assert.equal(workspaceRedirect("/acme", ""), null); |
| 53 | }); |