Skip to content

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

53 lines3,057 bytesCodeBlame
1import assert from "node:assert/strict";
2import { test } from "node:test";
3
4import { 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, 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
22test("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
36test("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
46test("?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});