Commit 2daff8c

Browse files
authored
test(web): remove tests for unreachable helpers (#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
1 parent 8dcb963 commit 2daff8c

13 files changed

Lines changed: 3 additions & 282 deletions

‎apps/web/src/appearanceFonts.test.ts‎

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@ import {
55
clampCodeFontSize,
66
clampInterfaceFontSize,
77
clampPromptFontSize,
8-
DEFAULT_CODE_FONT_STACK,
9-
DEFAULT_SANS_FONT_STACK,
10-
appearanceFontStack,
118
cssFontFamilies,
129
resolveDefaultFamilyLabel,
1310
resolveTerminalFontPreference,
@@ -58,18 +55,6 @@ describe("resolveDefaultFamilyLabel", () => {
5855
});
5956
});
6057

61-
describe("appearanceFontStack",()=>{
62-
it("prepends the custom family to the default stack",()=>{
63-
expect(appearanceFontStack("Fira Code",DEFAULT_CODE_FONT_STACK)).toBe(
64-
`"Fira Code", ${DEFAULT_CODE_FONT_STACK}`,
65-
);
66-
});
67-
68-
it("falls back to the default stack when unset",()=>{
69-
expect(appearanceFontStack("",DEFAULT_SANS_FONT_STACK)).toBe(DEFAULT_SANS_FONT_STACK);
70-
});
71-
});
72-
7358
describe("resolveTerminalFontPreference",()=>{
7459
it("inherits the code font in simple mode",()=>{
7560
expect(

‎apps/web/src/appearanceFonts.ts‎

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,6 @@ export function cssFontFamilies(input: string): string | null {
7171
returnfamilies.length>0 ? families.join(", ") : null;
7272
}
7373

74-
/** The full stack a preference resolves to: custom families before the default. */
75-
exportfunctionappearanceFontStack(custom: string,defaultStack: string): string{
76-
constfamilies=cssFontFamilies(custom);
77-
returnfamilies===null ? defaultStack : `${families}, ${defaultStack}`;
78-
}
79-
8074
exportinterfaceAppearanceFontPreferences{
8175
readonlysans: string;
8276
readonlycode: string;

‎apps/web/src/components/Sidebar.logic.test.ts‎

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import {
2020
isTrailingDoubleClick,
2121
orderItemsByPreferredIds,
2222
resolveProjectStatusIndicator,
23-
resolveSidebarStageBadgeLabel,
2423
resolveThreadRowClassName,
2524
resolveSidebarThreadStatus,
2625
resolveThreadStatusPill,
@@ -236,44 +235,6 @@ describe("buildMultiSelectThreadContextMenuItems", () => {
236235
});
237236
});
238237

239-
describe("resolveSidebarStageBadgeLabel",()=>{
240-
it("returns Nightly for nightly primary server versions",()=>{
241-
expect(
242-
resolveSidebarStageBadgeLabel({
243-
primaryServerVersion: "0.0.28-nightly.20260616.12",
244-
fallbackStageLabel: "Alpha",
245-
}),
246-
).toBe("Nightly");
247-
});
248-
249-
it("returns the fallback label for stable primary server versions",()=>{
250-
expect(
251-
resolveSidebarStageBadgeLabel({
252-
primaryServerVersion: "0.0.27",
253-
fallbackStageLabel: "Alpha",
254-
}),
255-
).toBe("Alpha");
256-
});
257-
258-
it("returns the fallback label when the primary server version is missing",()=>{
259-
expect(
260-
resolveSidebarStageBadgeLabel({
261-
primaryServerVersion: null,
262-
fallbackStageLabel: "Dev",
263-
}),
264-
).toBe("Dev");
265-
});
266-
267-
it("returns the fallback label for malformed nightly prerelease versions",()=>{
268-
expect(
269-
resolveSidebarStageBadgeLabel({
270-
primaryServerVersion: "0.0.28-nightly.20260616",
271-
fallbackStageLabel: "Alpha",
272-
}),
273-
).toBe("Alpha");
274-
});
275-
});
276-
277238
functionmakeLatestTurn(overrides?: {
278239
completedAt?: string|null;
279240
startedAt?: string|null;

‎apps/web/src/components/Sidebar.logic.ts‎

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import type { SidebarThreadSummary, Thread } from "../types";
1313
importtype{ThreadRouteTarget}from"../threadRoutes";
1414
import{cn}from"../lib/utils";
1515
import{isLatestTurnSettled}from"../session-logic";
16-
import{resolveServerBackedAppStageLabel}from"../branding.logic";
1716

1817
exportconstTHREAD_SELECTION_SAFE_SELECTOR="[data-thread-item], [data-thread-selection-safe]";
1918
exportconstTHREAD_JUMP_HINT_SHOW_DELAY_MS=200;
@@ -170,13 +169,6 @@ export interface ThreadJumpHintVisibilityController {
170169
dispose: ()=>void;
171170
}
172171

173-
exportfunctionresolveSidebarStageBadgeLabel(input: {
174-
primaryServerVersion: string|null|undefined;
175-
fallbackStageLabel: string;
176-
}): string{
177-
returnresolveServerBackedAppStageLabel(input);
178-
}
179-
180172
exportfunctioncreateThreadJumpHintVisibilityController(input: {
181173
delayMs: number;
182174
onVisibilityChange: (visible: boolean)=>void;

‎apps/web/src/pendingUserInput.test.ts‎

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import {
44
buildPendingUserInputAnswers,
55
countAnsweredPendingUserInputQuestions,
66
derivePendingUserInputProgress,
7-
findFirstUnansweredPendingUserInputQuestionIndex,
87
resolvePendingUserInputAnswer,
98
setPendingUserInputCustomAnswer,
109
togglePendingUserInputOptionSelection,
@@ -182,29 +181,6 @@ describe("pending user input question progress", () => {
182181
).toBe(1);
183182
});
184183

185-
it("finds the first unanswered question",()=>{
186-
expect(
187-
findFirstUnansweredPendingUserInputQuestionIndex(questions,{
188-
scope: {
189-
selectedOptionLabels: ["Orchestration-first"],
190-
},
191-
}),
192-
).toBe(1);
193-
});
194-
195-
it("returns the last question index when all answers are complete",()=>{
196-
expect(
197-
findFirstUnansweredPendingUserInputQuestionIndex(questions,{
198-
scope: {
199-
selectedOptionLabels: ["Orchestration-first"],
200-
},
201-
compat: {
202-
customAnswer: "Keep it for one release window",
203-
},
204-
}),
205-
).toBe(1);
206-
});
207-
208184
it("derives the active question and advancement state",()=>{
209185
expect(
210186
derivePendingUserInputProgress(

‎apps/web/src/pendingUserInput.ts‎

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -128,17 +128,6 @@ export function countAnsweredPendingUserInputQuestions(
128128
},0);
129129
}
130130

131-
exportfunctionfindFirstUnansweredPendingUserInputQuestionIndex(
132-
questions: ReadonlyArray<UserInputQuestion>,
133-
draftAnswers: Record<string,PendingUserInputDraftAnswer>,
134-
): number{
135-
constunansweredIndex=questions.findIndex(
136-
(question)=>!resolvePendingUserInputAnswer(question,draftAnswers[question.id]),
137-
);
138-
139-
returnunansweredIndex===-1 ? Math.max(questions.length-1,0) : unansweredIndex;
140-
}
141-
142131
exportfunctionderivePendingUserInputProgress(
143132
questions: ReadonlyArray<UserInputQuestion>,
144133
draftAnswers: Record<string,PendingUserInputDraftAnswer>,

‎apps/web/src/providerUpdateDismissal.test.ts‎

Lines changed: 0 additions & 23 deletions
This file was deleted.

‎apps/web/src/providerUpdateDismissal.ts‎

Lines changed: 2 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,14 @@
11
import{useCallback,useMemo}from"react";
22
import*asSchemafrom"effect/Schema";
33

4-
import{getLocalStorageItem,setLocalStorageItem,useLocalStorage}from"./hooks/useLocalStorage";
4+
import{useLocalStorage}from"./hooks/useLocalStorage";
55

6-
exportconstPROVIDER_UPDATE_DISMISSALS_STORAGE_KEY="t3code:provider-update-dismissals:v1";
6+
constPROVIDER_UPDATE_DISMISSALS_STORAGE_KEY="t3code:provider-update-dismissals:v1";
77

88
constProviderUpdateDismissalsSchema=Schema.Struct({
99
keys: Schema.Array(Schema.String),
1010
});
1111

12-
typeProviderUpdateDismissals=typeofProviderUpdateDismissalsSchema.Type;
13-
14-
functionreadProviderUpdateDismissals(): ProviderUpdateDismissals{
15-
try{
16-
return(
17-
getLocalStorageItem(
18-
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,
19-
ProviderUpdateDismissalsSchema,
20-
)??{
21-
keys: [],
22-
}
23-
);
24-
}catch(error){
25-
console.error("Could not read provider-update dismissals.",error);
26-
return{keys: []};
27-
}
28-
}
29-
30-
functionwriteProviderUpdateDismissals(document: ProviderUpdateDismissals): void{
31-
try{
32-
setLocalStorageItem(
33-
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,
34-
document,
35-
ProviderUpdateDismissalsSchema,
36-
);
37-
}catch(error){
38-
console.error("Could not persist provider-update dismissals.",error);
39-
}
40-
}
41-
42-
exportfunctionisProviderUpdateNotificationDismissed(
43-
dismissalKey: string|null|undefined,
44-
): boolean{
45-
if(!dismissalKey){
46-
returnfalse;
47-
}
48-
returnreadProviderUpdateDismissals().keys.includes(dismissalKey);
49-
}
50-
51-
exportfunctiondismissProviderUpdateNotification(dismissalKey: string|null|undefined): void{
52-
consttrimmedKey=dismissalKey?.trim();
53-
if(!trimmedKey){
54-
return;
55-
}
56-
constdocument=readProviderUpdateDismissals();
57-
if(document.keys.includes(trimmedKey)){
58-
return;
59-
}
60-
writeProviderUpdateDismissals({
61-
keys: [...document.keys,trimmedKey],
62-
});
63-
}
64-
6512
exportfunctionuseDismissedProviderUpdateNotificationKeys(){
6613
const[dismissals,setDismissals]=useLocalStorage(
6714
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,

‎apps/web/src/threadSync.test.ts‎

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import{describe,expect,it}from"vite-plus/test";
22

3-
import{resolveThreadSyncPhase,threadSyncLabel}from"./threadSync";
3+
import{resolveThreadSyncPhase}from"./threadSync";
44

55
describe("resolveThreadSyncPhase",()=>{
66
it("loads when only shell data is available",()=>{
@@ -40,10 +40,3 @@ describe("resolveThreadSyncPhase", () => {
4040
).toBeNull();
4141
});
4242
});
43-
44-
describe("threadSyncLabel",()=>{
45-
it("uses the same loading and syncing language as mobile",()=>{
46-
expect(threadSyncLabel("loading")).toBe("Loading messages...");
47-
expect(threadSyncLabel("syncing")).toBe("Syncing messages...");
48-
});
49-
});

‎apps/web/src/timestampFormat.test.ts‎

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@ import {
66
formatExpiresInLabel,
77
formatRelativeTime,
88
formatRelativeTimeLabel,
9-
formatRelativeTimeUntil,
10-
formatRelativeTimeUntilLabel,
119
formatShortTimestamp,
12-
formatTimestamp,
1310
getRelativeTimeState,
1411
getTimestampFormatOptions,
1512
resolveTimestampLocale,
@@ -76,33 +73,6 @@ describe("resolveTimestampLocale", () => {
7673
});
7774
});
7875

79-
describe("formatRelativeTimeUntilLabel",()=>{
80-
beforeEach(()=>{
81-
vi.useFakeTimers();
82-
vi.setSystemTime(newDate("2026-04-07T12:00:00.000Z"));
83-
});
84-
85-
afterEach(()=>{
86-
vi.useRealTimers();
87-
});
88-
89-
it("returns Expired when the instant is in the past",()=>{
90-
expect(formatRelativeTimeUntilLabel("2026-04-07T11:59:00.000Z")).toBe("Expired");
91-
});
92-
93-
it("formats seconds remaining",()=>{
94-
expect(formatRelativeTimeUntilLabel("2026-04-07T12:00:45.000Z")).toBe("45s left");
95-
});
96-
97-
it("formats minutes remaining",()=>{
98-
expect(formatRelativeTimeUntilLabel("2026-04-07T12:15:00.000Z")).toBe("15m left");
99-
});
100-
101-
it("formats hours remaining",()=>{
102-
expect(formatRelativeTimeUntilLabel("2026-04-07T18:00:00.000Z")).toBe("6h left");
103-
});
104-
});
105-
10676
describe("formatExpiresInLabel",()=>{
10777
beforeEach(()=>{
10878
vi.useFakeTimers();
@@ -196,10 +166,6 @@ describe("formatDayAwareTimestamp", () => {
196166
});
197167

198168
describe("invalid timestamp inputs",()=>{
199-
it("returns an empty timestamp instead of throwing",()=>{
200-
expect(formatTimestamp("not-a-date","12-hour")).toBe("");
201-
});
202-
203169
it("returns an empty short timestamp instead of throwing",()=>{
204170
expect(formatShortTimestamp("not-a-date","12-hour")).toBe("");
205171
});
@@ -218,11 +184,6 @@ describe("invalid timestamp inputs", () => {
218184
expect(formatElapsedDurationLabel("not-a-date")).toBe("");
219185
});
220186

221-
it("returns an empty relative time until label instead of a NaN label",()=>{
222-
expect(formatRelativeTimeUntil("not-a-date")).toBeNull();
223-
expect(formatRelativeTimeUntilLabel("not-a-date")).toBe("");
224-
});
225-
226187
it("returns an empty expires-in label instead of a NaN label",()=>{
227188
expect(formatExpiresInLabel("not-a-date")).toBe("");
228189
});

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Commit 2daff8c

Browse files
authored
test(web): remove tests for unreachable helpers (#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
1 parent 8dcb963 commit 2daff8c

13 files changed

Lines changed: 3 additions & 282 deletions

‎apps/web/src/appearanceFonts.test.ts‎

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@ import {
55
clampCodeFontSize,
66
clampInterfaceFontSize,
77
clampPromptFontSize,
8-
DEFAULT_CODE_FONT_STACK,
9-
DEFAULT_SANS_FONT_STACK,
10-
appearanceFontStack,
118
cssFontFamilies,
129
resolveDefaultFamilyLabel,
1310
resolveTerminalFontPreference,
@@ -58,18 +55,6 @@ describe("resolveDefaultFamilyLabel", () => {
5855
});
5956
});
6057

61-
describe("appearanceFontStack",()=>{
62-
it("prepends the custom family to the default stack",()=>{
63-
expect(appearanceFontStack("Fira Code",DEFAULT_CODE_FONT_STACK)).toBe(
64-
`"Fira Code", ${DEFAULT_CODE_FONT_STACK}`,
65-
);
66-
});
67-
68-
it("falls back to the default stack when unset",()=>{
69-
expect(appearanceFontStack("",DEFAULT_SANS_FONT_STACK)).toBe(DEFAULT_SANS_FONT_STACK);
70-
});
71-
});
72-
7358
describe("resolveTerminalFontPreference",()=>{
7459
it("inherits the code font in simple mode",()=>{
7560
expect(

‎apps/web/src/appearanceFonts.ts‎

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,6 @@ export function cssFontFamilies(input: string): string | null {
7171
returnfamilies.length>0 ? families.join(", ") : null;
7272
}
7373

74-
/** The full stack a preference resolves to: custom families before the default. */
75-
exportfunctionappearanceFontStack(custom: string,defaultStack: string): string{
76-
constfamilies=cssFontFamilies(custom);
77-
returnfamilies===null ? defaultStack : `${families}, ${defaultStack}`;
78-
}
79-
8074
exportinterfaceAppearanceFontPreferences{
8175
readonlysans: string;
8276
readonlycode: string;

‎apps/web/src/components/Sidebar.logic.test.ts‎

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import {
2020
isTrailingDoubleClick,
2121
orderItemsByPreferredIds,
2222
resolveProjectStatusIndicator,
23-
resolveSidebarStageBadgeLabel,
2423
resolveThreadRowClassName,
2524
resolveSidebarThreadStatus,
2625
resolveThreadStatusPill,
@@ -236,44 +235,6 @@ describe("buildMultiSelectThreadContextMenuItems", () => {
236235
});
237236
});
238237

239-
describe("resolveSidebarStageBadgeLabel",()=>{
240-
it("returns Nightly for nightly primary server versions",()=>{
241-
expect(
242-
resolveSidebarStageBadgeLabel({
243-
primaryServerVersion: "0.0.28-nightly.20260616.12",
244-
fallbackStageLabel: "Alpha",
245-
}),
246-
).toBe("Nightly");
247-
});
248-
249-
it("returns the fallback label for stable primary server versions",()=>{
250-
expect(
251-
resolveSidebarStageBadgeLabel({
252-
primaryServerVersion: "0.0.27",
253-
fallbackStageLabel: "Alpha",
254-
}),
255-
).toBe("Alpha");
256-
});
257-
258-
it("returns the fallback label when the primary server version is missing",()=>{
259-
expect(
260-
resolveSidebarStageBadgeLabel({
261-
primaryServerVersion: null,
262-
fallbackStageLabel: "Dev",
263-
}),
264-
).toBe("Dev");
265-
});
266-
267-
it("returns the fallback label for malformed nightly prerelease versions",()=>{
268-
expect(
269-
resolveSidebarStageBadgeLabel({
270-
primaryServerVersion: "0.0.28-nightly.20260616",
271-
fallbackStageLabel: "Alpha",
272-
}),
273-
).toBe("Alpha");
274-
});
275-
});
276-
277238
functionmakeLatestTurn(overrides?: {
278239
completedAt?: string|null;
279240
startedAt?: string|null;

‎apps/web/src/components/Sidebar.logic.ts‎

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import type { SidebarThreadSummary, Thread } from "../types";
1313
importtype{ThreadRouteTarget}from"../threadRoutes";
1414
import{cn}from"../lib/utils";
1515
import{isLatestTurnSettled}from"../session-logic";
16-
import{resolveServerBackedAppStageLabel}from"../branding.logic";
1716

1817
exportconstTHREAD_SELECTION_SAFE_SELECTOR="[data-thread-item], [data-thread-selection-safe]";
1918
exportconstTHREAD_JUMP_HINT_SHOW_DELAY_MS=200;
@@ -170,13 +169,6 @@ export interface ThreadJumpHintVisibilityController {
170169
dispose: ()=>void;
171170
}
172171

173-
exportfunctionresolveSidebarStageBadgeLabel(input: {
174-
primaryServerVersion: string|null|undefined;
175-
fallbackStageLabel: string;
176-
}): string{
177-
returnresolveServerBackedAppStageLabel(input);
178-
}
179-
180172
exportfunctioncreateThreadJumpHintVisibilityController(input: {
181173
delayMs: number;
182174
onVisibilityChange: (visible: boolean)=>void;

‎apps/web/src/pendingUserInput.test.ts‎

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import {
44
buildPendingUserInputAnswers,
55
countAnsweredPendingUserInputQuestions,
66
derivePendingUserInputProgress,
7-
findFirstUnansweredPendingUserInputQuestionIndex,
87
resolvePendingUserInputAnswer,
98
setPendingUserInputCustomAnswer,
109
togglePendingUserInputOptionSelection,
@@ -182,29 +181,6 @@ describe("pending user input question progress", () => {
182181
).toBe(1);
183182
});
184183

185-
it("finds the first unanswered question",()=>{
186-
expect(
187-
findFirstUnansweredPendingUserInputQuestionIndex(questions,{
188-
scope: {
189-
selectedOptionLabels: ["Orchestration-first"],
190-
},
191-
}),
192-
).toBe(1);
193-
});
194-
195-
it("returns the last question index when all answers are complete",()=>{
196-
expect(
197-
findFirstUnansweredPendingUserInputQuestionIndex(questions,{
198-
scope: {
199-
selectedOptionLabels: ["Orchestration-first"],
200-
},
201-
compat: {
202-
customAnswer: "Keep it for one release window",
203-
},
204-
}),
205-
).toBe(1);
206-
});
207-
208184
it("derives the active question and advancement state",()=>{
209185
expect(
210186
derivePendingUserInputProgress(

‎apps/web/src/pendingUserInput.ts‎

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -128,17 +128,6 @@ export function countAnsweredPendingUserInputQuestions(
128128
},0);
129129
}
130130

131-
exportfunctionfindFirstUnansweredPendingUserInputQuestionIndex(
132-
questions: ReadonlyArray<UserInputQuestion>,
133-
draftAnswers: Record<string,PendingUserInputDraftAnswer>,
134-
): number{
135-
constunansweredIndex=questions.findIndex(
136-
(question)=>!resolvePendingUserInputAnswer(question,draftAnswers[question.id]),
137-
);
138-
139-
returnunansweredIndex===-1 ? Math.max(questions.length-1,0) : unansweredIndex;
140-
}
141-
142131
exportfunctionderivePendingUserInputProgress(
143132
questions: ReadonlyArray<UserInputQuestion>,
144133
draftAnswers: Record<string,PendingUserInputDraftAnswer>,

‎apps/web/src/providerUpdateDismissal.test.ts‎

Lines changed: 0 additions & 23 deletions
This file was deleted.

‎apps/web/src/providerUpdateDismissal.ts‎

Lines changed: 2 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,14 @@
11
import{useCallback,useMemo}from"react";
22
import*asSchemafrom"effect/Schema";
33

4-
import{getLocalStorageItem,setLocalStorageItem,useLocalStorage}from"./hooks/useLocalStorage";
4+
import{useLocalStorage}from"./hooks/useLocalStorage";
55

6-
exportconstPROVIDER_UPDATE_DISMISSALS_STORAGE_KEY="t3code:provider-update-dismissals:v1";
6+
constPROVIDER_UPDATE_DISMISSALS_STORAGE_KEY="t3code:provider-update-dismissals:v1";
77

88
constProviderUpdateDismissalsSchema=Schema.Struct({
99
keys: Schema.Array(Schema.String),
1010
});
1111

12-
typeProviderUpdateDismissals=typeofProviderUpdateDismissalsSchema.Type;
13-
14-
functionreadProviderUpdateDismissals(): ProviderUpdateDismissals{
15-
try{
16-
return(
17-
getLocalStorageItem(
18-
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,
19-
ProviderUpdateDismissalsSchema,
20-
)??{
21-
keys: [],
22-
}
23-
);
24-
}catch(error){
25-
console.error("Could not read provider-update dismissals.",error);
26-
return{keys: []};
27-
}
28-
}
29-
30-
functionwriteProviderUpdateDismissals(document: ProviderUpdateDismissals): void{
31-
try{
32-
setLocalStorageItem(
33-
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,
34-
document,
35-
ProviderUpdateDismissalsSchema,
36-
);
37-
}catch(error){
38-
console.error("Could not persist provider-update dismissals.",error);
39-
}
40-
}
41-
42-
exportfunctionisProviderUpdateNotificationDismissed(
43-
dismissalKey: string|null|undefined,
44-
): boolean{
45-
if(!dismissalKey){
46-
returnfalse;
47-
}
48-
returnreadProviderUpdateDismissals().keys.includes(dismissalKey);
49-
}
50-
51-
exportfunctiondismissProviderUpdateNotification(dismissalKey: string|null|undefined): void{
52-
consttrimmedKey=dismissalKey?.trim();
53-
if(!trimmedKey){
54-
return;
55-
}
56-
constdocument=readProviderUpdateDismissals();
57-
if(document.keys.includes(trimmedKey)){
58-
return;
59-
}
60-
writeProviderUpdateDismissals({
61-
keys: [...document.keys,trimmedKey],
62-
});
63-
}
64-
6512
exportfunctionuseDismissedProviderUpdateNotificationKeys(){
6613
const[dismissals,setDismissals]=useLocalStorage(
6714
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,

‎apps/web/src/threadSync.test.ts‎

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import{describe,expect,it}from"vite-plus/test";
22

3-
import{resolveThreadSyncPhase,threadSyncLabel}from"./threadSync";
3+
import{resolveThreadSyncPhase}from"./threadSync";
44

55
describe("resolveThreadSyncPhase",()=>{
66
it("loads when only shell data is available",()=>{
@@ -40,10 +40,3 @@ describe("resolveThreadSyncPhase", () => {
4040
).toBeNull();
4141
});
4242
});
43-
44-
describe("threadSyncLabel",()=>{
45-
it("uses the same loading and syncing language as mobile",()=>{
46-
expect(threadSyncLabel("loading")).toBe("Loading messages...");
47-
expect(threadSyncLabel("syncing")).toBe("Syncing messages...");
48-
});
49-
});

‎apps/web/src/timestampFormat.test.ts‎

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@ import {
66
formatExpiresInLabel,
77
formatRelativeTime,
88
formatRelativeTimeLabel,
9-
formatRelativeTimeUntil,
10-
formatRelativeTimeUntilLabel,
119
formatShortTimestamp,
12-
formatTimestamp,
1310
getRelativeTimeState,
1411
getTimestampFormatOptions,
1512
resolveTimestampLocale,
@@ -76,33 +73,6 @@ describe("resolveTimestampLocale", () => {
7673
});
7774
});
7875

79-
describe("formatRelativeTimeUntilLabel",()=>{
80-
beforeEach(()=>{
81-
vi.useFakeTimers();
82-
vi.setSystemTime(newDate("2026-04-07T12:00:00.000Z"));
83-
});
84-
85-
afterEach(()=>{
86-
vi.useRealTimers();
87-
});
88-
89-
it("returns Expired when the instant is in the past",()=>{
90-
expect(formatRelativeTimeUntilLabel("2026-04-07T11:59:00.000Z")).toBe("Expired");
91-
});
92-
93-
it("formats seconds remaining",()=>{
94-
expect(formatRelativeTimeUntilLabel("2026-04-07T12:00:45.000Z")).toBe("45s left");
95-
});
96-
97-
it("formats minutes remaining",()=>{
98-
expect(formatRelativeTimeUntilLabel("2026-04-07T12:15:00.000Z")).toBe("15m left");
99-
});
100-
101-
it("formats hours remaining",()=>{
102-
expect(formatRelativeTimeUntilLabel("2026-04-07T18:00:00.000Z")).toBe("6h left");
103-
});
104-
});
105-
10676
describe("formatExpiresInLabel",()=>{
10777
beforeEach(()=>{
10878
vi.useFakeTimers();
@@ -196,10 +166,6 @@ describe("formatDayAwareTimestamp", () => {
196166
});
197167

198168
describe("invalid timestamp inputs",()=>{
199-
it("returns an empty timestamp instead of throwing",()=>{
200-
expect(formatTimestamp("not-a-date","12-hour")).toBe("");
201-
});
202-
203169
it("returns an empty short timestamp instead of throwing",()=>{
204170
expect(formatShortTimestamp("not-a-date","12-hour")).toBe("");
205171
});
@@ -218,11 +184,6 @@ describe("invalid timestamp inputs", () => {
218184
expect(formatElapsedDurationLabel("not-a-date")).toBe("");
219185
});
220186

221-
it("returns an empty relative time until label instead of a NaN label",()=>{
222-
expect(formatRelativeTimeUntil("not-a-date")).toBeNull();
223-
expect(formatRelativeTimeUntilLabel("not-a-date")).toBe("");
224-
});
225-
226187
it("returns an empty expires-in label instead of a NaN label",()=>{
227188
expect(formatExpiresInLabel("not-a-date")).toBe("");
228189
});

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Commit 2daff8c

Browse files
authored
test(web): remove tests for unreachable helpers (#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
1 parent 8dcb963 commit 2daff8c

13 files changed

Lines changed: 3 additions & 282 deletions

‎apps/web/src/appearanceFonts.test.ts‎

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@ import {
55
clampCodeFontSize,
66
clampInterfaceFontSize,
77
clampPromptFontSize,
8-
DEFAULT_CODE_FONT_STACK,
9-
DEFAULT_SANS_FONT_STACK,
10-
appearanceFontStack,
118
cssFontFamilies,
129
resolveDefaultFamilyLabel,
1310
resolveTerminalFontPreference,
@@ -58,18 +55,6 @@ describe("resolveDefaultFamilyLabel", () => {
5855
});
5956
});
6057

61-
describe("appearanceFontStack",()=>{
62-
it("prepends the custom family to the default stack",()=>{
63-
expect(appearanceFontStack("Fira Code",DEFAULT_CODE_FONT_STACK)).toBe(
64-
`"Fira Code", ${DEFAULT_CODE_FONT_STACK}`,
65-
);
66-
});
67-
68-
it("falls back to the default stack when unset",()=>{
69-
expect(appearanceFontStack("",DEFAULT_SANS_FONT_STACK)).toBe(DEFAULT_SANS_FONT_STACK);
70-
});
71-
});
72-
7358
describe("resolveTerminalFontPreference",()=>{
7459
it("inherits the code font in simple mode",()=>{
7560
expect(

‎apps/web/src/appearanceFonts.ts‎

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,6 @@ export function cssFontFamilies(input: string): string | null {
7171
returnfamilies.length>0 ? families.join(", ") : null;
7272
}
7373

74-
/** The full stack a preference resolves to: custom families before the default. */
75-
exportfunctionappearanceFontStack(custom: string,defaultStack: string): string{
76-
constfamilies=cssFontFamilies(custom);
77-
returnfamilies===null ? defaultStack : `${families}, ${defaultStack}`;
78-
}
79-
8074
exportinterfaceAppearanceFontPreferences{
8175
readonlysans: string;
8276
readonlycode: string;

‎apps/web/src/components/Sidebar.logic.test.ts‎

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import {
2020
isTrailingDoubleClick,
2121
orderItemsByPreferredIds,
2222
resolveProjectStatusIndicator,
23-
resolveSidebarStageBadgeLabel,
2423
resolveThreadRowClassName,
2524
resolveSidebarThreadStatus,
2625
resolveThreadStatusPill,
@@ -236,44 +235,6 @@ describe("buildMultiSelectThreadContextMenuItems", () => {
236235
});
237236
});
238237

239-
describe("resolveSidebarStageBadgeLabel",()=>{
240-
it("returns Nightly for nightly primary server versions",()=>{
241-
expect(
242-
resolveSidebarStageBadgeLabel({
243-
primaryServerVersion: "0.0.28-nightly.20260616.12",
244-
fallbackStageLabel: "Alpha",
245-
}),
246-
).toBe("Nightly");
247-
});
248-
249-
it("returns the fallback label for stable primary server versions",()=>{
250-
expect(
251-
resolveSidebarStageBadgeLabel({
252-
primaryServerVersion: "0.0.27",
253-
fallbackStageLabel: "Alpha",
254-
}),
255-
).toBe("Alpha");
256-
});
257-
258-
it("returns the fallback label when the primary server version is missing",()=>{
259-
expect(
260-
resolveSidebarStageBadgeLabel({
261-
primaryServerVersion: null,
262-
fallbackStageLabel: "Dev",
263-
}),
264-
).toBe("Dev");
265-
});
266-
267-
it("returns the fallback label for malformed nightly prerelease versions",()=>{
268-
expect(
269-
resolveSidebarStageBadgeLabel({
270-
primaryServerVersion: "0.0.28-nightly.20260616",
271-
fallbackStageLabel: "Alpha",
272-
}),
273-
).toBe("Alpha");
274-
});
275-
});
276-
277238
functionmakeLatestTurn(overrides?: {
278239
completedAt?: string|null;
279240
startedAt?: string|null;

‎apps/web/src/components/Sidebar.logic.ts‎

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import type { SidebarThreadSummary, Thread } from "../types";
1313
importtype{ThreadRouteTarget}from"../threadRoutes";
1414
import{cn}from"../lib/utils";
1515
import{isLatestTurnSettled}from"../session-logic";
16-
import{resolveServerBackedAppStageLabel}from"../branding.logic";
1716

1817
exportconstTHREAD_SELECTION_SAFE_SELECTOR="[data-thread-item], [data-thread-selection-safe]";
1918
exportconstTHREAD_JUMP_HINT_SHOW_DELAY_MS=200;
@@ -170,13 +169,6 @@ export interface ThreadJumpHintVisibilityController {
170169
dispose: ()=>void;
171170
}
172171

173-
exportfunctionresolveSidebarStageBadgeLabel(input: {
174-
primaryServerVersion: string|null|undefined;
175-
fallbackStageLabel: string;
176-
}): string{
177-
returnresolveServerBackedAppStageLabel(input);
178-
}
179-
180172
exportfunctioncreateThreadJumpHintVisibilityController(input: {
181173
delayMs: number;
182174
onVisibilityChange: (visible: boolean)=>void;

‎apps/web/src/pendingUserInput.test.ts‎

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import {
44
buildPendingUserInputAnswers,
55
countAnsweredPendingUserInputQuestions,
66
derivePendingUserInputProgress,
7-
findFirstUnansweredPendingUserInputQuestionIndex,
87
resolvePendingUserInputAnswer,
98
setPendingUserInputCustomAnswer,
109
togglePendingUserInputOptionSelection,
@@ -182,29 +181,6 @@ describe("pending user input question progress", () => {
182181
).toBe(1);
183182
});
184183

185-
it("finds the first unanswered question",()=>{
186-
expect(
187-
findFirstUnansweredPendingUserInputQuestionIndex(questions,{
188-
scope: {
189-
selectedOptionLabels: ["Orchestration-first"],
190-
},
191-
}),
192-
).toBe(1);
193-
});
194-
195-
it("returns the last question index when all answers are complete",()=>{
196-
expect(
197-
findFirstUnansweredPendingUserInputQuestionIndex(questions,{
198-
scope: {
199-
selectedOptionLabels: ["Orchestration-first"],
200-
},
201-
compat: {
202-
customAnswer: "Keep it for one release window",
203-
},
204-
}),
205-
).toBe(1);
206-
});
207-
208184
it("derives the active question and advancement state",()=>{
209185
expect(
210186
derivePendingUserInputProgress(

‎apps/web/src/pendingUserInput.ts‎

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -128,17 +128,6 @@ export function countAnsweredPendingUserInputQuestions(
128128
},0);
129129
}
130130

131-
exportfunctionfindFirstUnansweredPendingUserInputQuestionIndex(
132-
questions: ReadonlyArray<UserInputQuestion>,
133-
draftAnswers: Record<string,PendingUserInputDraftAnswer>,
134-
): number{
135-
constunansweredIndex=questions.findIndex(
136-
(question)=>!resolvePendingUserInputAnswer(question,draftAnswers[question.id]),
137-
);
138-
139-
returnunansweredIndex===-1 ? Math.max(questions.length-1,0) : unansweredIndex;
140-
}
141-
142131
exportfunctionderivePendingUserInputProgress(
143132
questions: ReadonlyArray<UserInputQuestion>,
144133
draftAnswers: Record<string,PendingUserInputDraftAnswer>,

‎apps/web/src/providerUpdateDismissal.test.ts‎

Lines changed: 0 additions & 23 deletions
This file was deleted.

‎apps/web/src/providerUpdateDismissal.ts‎

Lines changed: 2 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,14 @@
11
import{useCallback,useMemo}from"react";
22
import*asSchemafrom"effect/Schema";
33

4-
import{getLocalStorageItem,setLocalStorageItem,useLocalStorage}from"./hooks/useLocalStorage";
4+
import{useLocalStorage}from"./hooks/useLocalStorage";
55

6-
exportconstPROVIDER_UPDATE_DISMISSALS_STORAGE_KEY="t3code:provider-update-dismissals:v1";
6+
constPROVIDER_UPDATE_DISMISSALS_STORAGE_KEY="t3code:provider-update-dismissals:v1";
77

88
constProviderUpdateDismissalsSchema=Schema.Struct({
99
keys: Schema.Array(Schema.String),
1010
});
1111

12-
typeProviderUpdateDismissals=typeofProviderUpdateDismissalsSchema.Type;
13-
14-
functionreadProviderUpdateDismissals(): ProviderUpdateDismissals{
15-
try{
16-
return(
17-
getLocalStorageItem(
18-
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,
19-
ProviderUpdateDismissalsSchema,
20-
)??{
21-
keys: [],
22-
}
23-
);
24-
}catch(error){
25-
console.error("Could not read provider-update dismissals.",error);
26-
return{keys: []};
27-
}
28-
}
29-
30-
functionwriteProviderUpdateDismissals(document: ProviderUpdateDismissals): void{
31-
try{
32-
setLocalStorageItem(
33-
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,
34-
document,
35-
ProviderUpdateDismissalsSchema,
36-
);
37-
}catch(error){
38-
console.error("Could not persist provider-update dismissals.",error);
39-
}
40-
}
41-
42-
exportfunctionisProviderUpdateNotificationDismissed(
43-
dismissalKey: string|null|undefined,
44-
): boolean{
45-
if(!dismissalKey){
46-
returnfalse;
47-
}
48-
returnreadProviderUpdateDismissals().keys.includes(dismissalKey);
49-
}
50-
51-
exportfunctiondismissProviderUpdateNotification(dismissalKey: string|null|undefined): void{
52-
consttrimmedKey=dismissalKey?.trim();
53-
if(!trimmedKey){
54-
return;
55-
}
56-
constdocument=readProviderUpdateDismissals();
57-
if(document.keys.includes(trimmedKey)){
58-
return;
59-
}
60-
writeProviderUpdateDismissals({
61-
keys: [...document.keys,trimmedKey],
62-
});
63-
}
64-
6512
exportfunctionuseDismissedProviderUpdateNotificationKeys(){
6613
const[dismissals,setDismissals]=useLocalStorage(
6714
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,

‎apps/web/src/threadSync.test.ts‎

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import{describe,expect,it}from"vite-plus/test";
22

3-
import{resolveThreadSyncPhase,threadSyncLabel}from"./threadSync";
3+
import{resolveThreadSyncPhase}from"./threadSync";
44

55
describe("resolveThreadSyncPhase",()=>{
66
it("loads when only shell data is available",()=>{
@@ -40,10 +40,3 @@ describe("resolveThreadSyncPhase", () => {
4040
).toBeNull();
4141
});
4242
});
43-
44-
describe("threadSyncLabel",()=>{
45-
it("uses the same loading and syncing language as mobile",()=>{
46-
expect(threadSyncLabel("loading")).toBe("Loading messages...");
47-
expect(threadSyncLabel("syncing")).toBe("Syncing messages...");
48-
});
49-
});

‎apps/web/src/timestampFormat.test.ts‎

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@ import {
66
formatExpiresInLabel,
77
formatRelativeTime,
88
formatRelativeTimeLabel,
9-
formatRelativeTimeUntil,
10-
formatRelativeTimeUntilLabel,
119
formatShortTimestamp,
12-
formatTimestamp,
1310
getRelativeTimeState,
1411
getTimestampFormatOptions,
1512
resolveTimestampLocale,
@@ -76,33 +73,6 @@ describe("resolveTimestampLocale", () => {
7673
});
7774
});
7875

79-
describe("formatRelativeTimeUntilLabel",()=>{
80-
beforeEach(()=>{
81-
vi.useFakeTimers();
82-
vi.setSystemTime(newDate("2026-04-07T12:00:00.000Z"));
83-
});
84-
85-
afterEach(()=>{
86-
vi.useRealTimers();
87-
});
88-
89-
it("returns Expired when the instant is in the past",()=>{
90-
expect(formatRelativeTimeUntilLabel("2026-04-07T11:59:00.000Z")).toBe("Expired");
91-
});
92-
93-
it("formats seconds remaining",()=>{
94-
expect(formatRelativeTimeUntilLabel("2026-04-07T12:00:45.000Z")).toBe("45s left");
95-
});
96-
97-
it("formats minutes remaining",()=>{
98-
expect(formatRelativeTimeUntilLabel("2026-04-07T12:15:00.000Z")).toBe("15m left");
99-
});
100-
101-
it("formats hours remaining",()=>{
102-
expect(formatRelativeTimeUntilLabel("2026-04-07T18:00:00.000Z")).toBe("6h left");
103-
});
104-
});
105-
10676
describe("formatExpiresInLabel",()=>{
10777
beforeEach(()=>{
10878
vi.useFakeTimers();
@@ -196,10 +166,6 @@ describe("formatDayAwareTimestamp", () => {
196166
});
197167

198168
describe("invalid timestamp inputs",()=>{
199-
it("returns an empty timestamp instead of throwing",()=>{
200-
expect(formatTimestamp("not-a-date","12-hour")).toBe("");
201-
});
202-
203169
it("returns an empty short timestamp instead of throwing",()=>{
204170
expect(formatShortTimestamp("not-a-date","12-hour")).toBe("");
205171
});
@@ -218,11 +184,6 @@ describe("invalid timestamp inputs", () => {
218184
expect(formatElapsedDurationLabel("not-a-date")).toBe("");
219185
});
220186

221-
it("returns an empty relative time until label instead of a NaN label",()=>{
222-
expect(formatRelativeTimeUntil("not-a-date")).toBeNull();
223-
expect(formatRelativeTimeUntilLabel("not-a-date")).toBe("");
224-
});
225-
226187
it("returns an empty expires-in label instead of a NaN label",()=>{
227188
expect(formatExpiresInLabel("not-a-date")).toBe("");
228189
});

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Commit 2daff8c

Browse files
authored
test(web): remove tests for unreachable helpers (#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
1 parent 8dcb963 commit 2daff8c

13 files changed

Lines changed: 3 additions & 282 deletions

‎apps/web/src/appearanceFonts.test.ts‎

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@ import {
55
clampCodeFontSize,
66
clampInterfaceFontSize,
77
clampPromptFontSize,
8-
DEFAULT_CODE_FONT_STACK,
9-
DEFAULT_SANS_FONT_STACK,
10-
appearanceFontStack,
118
cssFontFamilies,
129
resolveDefaultFamilyLabel,
1310
resolveTerminalFontPreference,
@@ -58,18 +55,6 @@ describe("resolveDefaultFamilyLabel", () => {
5855
});
5956
});
6057

61-
describe("appearanceFontStack",()=>{
62-
it("prepends the custom family to the default stack",()=>{
63-
expect(appearanceFontStack("Fira Code",DEFAULT_CODE_FONT_STACK)).toBe(
64-
`"Fira Code", ${DEFAULT_CODE_FONT_STACK}`,
65-
);
66-
});
67-
68-
it("falls back to the default stack when unset",()=>{
69-
expect(appearanceFontStack("",DEFAULT_SANS_FONT_STACK)).toBe(DEFAULT_SANS_FONT_STACK);
70-
});
71-
});
72-
7358
describe("resolveTerminalFontPreference",()=>{
7459
it("inherits the code font in simple mode",()=>{
7560
expect(

‎apps/web/src/appearanceFonts.ts‎

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,6 @@ export function cssFontFamilies(input: string): string | null {
7171
returnfamilies.length>0 ? families.join(", ") : null;
7272
}
7373

74-
/** The full stack a preference resolves to: custom families before the default. */
75-
exportfunctionappearanceFontStack(custom: string,defaultStack: string): string{
76-
constfamilies=cssFontFamilies(custom);
77-
returnfamilies===null ? defaultStack : `${families}, ${defaultStack}`;
78-
}
79-
8074
exportinterfaceAppearanceFontPreferences{
8175
readonlysans: string;
8276
readonlycode: string;

‎apps/web/src/components/Sidebar.logic.test.ts‎

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import {
2020
isTrailingDoubleClick,
2121
orderItemsByPreferredIds,
2222
resolveProjectStatusIndicator,
23-
resolveSidebarStageBadgeLabel,
2423
resolveThreadRowClassName,
2524
resolveSidebarThreadStatus,
2625
resolveThreadStatusPill,
@@ -236,44 +235,6 @@ describe("buildMultiSelectThreadContextMenuItems", () => {
236235
});
237236
});
238237

239-
describe("resolveSidebarStageBadgeLabel",()=>{
240-
it("returns Nightly for nightly primary server versions",()=>{
241-
expect(
242-
resolveSidebarStageBadgeLabel({
243-
primaryServerVersion: "0.0.28-nightly.20260616.12",
244-
fallbackStageLabel: "Alpha",
245-
}),
246-
).toBe("Nightly");
247-
});
248-
249-
it("returns the fallback label for stable primary server versions",()=>{
250-
expect(
251-
resolveSidebarStageBadgeLabel({
252-
primaryServerVersion: "0.0.27",
253-
fallbackStageLabel: "Alpha",
254-
}),
255-
).toBe("Alpha");
256-
});
257-
258-
it("returns the fallback label when the primary server version is missing",()=>{
259-
expect(
260-
resolveSidebarStageBadgeLabel({
261-
primaryServerVersion: null,
262-
fallbackStageLabel: "Dev",
263-
}),
264-
).toBe("Dev");
265-
});
266-
267-
it("returns the fallback label for malformed nightly prerelease versions",()=>{
268-
expect(
269-
resolveSidebarStageBadgeLabel({
270-
primaryServerVersion: "0.0.28-nightly.20260616",
271-
fallbackStageLabel: "Alpha",
272-
}),
273-
).toBe("Alpha");
274-
});
275-
});
276-
277238
functionmakeLatestTurn(overrides?: {
278239
completedAt?: string|null;
279240
startedAt?: string|null;

‎apps/web/src/components/Sidebar.logic.ts‎

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import type { SidebarThreadSummary, Thread } from "../types";
1313
importtype{ThreadRouteTarget}from"../threadRoutes";
1414
import{cn}from"../lib/utils";
1515
import{isLatestTurnSettled}from"../session-logic";
16-
import{resolveServerBackedAppStageLabel}from"../branding.logic";
1716

1817
exportconstTHREAD_SELECTION_SAFE_SELECTOR="[data-thread-item], [data-thread-selection-safe]";
1918
exportconstTHREAD_JUMP_HINT_SHOW_DELAY_MS=200;
@@ -170,13 +169,6 @@ export interface ThreadJumpHintVisibilityController {
170169
dispose: ()=>void;
171170
}
172171

173-
exportfunctionresolveSidebarStageBadgeLabel(input: {
174-
primaryServerVersion: string|null|undefined;
175-
fallbackStageLabel: string;
176-
}): string{
177-
returnresolveServerBackedAppStageLabel(input);
178-
}
179-
180172
exportfunctioncreateThreadJumpHintVisibilityController(input: {
181173
delayMs: number;
182174
onVisibilityChange: (visible: boolean)=>void;

‎apps/web/src/pendingUserInput.test.ts‎

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import {
44
buildPendingUserInputAnswers,
55
countAnsweredPendingUserInputQuestions,
66
derivePendingUserInputProgress,
7-
findFirstUnansweredPendingUserInputQuestionIndex,
87
resolvePendingUserInputAnswer,
98
setPendingUserInputCustomAnswer,
109
togglePendingUserInputOptionSelection,
@@ -182,29 +181,6 @@ describe("pending user input question progress", () => {
182181
).toBe(1);
183182
});
184183

185-
it("finds the first unanswered question",()=>{
186-
expect(
187-
findFirstUnansweredPendingUserInputQuestionIndex(questions,{
188-
scope: {
189-
selectedOptionLabels: ["Orchestration-first"],
190-
},
191-
}),
192-
).toBe(1);
193-
});
194-
195-
it("returns the last question index when all answers are complete",()=>{
196-
expect(
197-
findFirstUnansweredPendingUserInputQuestionIndex(questions,{
198-
scope: {
199-
selectedOptionLabels: ["Orchestration-first"],
200-
},
201-
compat: {
202-
customAnswer: "Keep it for one release window",
203-
},
204-
}),
205-
).toBe(1);
206-
});
207-
208184
it("derives the active question and advancement state",()=>{
209185
expect(
210186
derivePendingUserInputProgress(

‎apps/web/src/pendingUserInput.ts‎

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -128,17 +128,6 @@ export function countAnsweredPendingUserInputQuestions(
128128
},0);
129129
}
130130

131-
exportfunctionfindFirstUnansweredPendingUserInputQuestionIndex(
132-
questions: ReadonlyArray<UserInputQuestion>,
133-
draftAnswers: Record<string,PendingUserInputDraftAnswer>,
134-
): number{
135-
constunansweredIndex=questions.findIndex(
136-
(question)=>!resolvePendingUserInputAnswer(question,draftAnswers[question.id]),
137-
);
138-
139-
returnunansweredIndex===-1 ? Math.max(questions.length-1,0) : unansweredIndex;
140-
}
141-
142131
exportfunctionderivePendingUserInputProgress(
143132
questions: ReadonlyArray<UserInputQuestion>,
144133
draftAnswers: Record<string,PendingUserInputDraftAnswer>,

‎apps/web/src/providerUpdateDismissal.test.ts‎

Lines changed: 0 additions & 23 deletions
This file was deleted.

‎apps/web/src/providerUpdateDismissal.ts‎

Lines changed: 2 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,14 @@
11
import{useCallback,useMemo}from"react";
22
import*asSchemafrom"effect/Schema";
33

4-
import{getLocalStorageItem,setLocalStorageItem,useLocalStorage}from"./hooks/useLocalStorage";
4+
import{useLocalStorage}from"./hooks/useLocalStorage";
55

6-
exportconstPROVIDER_UPDATE_DISMISSALS_STORAGE_KEY="t3code:provider-update-dismissals:v1";
6+
constPROVIDER_UPDATE_DISMISSALS_STORAGE_KEY="t3code:provider-update-dismissals:v1";
77

88
constProviderUpdateDismissalsSchema=Schema.Struct({
99
keys: Schema.Array(Schema.String),
1010
});
1111

12-
typeProviderUpdateDismissals=typeofProviderUpdateDismissalsSchema.Type;
13-
14-
functionreadProviderUpdateDismissals(): ProviderUpdateDismissals{
15-
try{
16-
return(
17-
getLocalStorageItem(
18-
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,
19-
ProviderUpdateDismissalsSchema,
20-
)??{
21-
keys: [],
22-
}
23-
);
24-
}catch(error){
25-
console.error("Could not read provider-update dismissals.",error);
26-
return{keys: []};
27-
}
28-
}
29-
30-
functionwriteProviderUpdateDismissals(document: ProviderUpdateDismissals): void{
31-
try{
32-
setLocalStorageItem(
33-
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,
34-
document,
35-
ProviderUpdateDismissalsSchema,
36-
);
37-
}catch(error){
38-
console.error("Could not persist provider-update dismissals.",error);
39-
}
40-
}
41-
42-
exportfunctionisProviderUpdateNotificationDismissed(
43-
dismissalKey: string|null|undefined,
44-
): boolean{
45-
if(!dismissalKey){
46-
returnfalse;
47-
}
48-
returnreadProviderUpdateDismissals().keys.includes(dismissalKey);
49-
}
50-
51-
exportfunctiondismissProviderUpdateNotification(dismissalKey: string|null|undefined): void{
52-
consttrimmedKey=dismissalKey?.trim();
53-
if(!trimmedKey){
54-
return;
55-
}
56-
constdocument=readProviderUpdateDismissals();
57-
if(document.keys.includes(trimmedKey)){
58-
return;
59-
}
60-
writeProviderUpdateDismissals({
61-
keys: [...document.keys,trimmedKey],
62-
});
63-
}
64-
6512
exportfunctionuseDismissedProviderUpdateNotificationKeys(){
6613
const[dismissals,setDismissals]=useLocalStorage(
6714
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,

‎apps/web/src/threadSync.test.ts‎

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import{describe,expect,it}from"vite-plus/test";
22

3-
import{resolveThreadSyncPhase,threadSyncLabel}from"./threadSync";
3+
import{resolveThreadSyncPhase}from"./threadSync";
44

55
describe("resolveThreadSyncPhase",()=>{
66
it("loads when only shell data is available",()=>{
@@ -40,10 +40,3 @@ describe("resolveThreadSyncPhase", () => {
4040
).toBeNull();
4141
});
4242
});
43-
44-
describe("threadSyncLabel",()=>{
45-
it("uses the same loading and syncing language as mobile",()=>{
46-
expect(threadSyncLabel("loading")).toBe("Loading messages...");
47-
expect(threadSyncLabel("syncing")).toBe("Syncing messages...");
48-
});
49-
});

‎apps/web/src/timestampFormat.test.ts‎

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@ import {
66
formatExpiresInLabel,
77
formatRelativeTime,
88
formatRelativeTimeLabel,
9-
formatRelativeTimeUntil,
10-
formatRelativeTimeUntilLabel,
119
formatShortTimestamp,
12-
formatTimestamp,
1310
getRelativeTimeState,
1411
getTimestampFormatOptions,
1512
resolveTimestampLocale,
@@ -76,33 +73,6 @@ describe("resolveTimestampLocale", () => {
7673
});
7774
});
7875

79-
describe("formatRelativeTimeUntilLabel",()=>{
80-
beforeEach(()=>{
81-
vi.useFakeTimers();
82-
vi.setSystemTime(newDate("2026-04-07T12:00:00.000Z"));
83-
});
84-
85-
afterEach(()=>{
86-
vi.useRealTimers();
87-
});
88-
89-
it("returns Expired when the instant is in the past",()=>{
90-
expect(formatRelativeTimeUntilLabel("2026-04-07T11:59:00.000Z")).toBe("Expired");
91-
});
92-
93-
it("formats seconds remaining",()=>{
94-
expect(formatRelativeTimeUntilLabel("2026-04-07T12:00:45.000Z")).toBe("45s left");
95-
});
96-
97-
it("formats minutes remaining",()=>{
98-
expect(formatRelativeTimeUntilLabel("2026-04-07T12:15:00.000Z")).toBe("15m left");
99-
});
100-
101-
it("formats hours remaining",()=>{
102-
expect(formatRelativeTimeUntilLabel("2026-04-07T18:00:00.000Z")).toBe("6h left");
103-
});
104-
});
105-
10676
describe("formatExpiresInLabel",()=>{
10777
beforeEach(()=>{
10878
vi.useFakeTimers();
@@ -196,10 +166,6 @@ describe("formatDayAwareTimestamp", () => {
196166
});
197167

198168
describe("invalid timestamp inputs",()=>{
199-
it("returns an empty timestamp instead of throwing",()=>{
200-
expect(formatTimestamp("not-a-date","12-hour")).toBe("");
201-
});
202-
203169
it("returns an empty short timestamp instead of throwing",()=>{
204170
expect(formatShortTimestamp("not-a-date","12-hour")).toBe("");
205171
});
@@ -218,11 +184,6 @@ describe("invalid timestamp inputs", () => {
218184
expect(formatElapsedDurationLabel("not-a-date")).toBe("");
219185
});
220186

221-
it("returns an empty relative time until label instead of a NaN label",()=>{
222-
expect(formatRelativeTimeUntil("not-a-date")).toBeNull();
223-
expect(formatRelativeTimeUntilLabel("not-a-date")).toBe("");
224-
});
225-
226187
it("returns an empty expires-in label instead of a NaN label",()=>{
227188
expect(formatExpiresInLabel("not-a-date")).toBe("");
228189
});

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Commit 2daff8c

Browse files
authored
test(web): remove tests for unreachable helpers (#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
1 parent 8dcb963 commit 2daff8c

13 files changed

Lines changed: 3 additions & 282 deletions

‎apps/web/src/appearanceFonts.test.ts‎

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@ import {
55
clampCodeFontSize,
66
clampInterfaceFontSize,
77
clampPromptFontSize,
8-
DEFAULT_CODE_FONT_STACK,
9-
DEFAULT_SANS_FONT_STACK,
10-
appearanceFontStack,
118
cssFontFamilies,
129
resolveDefaultFamilyLabel,
1310
resolveTerminalFontPreference,
@@ -58,18 +55,6 @@ describe("resolveDefaultFamilyLabel", () => {
5855
});
5956
});
6057

61-
describe("appearanceFontStack",()=>{
62-
it("prepends the custom family to the default stack",()=>{
63-
expect(appearanceFontStack("Fira Code",DEFAULT_CODE_FONT_STACK)).toBe(
64-
`"Fira Code", ${DEFAULT_CODE_FONT_STACK}`,
65-
);
66-
});
67-
68-
it("falls back to the default stack when unset",()=>{
69-
expect(appearanceFontStack("",DEFAULT_SANS_FONT_STACK)).toBe(DEFAULT_SANS_FONT_STACK);
70-
});
71-
});
72-
7358
describe("resolveTerminalFontPreference",()=>{
7459
it("inherits the code font in simple mode",()=>{
7560
expect(

‎apps/web/src/appearanceFonts.ts‎

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,6 @@ export function cssFontFamilies(input: string): string | null {
7171
returnfamilies.length>0 ? families.join(", ") : null;
7272
}
7373

74-
/** The full stack a preference resolves to: custom families before the default. */
75-
exportfunctionappearanceFontStack(custom: string,defaultStack: string): string{
76-
constfamilies=cssFontFamilies(custom);
77-
returnfamilies===null ? defaultStack : `${families}, ${defaultStack}`;
78-
}
79-
8074
exportinterfaceAppearanceFontPreferences{
8175
readonlysans: string;
8276
readonlycode: string;

‎apps/web/src/components/Sidebar.logic.test.ts‎

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import {
2020
isTrailingDoubleClick,
2121
orderItemsByPreferredIds,
2222
resolveProjectStatusIndicator,
23-
resolveSidebarStageBadgeLabel,
2423
resolveThreadRowClassName,
2524
resolveSidebarThreadStatus,
2625
resolveThreadStatusPill,
@@ -236,44 +235,6 @@ describe("buildMultiSelectThreadContextMenuItems", () => {
236235
});
237236
});
238237

239-
describe("resolveSidebarStageBadgeLabel",()=>{
240-
it("returns Nightly for nightly primary server versions",()=>{
241-
expect(
242-
resolveSidebarStageBadgeLabel({
243-
primaryServerVersion: "0.0.28-nightly.20260616.12",
244-
fallbackStageLabel: "Alpha",
245-
}),
246-
).toBe("Nightly");
247-
});
248-
249-
it("returns the fallback label for stable primary server versions",()=>{
250-
expect(
251-
resolveSidebarStageBadgeLabel({
252-
primaryServerVersion: "0.0.27",
253-
fallbackStageLabel: "Alpha",
254-
}),
255-
).toBe("Alpha");
256-
});
257-
258-
it("returns the fallback label when the primary server version is missing",()=>{
259-
expect(
260-
resolveSidebarStageBadgeLabel({
261-
primaryServerVersion: null,
262-
fallbackStageLabel: "Dev",
263-
}),
264-
).toBe("Dev");
265-
});
266-
267-
it("returns the fallback label for malformed nightly prerelease versions",()=>{
268-
expect(
269-
resolveSidebarStageBadgeLabel({
270-
primaryServerVersion: "0.0.28-nightly.20260616",
271-
fallbackStageLabel: "Alpha",
272-
}),
273-
).toBe("Alpha");
274-
});
275-
});
276-
277238
functionmakeLatestTurn(overrides?: {
278239
completedAt?: string|null;
279240
startedAt?: string|null;

‎apps/web/src/components/Sidebar.logic.ts‎

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import type { SidebarThreadSummary, Thread } from "../types";
1313
importtype{ThreadRouteTarget}from"../threadRoutes";
1414
import{cn}from"../lib/utils";
1515
import{isLatestTurnSettled}from"../session-logic";
16-
import{resolveServerBackedAppStageLabel}from"../branding.logic";
1716

1817
exportconstTHREAD_SELECTION_SAFE_SELECTOR="[data-thread-item], [data-thread-selection-safe]";
1918
exportconstTHREAD_JUMP_HINT_SHOW_DELAY_MS=200;
@@ -170,13 +169,6 @@ export interface ThreadJumpHintVisibilityController {
170169
dispose: ()=>void;
171170
}
172171

173-
exportfunctionresolveSidebarStageBadgeLabel(input: {
174-
primaryServerVersion: string|null|undefined;
175-
fallbackStageLabel: string;
176-
}): string{
177-
returnresolveServerBackedAppStageLabel(input);
178-
}
179-
180172
exportfunctioncreateThreadJumpHintVisibilityController(input: {
181173
delayMs: number;
182174
onVisibilityChange: (visible: boolean)=>void;

‎apps/web/src/pendingUserInput.test.ts‎

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import {
44
buildPendingUserInputAnswers,
55
countAnsweredPendingUserInputQuestions,
66
derivePendingUserInputProgress,
7-
findFirstUnansweredPendingUserInputQuestionIndex,
87
resolvePendingUserInputAnswer,
98
setPendingUserInputCustomAnswer,
109
togglePendingUserInputOptionSelection,
@@ -182,29 +181,6 @@ describe("pending user input question progress", () => {
182181
).toBe(1);
183182
});
184183

185-
it("finds the first unanswered question",()=>{
186-
expect(
187-
findFirstUnansweredPendingUserInputQuestionIndex(questions,{
188-
scope: {
189-
selectedOptionLabels: ["Orchestration-first"],
190-
},
191-
}),
192-
).toBe(1);
193-
});
194-
195-
it("returns the last question index when all answers are complete",()=>{
196-
expect(
197-
findFirstUnansweredPendingUserInputQuestionIndex(questions,{
198-
scope: {
199-
selectedOptionLabels: ["Orchestration-first"],
200-
},
201-
compat: {
202-
customAnswer: "Keep it for one release window",
203-
},
204-
}),
205-
).toBe(1);
206-
});
207-
208184
it("derives the active question and advancement state",()=>{
209185
expect(
210186
derivePendingUserInputProgress(

‎apps/web/src/pendingUserInput.ts‎

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -128,17 +128,6 @@ export function countAnsweredPendingUserInputQuestions(
128128
},0);
129129
}
130130

131-
exportfunctionfindFirstUnansweredPendingUserInputQuestionIndex(
132-
questions: ReadonlyArray<UserInputQuestion>,
133-
draftAnswers: Record<string,PendingUserInputDraftAnswer>,
134-
): number{
135-
constunansweredIndex=questions.findIndex(
136-
(question)=>!resolvePendingUserInputAnswer(question,draftAnswers[question.id]),
137-
);
138-
139-
returnunansweredIndex===-1 ? Math.max(questions.length-1,0) : unansweredIndex;
140-
}
141-
142131
exportfunctionderivePendingUserInputProgress(
143132
questions: ReadonlyArray<UserInputQuestion>,
144133
draftAnswers: Record<string,PendingUserInputDraftAnswer>,

‎apps/web/src/providerUpdateDismissal.test.ts‎

Lines changed: 0 additions & 23 deletions
This file was deleted.

‎apps/web/src/providerUpdateDismissal.ts‎

Lines changed: 2 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,14 @@
11
import{useCallback,useMemo}from"react";
22
import*asSchemafrom"effect/Schema";
33

4-
import{getLocalStorageItem,setLocalStorageItem,useLocalStorage}from"./hooks/useLocalStorage";
4+
import{useLocalStorage}from"./hooks/useLocalStorage";
55

6-
exportconstPROVIDER_UPDATE_DISMISSALS_STORAGE_KEY="t3code:provider-update-dismissals:v1";
6+
constPROVIDER_UPDATE_DISMISSALS_STORAGE_KEY="t3code:provider-update-dismissals:v1";
77

88
constProviderUpdateDismissalsSchema=Schema.Struct({
99
keys: Schema.Array(Schema.String),
1010
});
1111

12-
typeProviderUpdateDismissals=typeofProviderUpdateDismissalsSchema.Type;
13-
14-
functionreadProviderUpdateDismissals(): ProviderUpdateDismissals{
15-
try{
16-
return(
17-
getLocalStorageItem(
18-
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,
19-
ProviderUpdateDismissalsSchema,
20-
)??{
21-
keys: [],
22-
}
23-
);
24-
}catch(error){
25-
console.error("Could not read provider-update dismissals.",error);
26-
return{keys: []};
27-
}
28-
}
29-
30-
functionwriteProviderUpdateDismissals(document: ProviderUpdateDismissals): void{
31-
try{
32-
setLocalStorageItem(
33-
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,
34-
document,
35-
ProviderUpdateDismissalsSchema,
36-
);
37-
}catch(error){
38-
console.error("Could not persist provider-update dismissals.",error);
39-
}
40-
}
41-
42-
exportfunctionisProviderUpdateNotificationDismissed(
43-
dismissalKey: string|null|undefined,
44-
): boolean{
45-
if(!dismissalKey){
46-
returnfalse;
47-
}
48-
returnreadProviderUpdateDismissals().keys.includes(dismissalKey);
49-
}
50-
51-
exportfunctiondismissProviderUpdateNotification(dismissalKey: string|null|undefined): void{
52-
consttrimmedKey=dismissalKey?.trim();
53-
if(!trimmedKey){
54-
return;
55-
}
56-
constdocument=readProviderUpdateDismissals();
57-
if(document.keys.includes(trimmedKey)){
58-
return;
59-
}
60-
writeProviderUpdateDismissals({
61-
keys: [...document.keys,trimmedKey],
62-
});
63-
}
64-
6512
exportfunctionuseDismissedProviderUpdateNotificationKeys(){
6613
const[dismissals,setDismissals]=useLocalStorage(
6714
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,

‎apps/web/src/threadSync.test.ts‎

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import{describe,expect,it}from"vite-plus/test";
22

3-
import{resolveThreadSyncPhase,threadSyncLabel}from"./threadSync";
3+
import{resolveThreadSyncPhase}from"./threadSync";
44

55
describe("resolveThreadSyncPhase",()=>{
66
it("loads when only shell data is available",()=>{
@@ -40,10 +40,3 @@ describe("resolveThreadSyncPhase", () => {
4040
).toBeNull();
4141
});
4242
});
43-
44-
describe("threadSyncLabel",()=>{
45-
it("uses the same loading and syncing language as mobile",()=>{
46-
expect(threadSyncLabel("loading")).toBe("Loading messages...");
47-
expect(threadSyncLabel("syncing")).toBe("Syncing messages...");
48-
});
49-
});

‎apps/web/src/timestampFormat.test.ts‎

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@ import {
66
formatExpiresInLabel,
77
formatRelativeTime,
88
formatRelativeTimeLabel,
9-
formatRelativeTimeUntil,
10-
formatRelativeTimeUntilLabel,
119
formatShortTimestamp,
12-
formatTimestamp,
1310
getRelativeTimeState,
1411
getTimestampFormatOptions,
1512
resolveTimestampLocale,
@@ -76,33 +73,6 @@ describe("resolveTimestampLocale", () => {
7673
});
7774
});
7875

79-
describe("formatRelativeTimeUntilLabel",()=>{
80-
beforeEach(()=>{
81-
vi.useFakeTimers();
82-
vi.setSystemTime(newDate("2026-04-07T12:00:00.000Z"));
83-
});
84-
85-
afterEach(()=>{
86-
vi.useRealTimers();
87-
});
88-
89-
it("returns Expired when the instant is in the past",()=>{
90-
expect(formatRelativeTimeUntilLabel("2026-04-07T11:59:00.000Z")).toBe("Expired");
91-
});
92-
93-
it("formats seconds remaining",()=>{
94-
expect(formatRelativeTimeUntilLabel("2026-04-07T12:00:45.000Z")).toBe("45s left");
95-
});
96-
97-
it("formats minutes remaining",()=>{
98-
expect(formatRelativeTimeUntilLabel("2026-04-07T12:15:00.000Z")).toBe("15m left");
99-
});
100-
101-
it("formats hours remaining",()=>{
102-
expect(formatRelativeTimeUntilLabel("2026-04-07T18:00:00.000Z")).toBe("6h left");
103-
});
104-
});
105-
10676
describe("formatExpiresInLabel",()=>{
10777
beforeEach(()=>{
10878
vi.useFakeTimers();
@@ -196,10 +166,6 @@ describe("formatDayAwareTimestamp", () => {
196166
});
197167

198168
describe("invalid timestamp inputs",()=>{
199-
it("returns an empty timestamp instead of throwing",()=>{
200-
expect(formatTimestamp("not-a-date","12-hour")).toBe("");
201-
});
202-
203169
it("returns an empty short timestamp instead of throwing",()=>{
204170
expect(formatShortTimestamp("not-a-date","12-hour")).toBe("");
205171
});
@@ -218,11 +184,6 @@ describe("invalid timestamp inputs", () => {
218184
expect(formatElapsedDurationLabel("not-a-date")).toBe("");
219185
});
220186

221-
it("returns an empty relative time until label instead of a NaN label",()=>{
222-
expect(formatRelativeTimeUntil("not-a-date")).toBeNull();
223-
expect(formatRelativeTimeUntilLabel("not-a-date")).toBe("");
224-
});
225-
226187
it("returns an empty expires-in label instead of a NaN label",()=>{
227188
expect(formatExpiresInLabel("not-a-date")).toBe("");
228189
});

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Commit 2daff8c

Browse files
authored
test(web): remove tests for unreachable helpers (#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
1 parent 8dcb963 commit 2daff8c

13 files changed

Lines changed: 3 additions & 282 deletions

‎apps/web/src/appearanceFonts.test.ts‎

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@ import {
55
clampCodeFontSize,
66
clampInterfaceFontSize,
77
clampPromptFontSize,
8-
DEFAULT_CODE_FONT_STACK,
9-
DEFAULT_SANS_FONT_STACK,
10-
appearanceFontStack,
118
cssFontFamilies,
129
resolveDefaultFamilyLabel,
1310
resolveTerminalFontPreference,
@@ -58,18 +55,6 @@ describe("resolveDefaultFamilyLabel", () => {
5855
});
5956
});
6057

61-
describe("appearanceFontStack",()=>{
62-
it("prepends the custom family to the default stack",()=>{
63-
expect(appearanceFontStack("Fira Code",DEFAULT_CODE_FONT_STACK)).toBe(
64-
`"Fira Code", ${DEFAULT_CODE_FONT_STACK}`,
65-
);
66-
});
67-
68-
it("falls back to the default stack when unset",()=>{
69-
expect(appearanceFontStack("",DEFAULT_SANS_FONT_STACK)).toBe(DEFAULT_SANS_FONT_STACK);
70-
});
71-
});
72-
7358
describe("resolveTerminalFontPreference",()=>{
7459
it("inherits the code font in simple mode",()=>{
7560
expect(

‎apps/web/src/appearanceFonts.ts‎

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,6 @@ export function cssFontFamilies(input: string): string | null {
7171
returnfamilies.length>0 ? families.join(", ") : null;
7272
}
7373

74-
/** The full stack a preference resolves to: custom families before the default. */
75-
exportfunctionappearanceFontStack(custom: string,defaultStack: string): string{
76-
constfamilies=cssFontFamilies(custom);
77-
returnfamilies===null ? defaultStack : `${families}, ${defaultStack}`;
78-
}
79-
8074
exportinterfaceAppearanceFontPreferences{
8175
readonlysans: string;
8276
readonlycode: string;

‎apps/web/src/components/Sidebar.logic.test.ts‎

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import {
2020
isTrailingDoubleClick,
2121
orderItemsByPreferredIds,
2222
resolveProjectStatusIndicator,
23-
resolveSidebarStageBadgeLabel,
2423
resolveThreadRowClassName,
2524
resolveSidebarThreadStatus,
2625
resolveThreadStatusPill,
@@ -236,44 +235,6 @@ describe("buildMultiSelectThreadContextMenuItems", () => {
236235
});
237236
});
238237

239-
describe("resolveSidebarStageBadgeLabel",()=>{
240-
it("returns Nightly for nightly primary server versions",()=>{
241-
expect(
242-
resolveSidebarStageBadgeLabel({
243-
primaryServerVersion: "0.0.28-nightly.20260616.12",
244-
fallbackStageLabel: "Alpha",
245-
}),
246-
).toBe("Nightly");
247-
});
248-
249-
it("returns the fallback label for stable primary server versions",()=>{
250-
expect(
251-
resolveSidebarStageBadgeLabel({
252-
primaryServerVersion: "0.0.27",
253-
fallbackStageLabel: "Alpha",
254-
}),
255-
).toBe("Alpha");
256-
});
257-
258-
it("returns the fallback label when the primary server version is missing",()=>{
259-
expect(
260-
resolveSidebarStageBadgeLabel({
261-
primaryServerVersion: null,
262-
fallbackStageLabel: "Dev",
263-
}),
264-
).toBe("Dev");
265-
});
266-
267-
it("returns the fallback label for malformed nightly prerelease versions",()=>{
268-
expect(
269-
resolveSidebarStageBadgeLabel({
270-
primaryServerVersion: "0.0.28-nightly.20260616",
271-
fallbackStageLabel: "Alpha",
272-
}),
273-
).toBe("Alpha");
274-
});
275-
});
276-
277238
functionmakeLatestTurn(overrides?: {
278239
completedAt?: string|null;
279240
startedAt?: string|null;

‎apps/web/src/components/Sidebar.logic.ts‎

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import type { SidebarThreadSummary, Thread } from "../types";
1313
importtype{ThreadRouteTarget}from"../threadRoutes";
1414
import{cn}from"../lib/utils";
1515
import{isLatestTurnSettled}from"../session-logic";
16-
import{resolveServerBackedAppStageLabel}from"../branding.logic";
1716

1817
exportconstTHREAD_SELECTION_SAFE_SELECTOR="[data-thread-item], [data-thread-selection-safe]";
1918
exportconstTHREAD_JUMP_HINT_SHOW_DELAY_MS=200;
@@ -170,13 +169,6 @@ export interface ThreadJumpHintVisibilityController {
170169
dispose: ()=>void;
171170
}
172171

173-
exportfunctionresolveSidebarStageBadgeLabel(input: {
174-
primaryServerVersion: string|null|undefined;
175-
fallbackStageLabel: string;
176-
}): string{
177-
returnresolveServerBackedAppStageLabel(input);
178-
}
179-
180172
exportfunctioncreateThreadJumpHintVisibilityController(input: {
181173
delayMs: number;
182174
onVisibilityChange: (visible: boolean)=>void;

‎apps/web/src/pendingUserInput.test.ts‎

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import {
44
buildPendingUserInputAnswers,
55
countAnsweredPendingUserInputQuestions,
66
derivePendingUserInputProgress,
7-
findFirstUnansweredPendingUserInputQuestionIndex,
87
resolvePendingUserInputAnswer,
98
setPendingUserInputCustomAnswer,
109
togglePendingUserInputOptionSelection,
@@ -182,29 +181,6 @@ describe("pending user input question progress", () => {
182181
).toBe(1);
183182
});
184183

185-
it("finds the first unanswered question",()=>{
186-
expect(
187-
findFirstUnansweredPendingUserInputQuestionIndex(questions,{
188-
scope: {
189-
selectedOptionLabels: ["Orchestration-first"],
190-
},
191-
}),
192-
).toBe(1);
193-
});
194-
195-
it("returns the last question index when all answers are complete",()=>{
196-
expect(
197-
findFirstUnansweredPendingUserInputQuestionIndex(questions,{
198-
scope: {
199-
selectedOptionLabels: ["Orchestration-first"],
200-
},
201-
compat: {
202-
customAnswer: "Keep it for one release window",
203-
},
204-
}),
205-
).toBe(1);
206-
});
207-
208184
it("derives the active question and advancement state",()=>{
209185
expect(
210186
derivePendingUserInputProgress(

‎apps/web/src/pendingUserInput.ts‎

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -128,17 +128,6 @@ export function countAnsweredPendingUserInputQuestions(
128128
},0);
129129
}
130130

131-
exportfunctionfindFirstUnansweredPendingUserInputQuestionIndex(
132-
questions: ReadonlyArray<UserInputQuestion>,
133-
draftAnswers: Record<string,PendingUserInputDraftAnswer>,
134-
): number{
135-
constunansweredIndex=questions.findIndex(
136-
(question)=>!resolvePendingUserInputAnswer(question,draftAnswers[question.id]),
137-
);
138-
139-
returnunansweredIndex===-1 ? Math.max(questions.length-1,0) : unansweredIndex;
140-
}
141-
142131
exportfunctionderivePendingUserInputProgress(
143132
questions: ReadonlyArray<UserInputQuestion>,
144133
draftAnswers: Record<string,PendingUserInputDraftAnswer>,

‎apps/web/src/providerUpdateDismissal.test.ts‎

Lines changed: 0 additions & 23 deletions
This file was deleted.

‎apps/web/src/providerUpdateDismissal.ts‎

Lines changed: 2 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,14 @@
11
import{useCallback,useMemo}from"react";
22
import*asSchemafrom"effect/Schema";
33

4-
import{getLocalStorageItem,setLocalStorageItem,useLocalStorage}from"./hooks/useLocalStorage";
4+
import{useLocalStorage}from"./hooks/useLocalStorage";
55

6-
exportconstPROVIDER_UPDATE_DISMISSALS_STORAGE_KEY="t3code:provider-update-dismissals:v1";
6+
constPROVIDER_UPDATE_DISMISSALS_STORAGE_KEY="t3code:provider-update-dismissals:v1";
77

88
constProviderUpdateDismissalsSchema=Schema.Struct({
99
keys: Schema.Array(Schema.String),
1010
});
1111

12-
typeProviderUpdateDismissals=typeofProviderUpdateDismissalsSchema.Type;
13-
14-
functionreadProviderUpdateDismissals(): ProviderUpdateDismissals{
15-
try{
16-
return(
17-
getLocalStorageItem(
18-
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,
19-
ProviderUpdateDismissalsSchema,
20-
)??{
21-
keys: [],
22-
}
23-
);
24-
}catch(error){
25-
console.error("Could not read provider-update dismissals.",error);
26-
return{keys: []};
27-
}
28-
}
29-
30-
functionwriteProviderUpdateDismissals(document: ProviderUpdateDismissals): void{
31-
try{
32-
setLocalStorageItem(
33-
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,
34-
document,
35-
ProviderUpdateDismissalsSchema,
36-
);
37-
}catch(error){
38-
console.error("Could not persist provider-update dismissals.",error);
39-
}
40-
}
41-
42-
exportfunctionisProviderUpdateNotificationDismissed(
43-
dismissalKey: string|null|undefined,
44-
): boolean{
45-
if(!dismissalKey){
46-
returnfalse;
47-
}
48-
returnreadProviderUpdateDismissals().keys.includes(dismissalKey);
49-
}
50-
51-
exportfunctiondismissProviderUpdateNotification(dismissalKey: string|null|undefined): void{
52-
consttrimmedKey=dismissalKey?.trim();
53-
if(!trimmedKey){
54-
return;
55-
}
56-
constdocument=readProviderUpdateDismissals();
57-
if(document.keys.includes(trimmedKey)){
58-
return;
59-
}
60-
writeProviderUpdateDismissals({
61-
keys: [...document.keys,trimmedKey],
62-
});
63-
}
64-
6512
exportfunctionuseDismissedProviderUpdateNotificationKeys(){
6613
const[dismissals,setDismissals]=useLocalStorage(
6714
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,

‎apps/web/src/threadSync.test.ts‎

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import{describe,expect,it}from"vite-plus/test";
22

3-
import{resolveThreadSyncPhase,threadSyncLabel}from"./threadSync";
3+
import{resolveThreadSyncPhase}from"./threadSync";
44

55
describe("resolveThreadSyncPhase",()=>{
66
it("loads when only shell data is available",()=>{
@@ -40,10 +40,3 @@ describe("resolveThreadSyncPhase", () => {
4040
).toBeNull();
4141
});
4242
});
43-
44-
describe("threadSyncLabel",()=>{
45-
it("uses the same loading and syncing language as mobile",()=>{
46-
expect(threadSyncLabel("loading")).toBe("Loading messages...");
47-
expect(threadSyncLabel("syncing")).toBe("Syncing messages...");
48-
});
49-
});

‎apps/web/src/timestampFormat.test.ts‎

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@ import {
66
formatExpiresInLabel,
77
formatRelativeTime,
88
formatRelativeTimeLabel,
9-
formatRelativeTimeUntil,
10-
formatRelativeTimeUntilLabel,
119
formatShortTimestamp,
12-
formatTimestamp,
1310
getRelativeTimeState,
1411
getTimestampFormatOptions,
1512
resolveTimestampLocale,
@@ -76,33 +73,6 @@ describe("resolveTimestampLocale", () => {
7673
});
7774
});
7875

79-
describe("formatRelativeTimeUntilLabel",()=>{
80-
beforeEach(()=>{
81-
vi.useFakeTimers();
82-
vi.setSystemTime(newDate("2026-04-07T12:00:00.000Z"));
83-
});
84-
85-
afterEach(()=>{
86-
vi.useRealTimers();
87-
});
88-
89-
it("returns Expired when the instant is in the past",()=>{
90-
expect(formatRelativeTimeUntilLabel("2026-04-07T11:59:00.000Z")).toBe("Expired");
91-
});
92-
93-
it("formats seconds remaining",()=>{
94-
expect(formatRelativeTimeUntilLabel("2026-04-07T12:00:45.000Z")).toBe("45s left");
95-
});
96-
97-
it("formats minutes remaining",()=>{
98-
expect(formatRelativeTimeUntilLabel("2026-04-07T12:15:00.000Z")).toBe("15m left");
99-
});
100-
101-
it("formats hours remaining",()=>{
102-
expect(formatRelativeTimeUntilLabel("2026-04-07T18:00:00.000Z")).toBe("6h left");
103-
});
104-
});
105-
10676
describe("formatExpiresInLabel",()=>{
10777
beforeEach(()=>{
10878
vi.useFakeTimers();
@@ -196,10 +166,6 @@ describe("formatDayAwareTimestamp", () => {
196166
});
197167

198168
describe("invalid timestamp inputs",()=>{
199-
it("returns an empty timestamp instead of throwing",()=>{
200-
expect(formatTimestamp("not-a-date","12-hour")).toBe("");
201-
});
202-
203169
it("returns an empty short timestamp instead of throwing",()=>{
204170
expect(formatShortTimestamp("not-a-date","12-hour")).toBe("");
205171
});
@@ -218,11 +184,6 @@ describe("invalid timestamp inputs", () => {
218184
expect(formatElapsedDurationLabel("not-a-date")).toBe("");
219185
});
220186

221-
it("returns an empty relative time until label instead of a NaN label",()=>{
222-
expect(formatRelativeTimeUntil("not-a-date")).toBeNull();
223-
expect(formatRelativeTimeUntilLabel("not-a-date")).toBe("");
224-
});
225-
226187
it("returns an empty expires-in label instead of a NaN label",()=>{
227188
expect(formatExpiresInLabel("not-a-date")).toBe("");
228189
});

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Commit 2daff8c

Browse files
authored
test(web): remove tests for unreachable helpers (#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
1 parent 8dcb963 commit 2daff8c

13 files changed

Lines changed: 3 additions & 282 deletions

‎apps/web/src/appearanceFonts.test.ts‎

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@ import {
55
clampCodeFontSize,
66
clampInterfaceFontSize,
77
clampPromptFontSize,
8-
DEFAULT_CODE_FONT_STACK,
9-
DEFAULT_SANS_FONT_STACK,
10-
appearanceFontStack,
118
cssFontFamilies,
129
resolveDefaultFamilyLabel,
1310
resolveTerminalFontPreference,
@@ -58,18 +55,6 @@ describe("resolveDefaultFamilyLabel", () => {
5855
});
5956
});
6057

61-
describe("appearanceFontStack",()=>{
62-
it("prepends the custom family to the default stack",()=>{
63-
expect(appearanceFontStack("Fira Code",DEFAULT_CODE_FONT_STACK)).toBe(
64-
`"Fira Code", ${DEFAULT_CODE_FONT_STACK}`,
65-
);
66-
});
67-
68-
it("falls back to the default stack when unset",()=>{
69-
expect(appearanceFontStack("",DEFAULT_SANS_FONT_STACK)).toBe(DEFAULT_SANS_FONT_STACK);
70-
});
71-
});
72-
7358
describe("resolveTerminalFontPreference",()=>{
7459
it("inherits the code font in simple mode",()=>{
7560
expect(

‎apps/web/src/appearanceFonts.ts‎

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,6 @@ export function cssFontFamilies(input: string): string | null {
7171
returnfamilies.length>0 ? families.join(", ") : null;
7272
}
7373

74-
/** The full stack a preference resolves to: custom families before the default. */
75-
exportfunctionappearanceFontStack(custom: string,defaultStack: string): string{
76-
constfamilies=cssFontFamilies(custom);
77-
returnfamilies===null ? defaultStack : `${families}, ${defaultStack}`;
78-
}
79-
8074
exportinterfaceAppearanceFontPreferences{
8175
readonlysans: string;
8276
readonlycode: string;

‎apps/web/src/components/Sidebar.logic.test.ts‎

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import {
2020
isTrailingDoubleClick,
2121
orderItemsByPreferredIds,
2222
resolveProjectStatusIndicator,
23-
resolveSidebarStageBadgeLabel,
2423
resolveThreadRowClassName,
2524
resolveSidebarThreadStatus,
2625
resolveThreadStatusPill,
@@ -236,44 +235,6 @@ describe("buildMultiSelectThreadContextMenuItems", () => {
236235
});
237236
});
238237

239-
describe("resolveSidebarStageBadgeLabel",()=>{
240-
it("returns Nightly for nightly primary server versions",()=>{
241-
expect(
242-
resolveSidebarStageBadgeLabel({
243-
primaryServerVersion: "0.0.28-nightly.20260616.12",
244-
fallbackStageLabel: "Alpha",
245-
}),
246-
).toBe("Nightly");
247-
});
248-
249-
it("returns the fallback label for stable primary server versions",()=>{
250-
expect(
251-
resolveSidebarStageBadgeLabel({
252-
primaryServerVersion: "0.0.27",
253-
fallbackStageLabel: "Alpha",
254-
}),
255-
).toBe("Alpha");
256-
});
257-
258-
it("returns the fallback label when the primary server version is missing",()=>{
259-
expect(
260-
resolveSidebarStageBadgeLabel({
261-
primaryServerVersion: null,
262-
fallbackStageLabel: "Dev",
263-
}),
264-
).toBe("Dev");
265-
});
266-
267-
it("returns the fallback label for malformed nightly prerelease versions",()=>{
268-
expect(
269-
resolveSidebarStageBadgeLabel({
270-
primaryServerVersion: "0.0.28-nightly.20260616",
271-
fallbackStageLabel: "Alpha",
272-
}),
273-
).toBe("Alpha");
274-
});
275-
});
276-
277238
functionmakeLatestTurn(overrides?: {
278239
completedAt?: string|null;
279240
startedAt?: string|null;

‎apps/web/src/components/Sidebar.logic.ts‎

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import type { SidebarThreadSummary, Thread } from "../types";
1313
importtype{ThreadRouteTarget}from"../threadRoutes";
1414
import{cn}from"../lib/utils";
1515
import{isLatestTurnSettled}from"../session-logic";
16-
import{resolveServerBackedAppStageLabel}from"../branding.logic";
1716

1817
exportconstTHREAD_SELECTION_SAFE_SELECTOR="[data-thread-item], [data-thread-selection-safe]";
1918
exportconstTHREAD_JUMP_HINT_SHOW_DELAY_MS=200;
@@ -170,13 +169,6 @@ export interface ThreadJumpHintVisibilityController {
170169
dispose: ()=>void;
171170
}
172171

173-
exportfunctionresolveSidebarStageBadgeLabel(input: {
174-
primaryServerVersion: string|null|undefined;
175-
fallbackStageLabel: string;
176-
}): string{
177-
returnresolveServerBackedAppStageLabel(input);
178-
}
179-
180172
exportfunctioncreateThreadJumpHintVisibilityController(input: {
181173
delayMs: number;
182174
onVisibilityChange: (visible: boolean)=>void;

‎apps/web/src/pendingUserInput.test.ts‎

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import {
44
buildPendingUserInputAnswers,
55
countAnsweredPendingUserInputQuestions,
66
derivePendingUserInputProgress,
7-
findFirstUnansweredPendingUserInputQuestionIndex,
87
resolvePendingUserInputAnswer,
98
setPendingUserInputCustomAnswer,
109
togglePendingUserInputOptionSelection,
@@ -182,29 +181,6 @@ describe("pending user input question progress", () => {
182181
).toBe(1);
183182
});
184183

185-
it("finds the first unanswered question",()=>{
186-
expect(
187-
findFirstUnansweredPendingUserInputQuestionIndex(questions,{
188-
scope: {
189-
selectedOptionLabels: ["Orchestration-first"],
190-
},
191-
}),
192-
).toBe(1);
193-
});
194-
195-
it("returns the last question index when all answers are complete",()=>{
196-
expect(
197-
findFirstUnansweredPendingUserInputQuestionIndex(questions,{
198-
scope: {
199-
selectedOptionLabels: ["Orchestration-first"],
200-
},
201-
compat: {
202-
customAnswer: "Keep it for one release window",
203-
},
204-
}),
205-
).toBe(1);
206-
});
207-
208184
it("derives the active question and advancement state",()=>{
209185
expect(
210186
derivePendingUserInputProgress(

‎apps/web/src/pendingUserInput.ts‎

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -128,17 +128,6 @@ export function countAnsweredPendingUserInputQuestions(
128128
},0);
129129
}
130130

131-
exportfunctionfindFirstUnansweredPendingUserInputQuestionIndex(
132-
questions: ReadonlyArray<UserInputQuestion>,
133-
draftAnswers: Record<string,PendingUserInputDraftAnswer>,
134-
): number{
135-
constunansweredIndex=questions.findIndex(
136-
(question)=>!resolvePendingUserInputAnswer(question,draftAnswers[question.id]),
137-
);
138-
139-
returnunansweredIndex===-1 ? Math.max(questions.length-1,0) : unansweredIndex;
140-
}
141-
142131
exportfunctionderivePendingUserInputProgress(
143132
questions: ReadonlyArray<UserInputQuestion>,
144133
draftAnswers: Record<string,PendingUserInputDraftAnswer>,

‎apps/web/src/providerUpdateDismissal.test.ts‎

Lines changed: 0 additions & 23 deletions
This file was deleted.

‎apps/web/src/providerUpdateDismissal.ts‎

Lines changed: 2 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,14 @@
11
import{useCallback,useMemo}from"react";
22
import*asSchemafrom"effect/Schema";
33

4-
import{getLocalStorageItem,setLocalStorageItem,useLocalStorage}from"./hooks/useLocalStorage";
4+
import{useLocalStorage}from"./hooks/useLocalStorage";
55

6-
exportconstPROVIDER_UPDATE_DISMISSALS_STORAGE_KEY="t3code:provider-update-dismissals:v1";
6+
constPROVIDER_UPDATE_DISMISSALS_STORAGE_KEY="t3code:provider-update-dismissals:v1";
77

88
constProviderUpdateDismissalsSchema=Schema.Struct({
99
keys: Schema.Array(Schema.String),
1010
});
1111

12-
typeProviderUpdateDismissals=typeofProviderUpdateDismissalsSchema.Type;
13-
14-
functionreadProviderUpdateDismissals(): ProviderUpdateDismissals{
15-
try{
16-
return(
17-
getLocalStorageItem(
18-
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,
19-
ProviderUpdateDismissalsSchema,
20-
)??{
21-
keys: [],
22-
}
23-
);
24-
}catch(error){
25-
console.error("Could not read provider-update dismissals.",error);
26-
return{keys: []};
27-
}
28-
}
29-
30-
functionwriteProviderUpdateDismissals(document: ProviderUpdateDismissals): void{
31-
try{
32-
setLocalStorageItem(
33-
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,
34-
document,
35-
ProviderUpdateDismissalsSchema,
36-
);
37-
}catch(error){
38-
console.error("Could not persist provider-update dismissals.",error);
39-
}
40-
}
41-
42-
exportfunctionisProviderUpdateNotificationDismissed(
43-
dismissalKey: string|null|undefined,
44-
): boolean{
45-
if(!dismissalKey){
46-
returnfalse;
47-
}
48-
returnreadProviderUpdateDismissals().keys.includes(dismissalKey);
49-
}
50-
51-
exportfunctiondismissProviderUpdateNotification(dismissalKey: string|null|undefined): void{
52-
consttrimmedKey=dismissalKey?.trim();
53-
if(!trimmedKey){
54-
return;
55-
}
56-
constdocument=readProviderUpdateDismissals();
57-
if(document.keys.includes(trimmedKey)){
58-
return;
59-
}
60-
writeProviderUpdateDismissals({
61-
keys: [...document.keys,trimmedKey],
62-
});
63-
}
64-
6512
exportfunctionuseDismissedProviderUpdateNotificationKeys(){
6613
const[dismissals,setDismissals]=useLocalStorage(
6714
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,

‎apps/web/src/threadSync.test.ts‎

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import{describe,expect,it}from"vite-plus/test";
22

3-
import{resolveThreadSyncPhase,threadSyncLabel}from"./threadSync";
3+
import{resolveThreadSyncPhase}from"./threadSync";
44

55
describe("resolveThreadSyncPhase",()=>{
66
it("loads when only shell data is available",()=>{
@@ -40,10 +40,3 @@ describe("resolveThreadSyncPhase", () => {
4040
).toBeNull();
4141
});
4242
});
43-
44-
describe("threadSyncLabel",()=>{
45-
it("uses the same loading and syncing language as mobile",()=>{
46-
expect(threadSyncLabel("loading")).toBe("Loading messages...");
47-
expect(threadSyncLabel("syncing")).toBe("Syncing messages...");
48-
});
49-
});

‎apps/web/src/timestampFormat.test.ts‎

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@ import {
66
formatExpiresInLabel,
77
formatRelativeTime,
88
formatRelativeTimeLabel,
9-
formatRelativeTimeUntil,
10-
formatRelativeTimeUntilLabel,
119
formatShortTimestamp,
12-
formatTimestamp,
1310
getRelativeTimeState,
1411
getTimestampFormatOptions,
1512
resolveTimestampLocale,
@@ -76,33 +73,6 @@ describe("resolveTimestampLocale", () => {
7673
});
7774
});
7875

79-
describe("formatRelativeTimeUntilLabel",()=>{
80-
beforeEach(()=>{
81-
vi.useFakeTimers();
82-
vi.setSystemTime(newDate("2026-04-07T12:00:00.000Z"));
83-
});
84-
85-
afterEach(()=>{
86-
vi.useRealTimers();
87-
});
88-
89-
it("returns Expired when the instant is in the past",()=>{
90-
expect(formatRelativeTimeUntilLabel("2026-04-07T11:59:00.000Z")).toBe("Expired");
91-
});
92-
93-
it("formats seconds remaining",()=>{
94-
expect(formatRelativeTimeUntilLabel("2026-04-07T12:00:45.000Z")).toBe("45s left");
95-
});
96-
97-
it("formats minutes remaining",()=>{
98-
expect(formatRelativeTimeUntilLabel("2026-04-07T12:15:00.000Z")).toBe("15m left");
99-
});
100-
101-
it("formats hours remaining",()=>{
102-
expect(formatRelativeTimeUntilLabel("2026-04-07T18:00:00.000Z")).toBe("6h left");
103-
});
104-
});
105-
10676
describe("formatExpiresInLabel",()=>{
10777
beforeEach(()=>{
10878
vi.useFakeTimers();
@@ -196,10 +166,6 @@ describe("formatDayAwareTimestamp", () => {
196166
});
197167

198168
describe("invalid timestamp inputs",()=>{
199-
it("returns an empty timestamp instead of throwing",()=>{
200-
expect(formatTimestamp("not-a-date","12-hour")).toBe("");
201-
});
202-
203169
it("returns an empty short timestamp instead of throwing",()=>{
204170
expect(formatShortTimestamp("not-a-date","12-hour")).toBe("");
205171
});
@@ -218,11 +184,6 @@ describe("invalid timestamp inputs", () => {
218184
expect(formatElapsedDurationLabel("not-a-date")).toBe("");
219185
});
220186

221-
it("returns an empty relative time until label instead of a NaN label",()=>{
222-
expect(formatRelativeTimeUntil("not-a-date")).toBeNull();
223-
expect(formatRelativeTimeUntilLabel("not-a-date")).toBe("");
224-
});
225-
226187
it("returns an empty expires-in label instead of a NaN label",()=>{
227188
expect(formatExpiresInLabel("not-a-date")).toBe("");
228189
});

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Commit 2daff8c

Browse files
authored
test(web): remove tests for unreachable helpers (#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
1 parent 8dcb963 commit 2daff8c

13 files changed

Lines changed: 3 additions & 282 deletions

‎apps/web/src/appearanceFonts.test.ts‎

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@ import {
55
clampCodeFontSize,
66
clampInterfaceFontSize,
77
clampPromptFontSize,
8-
DEFAULT_CODE_FONT_STACK,
9-
DEFAULT_SANS_FONT_STACK,
10-
appearanceFontStack,
118
cssFontFamilies,
129
resolveDefaultFamilyLabel,
1310
resolveTerminalFontPreference,
@@ -58,18 +55,6 @@ describe("resolveDefaultFamilyLabel", () => {
5855
});
5956
});
6057

61-
describe("appearanceFontStack",()=>{
62-
it("prepends the custom family to the default stack",()=>{
63-
expect(appearanceFontStack("Fira Code",DEFAULT_CODE_FONT_STACK)).toBe(
64-
`"Fira Code", ${DEFAULT_CODE_FONT_STACK}`,
65-
);
66-
});
67-
68-
it("falls back to the default stack when unset",()=>{
69-
expect(appearanceFontStack("",DEFAULT_SANS_FONT_STACK)).toBe(DEFAULT_SANS_FONT_STACK);
70-
});
71-
});
72-
7358
describe("resolveTerminalFontPreference",()=>{
7459
it("inherits the code font in simple mode",()=>{
7560
expect(

‎apps/web/src/appearanceFonts.ts‎

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,6 @@ export function cssFontFamilies(input: string): string | null {
7171
returnfamilies.length>0 ? families.join(", ") : null;
7272
}
7373

74-
/** The full stack a preference resolves to: custom families before the default. */
75-
exportfunctionappearanceFontStack(custom: string,defaultStack: string): string{
76-
constfamilies=cssFontFamilies(custom);
77-
returnfamilies===null ? defaultStack : `${families}, ${defaultStack}`;
78-
}
79-
8074
exportinterfaceAppearanceFontPreferences{
8175
readonlysans: string;
8276
readonlycode: string;

‎apps/web/src/components/Sidebar.logic.test.ts‎

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import {
2020
isTrailingDoubleClick,
2121
orderItemsByPreferredIds,
2222
resolveProjectStatusIndicator,
23-
resolveSidebarStageBadgeLabel,
2423
resolveThreadRowClassName,
2524
resolveSidebarThreadStatus,
2625
resolveThreadStatusPill,
@@ -236,44 +235,6 @@ describe("buildMultiSelectThreadContextMenuItems", () => {
236235
});
237236
});
238237

239-
describe("resolveSidebarStageBadgeLabel",()=>{
240-
it("returns Nightly for nightly primary server versions",()=>{
241-
expect(
242-
resolveSidebarStageBadgeLabel({
243-
primaryServerVersion: "0.0.28-nightly.20260616.12",
244-
fallbackStageLabel: "Alpha",
245-
}),
246-
).toBe("Nightly");
247-
});
248-
249-
it("returns the fallback label for stable primary server versions",()=>{
250-
expect(
251-
resolveSidebarStageBadgeLabel({
252-
primaryServerVersion: "0.0.27",
253-
fallbackStageLabel: "Alpha",
254-
}),
255-
).toBe("Alpha");
256-
});
257-
258-
it("returns the fallback label when the primary server version is missing",()=>{
259-
expect(
260-
resolveSidebarStageBadgeLabel({
261-
primaryServerVersion: null,
262-
fallbackStageLabel: "Dev",
263-
}),
264-
).toBe("Dev");
265-
});
266-
267-
it("returns the fallback label for malformed nightly prerelease versions",()=>{
268-
expect(
269-
resolveSidebarStageBadgeLabel({
270-
primaryServerVersion: "0.0.28-nightly.20260616",
271-
fallbackStageLabel: "Alpha",
272-
}),
273-
).toBe("Alpha");
274-
});
275-
});
276-
277238
functionmakeLatestTurn(overrides?: {
278239
completedAt?: string|null;
279240
startedAt?: string|null;

‎apps/web/src/components/Sidebar.logic.ts‎

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import type { SidebarThreadSummary, Thread } from "../types";
1313
importtype{ThreadRouteTarget}from"../threadRoutes";
1414
import{cn}from"../lib/utils";
1515
import{isLatestTurnSettled}from"../session-logic";
16-
import{resolveServerBackedAppStageLabel}from"../branding.logic";
1716

1817
exportconstTHREAD_SELECTION_SAFE_SELECTOR="[data-thread-item], [data-thread-selection-safe]";
1918
exportconstTHREAD_JUMP_HINT_SHOW_DELAY_MS=200;
@@ -170,13 +169,6 @@ export interface ThreadJumpHintVisibilityController {
170169
dispose: ()=>void;
171170
}
172171

173-
exportfunctionresolveSidebarStageBadgeLabel(input: {
174-
primaryServerVersion: string|null|undefined;
175-
fallbackStageLabel: string;
176-
}): string{
177-
returnresolveServerBackedAppStageLabel(input);
178-
}
179-
180172
exportfunctioncreateThreadJumpHintVisibilityController(input: {
181173
delayMs: number;
182174
onVisibilityChange: (visible: boolean)=>void;

‎apps/web/src/pendingUserInput.test.ts‎

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import {
44
buildPendingUserInputAnswers,
55
countAnsweredPendingUserInputQuestions,
66
derivePendingUserInputProgress,
7-
findFirstUnansweredPendingUserInputQuestionIndex,
87
resolvePendingUserInputAnswer,
98
setPendingUserInputCustomAnswer,
109
togglePendingUserInputOptionSelection,
@@ -182,29 +181,6 @@ describe("pending user input question progress", () => {
182181
).toBe(1);
183182
});
184183

185-
it("finds the first unanswered question",()=>{
186-
expect(
187-
findFirstUnansweredPendingUserInputQuestionIndex(questions,{
188-
scope: {
189-
selectedOptionLabels: ["Orchestration-first"],
190-
},
191-
}),
192-
).toBe(1);
193-
});
194-
195-
it("returns the last question index when all answers are complete",()=>{
196-
expect(
197-
findFirstUnansweredPendingUserInputQuestionIndex(questions,{
198-
scope: {
199-
selectedOptionLabels: ["Orchestration-first"],
200-
},
201-
compat: {
202-
customAnswer: "Keep it for one release window",
203-
},
204-
}),
205-
).toBe(1);
206-
});
207-
208184
it("derives the active question and advancement state",()=>{
209185
expect(
210186
derivePendingUserInputProgress(

‎apps/web/src/pendingUserInput.ts‎

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -128,17 +128,6 @@ export function countAnsweredPendingUserInputQuestions(
128128
},0);
129129
}
130130

131-
exportfunctionfindFirstUnansweredPendingUserInputQuestionIndex(
132-
questions: ReadonlyArray<UserInputQuestion>,
133-
draftAnswers: Record<string,PendingUserInputDraftAnswer>,
134-
): number{
135-
constunansweredIndex=questions.findIndex(
136-
(question)=>!resolvePendingUserInputAnswer(question,draftAnswers[question.id]),
137-
);
138-
139-
returnunansweredIndex===-1 ? Math.max(questions.length-1,0) : unansweredIndex;
140-
}
141-
142131
exportfunctionderivePendingUserInputProgress(
143132
questions: ReadonlyArray<UserInputQuestion>,
144133
draftAnswers: Record<string,PendingUserInputDraftAnswer>,

‎apps/web/src/providerUpdateDismissal.test.ts‎

Lines changed: 0 additions & 23 deletions
This file was deleted.

‎apps/web/src/providerUpdateDismissal.ts‎

Lines changed: 2 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,14 @@
11
import{useCallback,useMemo}from"react";
22
import*asSchemafrom"effect/Schema";
33

4-
import{getLocalStorageItem,setLocalStorageItem,useLocalStorage}from"./hooks/useLocalStorage";
4+
import{useLocalStorage}from"./hooks/useLocalStorage";
55

6-
exportconstPROVIDER_UPDATE_DISMISSALS_STORAGE_KEY="t3code:provider-update-dismissals:v1";
6+
constPROVIDER_UPDATE_DISMISSALS_STORAGE_KEY="t3code:provider-update-dismissals:v1";
77

88
constProviderUpdateDismissalsSchema=Schema.Struct({
99
keys: Schema.Array(Schema.String),
1010
});
1111

12-
typeProviderUpdateDismissals=typeofProviderUpdateDismissalsSchema.Type;
13-
14-
functionreadProviderUpdateDismissals(): ProviderUpdateDismissals{
15-
try{
16-
return(
17-
getLocalStorageItem(
18-
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,
19-
ProviderUpdateDismissalsSchema,
20-
)??{
21-
keys: [],
22-
}
23-
);
24-
}catch(error){
25-
console.error("Could not read provider-update dismissals.",error);
26-
return{keys: []};
27-
}
28-
}
29-
30-
functionwriteProviderUpdateDismissals(document: ProviderUpdateDismissals): void{
31-
try{
32-
setLocalStorageItem(
33-
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,
34-
document,
35-
ProviderUpdateDismissalsSchema,
36-
);
37-
}catch(error){
38-
console.error("Could not persist provider-update dismissals.",error);
39-
}
40-
}
41-
42-
exportfunctionisProviderUpdateNotificationDismissed(
43-
dismissalKey: string|null|undefined,
44-
): boolean{
45-
if(!dismissalKey){
46-
returnfalse;
47-
}
48-
returnreadProviderUpdateDismissals().keys.includes(dismissalKey);
49-
}
50-
51-
exportfunctiondismissProviderUpdateNotification(dismissalKey: string|null|undefined): void{
52-
consttrimmedKey=dismissalKey?.trim();
53-
if(!trimmedKey){
54-
return;
55-
}
56-
constdocument=readProviderUpdateDismissals();
57-
if(document.keys.includes(trimmedKey)){
58-
return;
59-
}
60-
writeProviderUpdateDismissals({
61-
keys: [...document.keys,trimmedKey],
62-
});
63-
}
64-
6512
exportfunctionuseDismissedProviderUpdateNotificationKeys(){
6613
const[dismissals,setDismissals]=useLocalStorage(
6714
PROVIDER_UPDATE_DISMISSALS_STORAGE_KEY,

‎apps/web/src/threadSync.test.ts‎

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import{describe,expect,it}from"vite-plus/test";
22

3-
import{resolveThreadSyncPhase,threadSyncLabel}from"./threadSync";
3+
import{resolveThreadSyncPhase}from"./threadSync";
44

55
describe("resolveThreadSyncPhase",()=>{
66
it("loads when only shell data is available",()=>{
@@ -40,10 +40,3 @@ describe("resolveThreadSyncPhase", () => {
4040
).toBeNull();
4141
});
4242
});
43-
44-
describe("threadSyncLabel",()=>{
45-
it("uses the same loading and syncing language as mobile",()=>{
46-
expect(threadSyncLabel("loading")).toBe("Loading messages...");
47-
expect(threadSyncLabel("syncing")).toBe("Syncing messages...");
48-
});
49-
});

‎apps/web/src/timestampFormat.test.ts‎

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@ import {
66
formatExpiresInLabel,
77
formatRelativeTime,
88
formatRelativeTimeLabel,
9-
formatRelativeTimeUntil,
10-
formatRelativeTimeUntilLabel,
119
formatShortTimestamp,
12-
formatTimestamp,
1310
getRelativeTimeState,
1411
getTimestampFormatOptions,
1512
resolveTimestampLocale,
@@ -76,33 +73,6 @@ describe("resolveTimestampLocale", () => {
7673
});
7774
});
7875

79-
describe("formatRelativeTimeUntilLabel",()=>{
80-
beforeEach(()=>{
81-
vi.useFakeTimers();
82-
vi.setSystemTime(newDate("2026-04-07T12:00:00.000Z"));
83-
});
84-
85-
afterEach(()=>{
86-
vi.useRealTimers();
87-
});
88-
89-
it("returns Expired when the instant is in the past",()=>{
90-
expect(formatRelativeTimeUntilLabel("2026-04-07T11:59:00.000Z")).toBe("Expired");
91-
});
92-
93-
it("formats seconds remaining",()=>{
94-
expect(formatRelativeTimeUntilLabel("2026-04-07T12:00:45.000Z")).toBe("45s left");
95-
});
96-
97-
it("formats minutes remaining",()=>{
98-
expect(formatRelativeTimeUntilLabel("2026-04-07T12:15:00.000Z")).toBe("15m left");
99-
});
100-
101-
it("formats hours remaining",()=>{
102-
expect(formatRelativeTimeUntilLabel("2026-04-07T18:00:00.000Z")).toBe("6h left");
103-
});
104-
});
105-
10676
describe("formatExpiresInLabel",()=>{
10777
beforeEach(()=>{
10878
vi.useFakeTimers();
@@ -196,10 +166,6 @@ describe("formatDayAwareTimestamp", () => {
196166
});
197167

198168
describe("invalid timestamp inputs",()=>{
199-
it("returns an empty timestamp instead of throwing",()=>{
200-
expect(formatTimestamp("not-a-date","12-hour")).toBe("");
201-
});
202-
203169
it("returns an empty short timestamp instead of throwing",()=>{
204170
expect(formatShortTimestamp("not-a-date","12-hour")).toBe("");
205171
});
@@ -218,11 +184,6 @@ describe("invalid timestamp inputs", () => {
218184
expect(formatElapsedDurationLabel("not-a-date")).toBe("");
219185
});
220186

221-
it("returns an empty relative time until label instead of a NaN label",()=>{
222-
expect(formatRelativeTimeUntil("not-a-date")).toBeNull();
223-
expect(formatRelativeTimeUntilLabel("not-a-date")).toBe("");
224-
});
225-
226187
it("returns an empty expires-in label instead of a NaN label",()=>{
227188
expect(formatExpiresInLabel("not-a-date")).toBe("");
228189
});

0 commit comments

Comments
 (0)