From 9e0aa618379c86724d5231c46293b278ea21c46a Mon Sep 17 00:00:00 2001 From: Molecule AI Frontend Engineer Date: Fri, 17 Apr 2026 21:37:50 +0000 Subject: [PATCH] fix(canvas): add missing budgetLimit/budget_limit to test fixtures, fix AuthGate mock types The budget PR (#541) added budgetLimit: number | null as a required field on WorkspaceNodeData and budget_limit: number | null on WorkspaceData. Seven test fixture factories were not updated, causing tsc --noEmit to produce 34 TS2322/TS2345 errors (runtime tests still passed because Vitest transpiles via esbuild which strips types). Fixes: - canvas-events.test.ts: makeNode factory +budgetLimit: null - canvas-events-pan.test.ts: makeNode factory +budgetLimit: null - canvas-capabilities.test.ts: makeNodeData factory +budgetLimit: null - canvas-topology.test.ts: makeWS factory +budget_limit: null - canvas.test.ts: makeWS factory +budget_limit: null; two inline summarizeWorkspaceCapabilities args +budgetLimit: null; context-menu fixture +budgetLimit: null - ProvisioningTimeout.test.tsx: makeWS factory +budget_limit: null Also fixes 3 TS2348 errors in AuthGate.test.tsx: newer Vitest type defs resolve ReturnType to Mock which TypeScript no longer considers directly callable in a vi.mock factory. Fix: intersect the mock variables with a plain function type so both the call expression and the mock API (mockReturnValue etc.) type-check. tsc --noEmit: 0 errors. npm test: 722/722. Co-Authored-By: Claude Sonnet 4.6 --- .../src/components/__tests__/AuthGate.test.tsx | 16 ++++++++++------ .../__tests__/ProvisioningTimeout.test.tsx | 1 + .../store/__tests__/canvas-capabilities.test.ts | 1 + .../store/__tests__/canvas-events-pan.test.ts | 1 + canvas/src/store/__tests__/canvas-events.test.ts | 1 + .../src/store/__tests__/canvas-topology.test.ts | 1 + canvas/src/store/__tests__/canvas.test.ts | 4 ++++ 7 files changed, 19 insertions(+), 6 deletions(-) diff --git a/canvas/src/components/__tests__/AuthGate.test.tsx b/canvas/src/components/__tests__/AuthGate.test.tsx index 7f581769..065dc8b3 100644 --- a/canvas/src/components/__tests__/AuthGate.test.tsx +++ b/canvas/src/components/__tests__/AuthGate.test.tsx @@ -8,14 +8,18 @@ afterEach(() => { }); // ── Mocks (defined before dynamic import of component) ─────────────────────── -let mockFetchSession: ReturnType; -let mockRedirectToLogin: ReturnType; -let mockGetTenantSlug: ReturnType; +// Use a function type so TypeScript accepts the mock as callable in vi.mock factories. +// ReturnType resolves to Mock in newer Vitest +// type defs, which TS no longer considers directly callable. Casting to a plain +// function type avoids the TS2348 error while keeping full mock API (mockReturnValue etc.). +let mockFetchSession: ((...args: unknown[]) => unknown) & ReturnType; +let mockRedirectToLogin: ((...args: unknown[]) => unknown) & ReturnType; +let mockGetTenantSlug: ((...args: unknown[]) => unknown) & ReturnType; beforeEach(() => { - mockFetchSession = vi.fn(); - mockRedirectToLogin = vi.fn(); - mockGetTenantSlug = vi.fn(() => null); // default: non-SaaS (pass-through) + mockFetchSession = vi.fn() as typeof mockFetchSession; + mockRedirectToLogin = vi.fn() as typeof mockRedirectToLogin; + mockGetTenantSlug = vi.fn(() => null) as typeof mockGetTenantSlug; }); vi.mock("@/lib/auth", () => ({ diff --git a/canvas/src/components/__tests__/ProvisioningTimeout.test.tsx b/canvas/src/components/__tests__/ProvisioningTimeout.test.tsx index 432954aa..f1c5b150 100644 --- a/canvas/src/components/__tests__/ProvisioningTimeout.test.tsx +++ b/canvas/src/components/__tests__/ProvisioningTimeout.test.tsx @@ -28,6 +28,7 @@ function makeWS(overrides: Partial & { id: string }): WorkspaceDa y: 0, collapsed: false, runtime: "", + budget_limit: null, ...overrides, }; } diff --git a/canvas/src/store/__tests__/canvas-capabilities.test.ts b/canvas/src/store/__tests__/canvas-capabilities.test.ts index 5b128fa3..001d6e75 100644 --- a/canvas/src/store/__tests__/canvas-capabilities.test.ts +++ b/canvas/src/store/__tests__/canvas-capabilities.test.ts @@ -22,6 +22,7 @@ function makeNodeData(overrides: Partial = {}): WorkspaceNode currentTask: "", needsRestart: false, runtime: "", + budgetLimit: null, ...overrides, }; } diff --git a/canvas/src/store/__tests__/canvas-events-pan.test.ts b/canvas/src/store/__tests__/canvas-events-pan.test.ts index cca7c945..77c687fc 100644 --- a/canvas/src/store/__tests__/canvas-events-pan.test.ts +++ b/canvas/src/store/__tests__/canvas-events-pan.test.ts @@ -34,6 +34,7 @@ function makeNode( currentTask: "", needsRestart: false, runtime: "", + budgetLimit: null, ...overrides, }, }; diff --git a/canvas/src/store/__tests__/canvas-events.test.ts b/canvas/src/store/__tests__/canvas-events.test.ts index e945fd56..54be70e6 100644 --- a/canvas/src/store/__tests__/canvas-events.test.ts +++ b/canvas/src/store/__tests__/canvas-events.test.ts @@ -31,6 +31,7 @@ function makeNode( currentTask: "", needsRestart: false, runtime: "", + budgetLimit: null, ...overrides, }, }; diff --git a/canvas/src/store/__tests__/canvas-topology.test.ts b/canvas/src/store/__tests__/canvas-topology.test.ts index 8a2877d2..7ca1d950 100644 --- a/canvas/src/store/__tests__/canvas-topology.test.ts +++ b/canvas/src/store/__tests__/canvas-topology.test.ts @@ -24,6 +24,7 @@ function makeWS(overrides: Partial & { id: string }): WorkspaceDa y: 0, collapsed: false, runtime: "", + budget_limit: null, ...overrides, }; } diff --git a/canvas/src/store/__tests__/canvas.test.ts b/canvas/src/store/__tests__/canvas.test.ts index 6a5c2ce6..8e0675f1 100644 --- a/canvas/src/store/__tests__/canvas.test.ts +++ b/canvas/src/store/__tests__/canvas.test.ts @@ -27,6 +27,7 @@ function makeWS(overrides: Partial & { id: string }): WorkspaceDa y: 0, collapsed: false, runtime: "", + budget_limit: null, ...overrides, }; } @@ -172,6 +173,7 @@ describe("summarizeWorkspaceCapabilities", () => { currentTask: "Reviewing docs", needsRestart: false, runtime: "claude-code", + budgetLimit: null, }); expect(summary.runtime).toBe("claude-code"); @@ -197,6 +199,7 @@ describe("summarizeWorkspaceCapabilities", () => { currentTask: " ", needsRestart: false, runtime: "", + budgetLimit: null, }); expect(summary.runtime).toBeNull(); @@ -554,6 +557,7 @@ describe("context menu", () => { currentTask: "", needsRestart: false, runtime: "", + budgetLimit: null, }, };