Skip to content

g1t/apps/web/app/lib/workspace-nav.test.ts

61 lines3,589 bytesCodeBlame
1import assert from "node:assert/strict";
2import { test } from "node:test";
3
4import { pagePath, workspaceRedirect, workspaceTab, workspaceTabs } from "./workspace-nav.ts";
5
6test("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
13test("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, undefined);
18 assert.equal(tabs.find((tab) => tab.key === "insights")?.soon, true);
19 assert.equal(tabs.find((tab) => tab.key === "overview")?.to, "/acme");
20 assert.equal(tabs.find((tab) => tab.key === "projects")?.to, "/acme/-/projects");
21});
22
23test("a path is a tab, or one of the workspace's other pages", () => {
24 assert.equal(workspaceTab("/acme", "acme"), "overview");
25 assert.equal(workspaceTab("/Acme/", "acme"), "overview");
26 assert.equal(workspaceTab("/acme/-/projects", "acme"), "projects");
27 assert.equal(workspaceTab("/acme/-/people", "acme"), "people");
28 assert.equal(workspaceTab("/acme/-/packages", "acme"), "packages");
29 // One package has a page of its own; settings and the rest have headings.
30 assert.equal(workspaceTab("/acme/-/packages/npm/web", "acme"), null);
31 assert.equal(workspaceTab("/acme/-/settings", "acme"), null);
32 assert.equal(workspaceTab("/acme/-/agents", "acme"), null);
33 assert.equal(workspaceTab("/acme/web", "acme"), null);
34 assert.equal(workspaceTab("/other", "acme"), null);
35});
36
37test("old addresses go to where their pages are now", () => {
38 assert.equal(workspaceRedirect("/acme/-/members"), "/acme/-/people");
39 assert.equal(workspaceRedirect("/acme/-/overview"), "/acme");
40 assert.equal(workspaceRedirect("/acme/-/soon/teams"), "/acme/-/teams");
41 assert.equal(workspaceRedirect("/acme/-/soon/insights", "?x=1"), "/acme/-/insights?x=1");
42 assert.equal(workspaceRedirect("/acme/-/soon/board"), null);
43 assert.equal(workspaceRedirect("/acme/-/people"), null);
44 assert.equal(workspaceRedirect("/acme/web"), null);
45});
46
47test("?tab= opens that tab, keeping the rest of the query", () => {
48 assert.equal(workspaceRedirect("/acme", "?tab=repositories"), "/acme/-/projects");
49 assert.equal(workspaceRedirect("/acme", "?tab=projects&q=api"), "/acme/-/projects?q=api");
50 assert.equal(workspaceRedirect("/acme", "?tab=members"), "/acme/-/people");
51 assert.equal(workspaceRedirect("/acme", "?tab=overview"), "/acme");
52 assert.equal(workspaceRedirect("/acme", "?tab=nonsense"), null);
53 assert.equal(workspaceRedirect("/acme", ""), null);
54});
55
56test("a click's data request is for the same page as a full load", () => {
57 assert.equal(pagePath("/acme/-/insights.data"), "/acme/-/insights");
58 assert.equal(pagePath("/acme/-/insights/"), "/acme/-/insights");
59 assert.equal(workspaceRedirect("/acme/-/members.data", "?_routes=routes%2Fworkspace%2Fmoved-members"), "/acme/-/people");
60 assert.equal(workspaceRedirect("/acme/-/members.data", "?_routes=x&q=ada"), "/acme/-/people?q=ada");
61});