Skip to content
Source
Sign inSign up

projectIcon.test.ts

81 lines2.7 KB

1import type { ProjectIconOverride } from "@t3tools/contracts";
2import { describe, expect, it } from "vite-plus/test";
3​
4import { projectAutoMonogram, resolveProjectChipIcon } from "./projectIcon";
5​
6const project = (title: string, projectIcon?: ProjectIconOverride) => ({
7 title,
8 workspaceRoot: `/work/${title}`,
9 projectIcon,
10});
11​
12describe("resolveProjectChipIcon", () => {
13 const favicon = () => "https://env.example/favicon.png";
14 const noFavicon = () => null;
15​
16 it("shows the chat bubble for unknown threads and the no-project folder", () => {
17 expect(resolveProjectChipIcon(null, "/scratch", favicon)).toBeNull();
18 expect(resolveProjectChipIcon(project("scratch"), "/work/scratch", favicon)).toBeNull();
19 });
20​
21 it("prefers a custom icon over the favicon", () => {
22 expect(
23 resolveProjectChipIcon(
24 project("t3code", { kind: "monogram", text: "Q7", color: "violet" }),
25 null,
26 favicon,
27 ),
28 ).toEqual({ kind: "monogram", text: "Q7", color: "violet" });
29 expect(
30 resolveProjectChipIcon(project("t3code", { kind: "emoji", emoji: "🚀" }), null, favicon),
31 ).toEqual({ kind: "emoji", emoji: "🚀" });
32 expect(
33 resolveProjectChipIcon(
34 project("lucide proj", { kind: "lucide", name: "rocket", color: "emerald" }),
35 null,
36 favicon,
37 ),
38 ).toEqual({ kind: "monogram", text: "LP", color: "emerald" });
39 });
40​
41 it("uses the favicon, then a monogram of the title", () => {
42 expect(resolveProjectChipIcon(project("t3code"), null, favicon)).toEqual({
43 kind: "favicon",
44 uri: "https://env.example/favicon.png",
45 });
46 expect(resolveProjectChipIcon(project("Auto Monogram"), null, noFavicon)).toEqual({
47 kind: "monogram",
48 text: "AM",
49 color: "lime",
50 });
51 expect(
52 resolveProjectChipIcon(
53 project("t3code"),
54 null,
55 () => "https://env.example/api/assets/project-favicon-missing",
56 ),
57 ).toMatchObject({ kind: "monogram" });
58 });
59});
60​
61describe("projectAutoMonogram", () => {
62 it("matches desktop's deriveProjectIdentity", () => {
63 const desktop = [
64 ["t3code", "T3", "teal"],
65 ["Auto Monogram", "AM", "lime"],
66 ["blitzdiff", "BF", "pink"],
67 ["uoalbumdotclub", "UB", "gray"],
68 [" Tagium ", "TM", "lime"],
69 ["Café Ünïcode", "CÜ", "fuchsia"],
70 ["web2 app", "W2", "emerald"],
71 ] as const;
72 for (const [title, text, color] of desktop) {
73 expect(projectAutoMonogram(title)).toEqual({ kind: "monogram", text, color });
74 }
75 });
76​
77 it("leaves untitled projects to the folder icon, like desktop", () => {
78 expect(projectAutoMonogram("")).toBeNull();
79 expect(projectAutoMonogram(" ")).toBeNull();
80 });
81});