Merge remote-tracking branch 'origin/staging' into promote/main-to-staging-2026-04-23

# Conflicts:
#	canvas/src/components/__tests__/ContextMenu.keyboard.test.tsx
This commit is contained in:
Hongming Wang 2026-04-23 09:50:16 -07:00
commit dc476153c1

View File

@ -48,12 +48,20 @@ const mockStore = {
nodes: [] as Array<{ id: string; data: { parentId: string | null } }>,
};
vi.mock("@/store/canvas", () => ({
useCanvasStore: Object.assign(
(selector: (s: typeof mockStore) => unknown) => selector(mockStore),
{ getState: () => mockStore }
),
}));
// useCanvasStore.getState() is called directly by ContextMenu to read `nodes`
// for parent-filtering (see ContextMenu.tsx childNodes computation). The mock
// must expose both the selector-calling function form AND the .getState()
// form so production code using either pattern doesn't hit "not a function".
// Factory body runs under vi.mock's hoist — cannot reference outer scope,
// so we build the mock function inside and reach `mockStore` via `globalThis`.
vi.mock("@/store/canvas", () => {
const fn = vi.fn((selector: (s: typeof mockStore) => unknown) =>
selector(mockStore),
);
return {
useCanvasStore: Object.assign(fn, { getState: () => mockStore }),
};
});
// ── Component under test — imported AFTER mocks ───────────────────────────────
import { ContextMenu } from "../ContextMenu";