Skip to content
Source
Sign inSign up
Open History to see the last commit

threadActionMenu.logic.test.ts

77 lines2.1 KB

1import { describe, expect, it } from "vite-plus/test";
2​
3import { buildThreadActionMenuItems, type ThreadActionMenuState } from "./threadActionMenu.logic";
4​
5const baseState: ThreadActionMenuState = {
6 canOperate: true,
7 branch: null,
8 projectFilter: null,
9 isPinned: false,
10 isSettled: false,
11 autoSettleEnabled: true,
12 isSnoozed: false,
13 canSnoozeNow: true,
14 isRegeneratingTitle: false,
15 isRunning: false,
16 supports: {
17 settlement: true,
18 autoSettleOptOut: true,
19 snooze: true,
20 pinning: true,
21 titleRegeneration: true,
22 },
23 snoozePresets: [
24 { id: "hour", label: "In 1 hour", whenLabel: "3:00 PM", snoozedUntil: "2026-08-07T15:00:00Z" },
25 ],
26};
27​
28describe("buildThreadActionMenuItems", () => {
29 it.each([false, true])(
30 "disables both lifecycle directions without permission (reversed: %s)",
31 (reversed) => {
32 const items = buildThreadActionMenuItems({
33 ...baseState,
34 canOperate: false,
35 isPinned: reversed,
36 isSettled: reversed,
37 isSnoozed: reversed,
38 });
39 const expected = reversed
40 ? [
41 "unpin",
42 "unsettle",
43 "unsnooze",
44 "rename",
45 "regenerate-title",
46 "auto-settle",
47 "archive",
48 "delete",
49 ]
50 : [
51 "pin",
52 "settle",
53 "snooze",
54 "rename",
55 "regenerate-title",
56 "auto-settle",
57 "archive",
58 "delete",
59 ];
60 expect(items.filter((item) => item.disabled).map((item) => item.id)).toEqual(expected);
61 expect(
62 items.find((item) => item.id === "snooze")?.children?.every((child) => child.disabled) ??
63 true,
64 ).toBe(true);
65 },
66 );
67​
68 it("disables archive and turning into a project while the thread is running", () => {
69 const items = buildThreadActionMenuItems({
70 ...baseState,
71 isRunning: true,
72 canTurnIntoProject: true,
73 });
74 expect(items.find((item) => item.id === "archive")?.disabled).toBe(true);
75 expect(items.find((item) => item.id === "turn-into-project")?.disabled).toBe(true);
76 });
77});