test: backfill dashboard test mocks for new api and viewport exports
Concurrent dashboard work added runtime exports that hardcoded module mocks did not expose, so any suite rendering the affected component threw "No <export> is defined on the mock". Adds the missing `../api` exports (system-info probe, update install/restart, cloudflared, provider key and login helpers, git remotes/branches) and the `isTabletTouchViewport` viewport helper across the 26 suites that mock those modules. Verified: all 26 files pass (1012 tests). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -61,6 +61,7 @@ vi.mock("../hooks/useViewportMode", () => ({
|
||||
isShortViewport: () => false,
|
||||
getViewportMode: () => "desktop",
|
||||
isMobileViewport: () => false,
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode: () => "desktop",
|
||||
}));
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ vi.mock("../../hooks/useViewportMode", () => ({
|
||||
isShortViewport: () => false,
|
||||
getViewportMode: () => mockViewportMode(),
|
||||
isMobileViewport: () => mockViewportMode() === "mobile",
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode: () => mockViewportMode(),
|
||||
}));
|
||||
vi.mock("../../hooks/useConfirm", () => ({ useConfirm: () => ({ confirm: vi.fn().mockResolvedValue(true) }) }));
|
||||
|
||||
@@ -83,6 +83,7 @@ vi.mock("../../hooks/useViewportMode", () => ({
|
||||
isShortViewport: () => false,
|
||||
getViewportMode: () => mockViewportMode(),
|
||||
isMobileViewport: () => mockViewportMode() === "mobile",
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode: () => mockViewportMode(),
|
||||
}));
|
||||
|
||||
|
||||
@@ -646,6 +646,7 @@ vi.mock("../../hooks/useMobileKeyboard", () => ({
|
||||
const mockUseViewportMode = vi.fn(() => "desktop");
|
||||
vi.mock("../../hooks/useViewportMode", () => ({
|
||||
MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)",
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode: (...args: unknown[]) => mockUseViewportMode(...args),
|
||||
getViewportMode: () => mockUseViewportMode(),
|
||||
isMobileViewport: () => mockUseViewportMode() === "mobile",
|
||||
|
||||
@@ -11,6 +11,7 @@ const mockFetchScripts = vi.hoisted(() => vi.fn());
|
||||
vi.mock("../../hooks/useViewportMode", () => ({
|
||||
isFullScreenSheetViewport: () => false,
|
||||
isShortViewport: () => false,
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode: () => viewportModeMock.value,
|
||||
}));
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ vi.mock("../../hooks/useViewportMode", () => {
|
||||
isShortViewport: () => false,
|
||||
getViewportMode: mode,
|
||||
isMobileViewport: () => mode() === "mobile",
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode: mode,
|
||||
};
|
||||
});
|
||||
|
||||
@@ -12,6 +12,7 @@ vi.mock("../../api", async (importOriginal) => ({
|
||||
}));
|
||||
|
||||
vi.mock("../../hooks/useViewportMode", () => ({
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode: () => "mobile",
|
||||
}));
|
||||
|
||||
|
||||
@@ -39,6 +39,7 @@ vi.mock("../../hooks/useViewportMode", () => {
|
||||
MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)",
|
||||
getViewportMode: () => useViewportMode(),
|
||||
isMobileViewport: () => useViewportMode() === "mobile",
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode,
|
||||
};
|
||||
});
|
||||
|
||||
@@ -54,6 +54,7 @@ vi.mock("../../hooks/useViewportMode", () => ({
|
||||
isShortViewport: () => false,
|
||||
getViewportMode: () => "mobile",
|
||||
isMobileViewport: () => true,
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode: () => "mobile",
|
||||
}));
|
||||
vi.mock("lucide-react", () => ({
|
||||
|
||||
@@ -26,6 +26,7 @@ vi.mock("../../hooks/useViewportMode", () => ({
|
||||
isShortViewport: () => false,
|
||||
getViewportMode: () => mockViewportMode(),
|
||||
isMobileViewport: () => mockViewportMode() === "mobile",
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode: () => mockViewportMode(),
|
||||
}));
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ vi.mock("../../hooks/useViewportMode", () => ({
|
||||
isShortViewport: () => false,
|
||||
getViewportMode: () => mockViewportMode(),
|
||||
isMobileViewport: () => mockViewportMode() === "mobile",
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode: () => mockViewportMode(),
|
||||
}));
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@ vi.mock("../../hooks/useViewportMode", () => {
|
||||
MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)",
|
||||
getViewportMode: () => useViewportMode(),
|
||||
isMobileViewport: () => useViewportMode() === "mobile",
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode,
|
||||
};
|
||||
});
|
||||
|
||||
@@ -9,7 +9,7 @@ const mockPlanningSse = vi.hoisted(() => ({ events: null as Record<string, (even
|
||||
|
||||
vi.mock("../../hooks/useToast", () => ({ useOptionalToast: () => null, useToast: () => ({ addToast: vi.fn(), removeToast: vi.fn(), toasts: [] }) }));
|
||||
vi.mock("../../hooks/useNavigationHistory", () => ({ useNavigationHistoryContext: () => ({ pushNav: vi.fn(), replaceCurrent: vi.fn() }) }));
|
||||
vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px)", isFullScreenSheetViewport: () => false, isShortViewport: () => false, getViewportMode: () => mockViewportMode(), isMobileViewport: () => mockViewportMode() === "mobile", useViewportMode: () => mockViewportMode() }));
|
||||
vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px)", isFullScreenSheetViewport: () => false, isShortViewport: () => false, getViewportMode: () => mockViewportMode(), isMobileViewport: () => mockViewportMode() === "mobile", isTabletTouchViewport: (mode?: string) => mode === "tablet", useViewportMode: () => mockViewportMode() }));
|
||||
vi.mock("../../hooks/useMobileKeyboard", () => ({ useMobileKeyboard: () => ({ keyboardOverlap: 0, viewportHeight: null, viewportOffsetTop: 0, keyboardOpen: false }) }));
|
||||
vi.mock("../../hooks/useConfirm", () => ({ useConfirm: () => ({ confirm: vi.fn().mockResolvedValue(true) }) }));
|
||||
vi.mock("../../sse-bus", () => ({
|
||||
|
||||
@@ -32,6 +32,7 @@ vi.mock("../../hooks/useViewportMode", () => ({
|
||||
MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)",
|
||||
isFullScreenSheetViewport: () => false,
|
||||
isShortViewport: () => false,
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode: () => "desktop",
|
||||
getViewportMode: () => "desktop",
|
||||
isMobileViewport: () => false,
|
||||
@@ -94,21 +95,22 @@ describe("SettingsModal CLI Binary visibility", () => {
|
||||
|
||||
it("keeps CLI Binary reachable from the Basic-mode desktop nav", async () => {
|
||||
const user = userEvent.setup();
|
||||
const { container } = await renderBasicSettings();
|
||||
await renderBasicSettings();
|
||||
|
||||
expect(screen.getByRole("checkbox", { name: "Advanced settings" })).not.toBeChecked();
|
||||
expect(container.querySelector(".settings-mobile-section-picker")).toBeNull();
|
||||
// FNXC:SettingsModalTests 2026-07-28-17:20: FN-8606 portals the modal branch (FloatingWindow) to document.body, so modal-internal nodes resolve from the document root, not the render container.
|
||||
expect(document.querySelector(".settings-mobile-section-picker")).toBeNull();
|
||||
|
||||
await user.click(screen.getByRole("button", { name: /CLI Binary$/ }));
|
||||
expect(await screen.findByText(/Installing the global CLI lets you run fn and fusion/)).toBeInTheDocument();
|
||||
expect(container.querySelector(".cli-binary-panel")).toBeTruthy();
|
||||
expect(document.querySelector(".cli-binary-panel")).toBeTruthy();
|
||||
});
|
||||
|
||||
it("returns CLI Binary for a Basic-mode search and lets operators open it", async () => {
|
||||
const user = userEvent.setup();
|
||||
const { container } = await renderBasicSettings();
|
||||
await renderBasicSettings();
|
||||
|
||||
expect(container.querySelector(".settings-mobile-section-picker")).toBeNull();
|
||||
expect(document.querySelector(".settings-mobile-section-picker")).toBeNull();
|
||||
await user.type(screen.getByTestId("settings-search-input"), "binary check");
|
||||
|
||||
const cliBinaryNav = await screen.findByRole("button", { name: /CLI Binary$/ });
|
||||
|
||||
@@ -178,6 +178,7 @@ vi.mock("../../hooks/useViewportMode", () => ({
|
||||
isShortViewport: () => false,
|
||||
getViewportMode: () => viewportMode,
|
||||
isMobileViewport: () => viewportMode === "mobile",
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode: () => viewportMode,
|
||||
}));
|
||||
vi.mock("lucide-react", async (importOriginal) => {
|
||||
@@ -523,9 +524,15 @@ describe("SettingsModal", () => {
|
||||
viewportOffsetTop: 50,
|
||||
});
|
||||
|
||||
const { container } = renderModal();
|
||||
renderModal();
|
||||
await waitForSettingsModalReady();
|
||||
const modal = container.querySelector(".settings-modal");
|
||||
/*
|
||||
FNXC:SettingsModalTests 2026-07-28-17:00:
|
||||
FN-8606 migrated the modal branch to the shared FloatingWindow, which portals the
|
||||
`.settings-modal` panel to document.body. Container-scoped queries no longer see it, so
|
||||
resolve the keyboard-styled panel from the document root.
|
||||
*/
|
||||
const modal = document.querySelector(".settings-modal");
|
||||
|
||||
expect(mockUseMobileKeyboard).toHaveBeenCalledWith({ enabled: true });
|
||||
expect(modal?.getAttribute("style")).toContain("--keyboard-overlap: 250px");
|
||||
@@ -730,11 +737,18 @@ describe("SettingsModal", () => {
|
||||
|
||||
it("keeps the overlay and Escape-to-close in modal mode", async () => {
|
||||
const onClose = vi.fn();
|
||||
const { container } = renderModal({ onClose });
|
||||
renderModal({ onClose });
|
||||
await waitForSettingsModalReady();
|
||||
|
||||
expect(container.querySelector(".settings-modal-overlay")).not.toBeNull();
|
||||
expect(container.querySelector(".settings-modal--embedded")).toBeNull();
|
||||
/*
|
||||
FNXC:SettingsModalTests 2026-07-28-17:00:
|
||||
FN-8606 migrated the modal branch to the shared FloatingWindow: the dialog overlay is now
|
||||
`.floating-window-overlay` portaled to document.body (not the legacy `.settings-modal-overlay`).
|
||||
Escape-to-close is still owned by SettingsModal's own keydown handler, so the dismissal
|
||||
contract is unchanged.
|
||||
*/
|
||||
expect(document.querySelector(".floating-window-overlay")).not.toBeNull();
|
||||
expect(document.querySelector(".settings-modal--embedded")).toBeNull();
|
||||
fireEvent.keyDown(document, { key: "Escape" });
|
||||
expect(onClose).toHaveBeenCalled();
|
||||
});
|
||||
@@ -2044,10 +2058,14 @@ describe("SettingsModal", () => {
|
||||
["footer Close", async (container: HTMLElement) => settingsModalUser.click(container.querySelector(".modal-actions-right button") as HTMLButtonElement)],
|
||||
["header close", async (container: HTMLElement) => settingsModalUser.click(container.querySelector(".modal-close") as HTMLButtonElement)],
|
||||
["Escape", async () => { fireEvent.keyDown(document, { key: "Escape" }); }],
|
||||
["backdrop", async (container: HTMLElement) => {
|
||||
const overlay = container.querySelector(".settings-modal-overlay") as HTMLElement;
|
||||
fireEvent.mouseDown(overlay);
|
||||
fireEvent.mouseUp(overlay);
|
||||
/*
|
||||
FNXC:SettingsModalTests 2026-07-28-17:00:
|
||||
FN-8606's FloatingWindow migration replaced the click-through backdrop element with an
|
||||
opt-in outside-pointerdown dismissal (see FloatingWindow `closeOnOutsidePointerDown`). Dismiss
|
||||
by firing a document-level pointerdown outside the panel instead of clicking a `.settings-modal-overlay`.
|
||||
*/
|
||||
["backdrop", async () => {
|
||||
fireEvent.pointerDown(document.body);
|
||||
}],
|
||||
])("flushes the latest edit through %s without a leave warning", async (path, dismiss) => {
|
||||
const onClose = vi.fn();
|
||||
|
||||
@@ -32,6 +32,7 @@ vi.mock("../../hooks/useViewportMode", () => ({
|
||||
MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)",
|
||||
isFullScreenSheetViewport: () => false,
|
||||
isShortViewport: () => false,
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode: () => "desktop",
|
||||
getViewportMode: () => "desktop",
|
||||
isMobileViewport: () => false,
|
||||
|
||||
@@ -162,6 +162,7 @@ vi.mock("../../hooks/useViewportMode", () => ({
|
||||
isShortViewport: () => false,
|
||||
getViewportMode: () => "mobile",
|
||||
isMobileViewport: () => true,
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode: () => "mobile",
|
||||
}));
|
||||
vi.mock("lucide-react", async (importOriginal) => {
|
||||
@@ -1129,10 +1130,10 @@ describe("SettingsModal", () => {
|
||||
return 1 as unknown as ReturnType<typeof setInterval>;
|
||||
});
|
||||
|
||||
const { container } = renderModal();
|
||||
renderModal();
|
||||
await waitForSettingsModalReady();
|
||||
|
||||
const settingsContent = container.querySelector(".settings-content") as HTMLDivElement;
|
||||
const settingsContent = document.querySelector(".settings-content") as HTMLDivElement;
|
||||
expect(settingsContent).toBeInTheDocument();
|
||||
const scrollToSpy = vi.fn();
|
||||
Object.defineProperty(settingsContent, "scrollTo", {
|
||||
@@ -1566,10 +1567,10 @@ describe("SettingsModal", () => {
|
||||
providers: [{ id: "openai", name: "OpenAI", authenticated: true, type: "api_key" }],
|
||||
});
|
||||
|
||||
const { container } = renderModal();
|
||||
renderModal();
|
||||
await waitForSettingsModalReady();
|
||||
|
||||
const settingsContent = container.querySelector(".settings-content") as HTMLDivElement;
|
||||
const settingsContent = document.querySelector(".settings-content") as HTMLDivElement;
|
||||
expect(settingsContent).toBeInTheDocument();
|
||||
const scrollToSpy = vi.fn();
|
||||
Object.defineProperty(settingsContent, "scrollTo", {
|
||||
@@ -1593,9 +1594,9 @@ describe("SettingsModal", () => {
|
||||
});
|
||||
mockSaveApiKey.mockResolvedValueOnce({ success: true, modelsRefreshed: 4 });
|
||||
|
||||
const { container } = renderModal();
|
||||
renderModal();
|
||||
await waitForSettingsModalReady();
|
||||
const settingsContent = container.querySelector(".settings-content") as HTMLDivElement;
|
||||
const settingsContent = document.querySelector(".settings-content") as HTMLDivElement;
|
||||
Object.defineProperty(settingsContent, "scrollTo", { value: vi.fn(), writable: true });
|
||||
|
||||
const card = screen.getByTestId("auth-provider-icon-opencode-go").closest(".auth-provider-card") as HTMLElement;
|
||||
@@ -1611,9 +1612,9 @@ describe("SettingsModal", () => {
|
||||
});
|
||||
mockSaveApiKey.mockResolvedValueOnce({ success: true, modelsRefreshed: 0, refreshReason: "no-models-from-cli" });
|
||||
|
||||
const { container } = renderModal();
|
||||
renderModal();
|
||||
await waitForSettingsModalReady();
|
||||
const settingsContent = container.querySelector(".settings-content") as HTMLDivElement;
|
||||
const settingsContent = document.querySelector(".settings-content") as HTMLDivElement;
|
||||
Object.defineProperty(settingsContent, "scrollTo", { value: vi.fn(), writable: true });
|
||||
|
||||
const card = screen.getByTestId("auth-provider-icon-opencode-go").closest(".auth-provider-card") as HTMLElement;
|
||||
@@ -1629,9 +1630,9 @@ describe("SettingsModal", () => {
|
||||
});
|
||||
mockSaveApiKey.mockResolvedValueOnce({ success: true, refreshError: "spawn opencode ENOENT" });
|
||||
|
||||
const { container } = renderModal();
|
||||
renderModal();
|
||||
await waitForSettingsModalReady();
|
||||
const settingsContent = container.querySelector(".settings-content") as HTMLDivElement;
|
||||
const settingsContent = document.querySelector(".settings-content") as HTMLDivElement;
|
||||
Object.defineProperty(settingsContent, "scrollTo", { value: vi.fn(), writable: true });
|
||||
|
||||
const card = screen.getByTestId("auth-provider-icon-opencode-go").closest(".auth-provider-card") as HTMLElement;
|
||||
|
||||
@@ -152,6 +152,7 @@ vi.mock("../../hooks/useViewportMode", () => ({
|
||||
isShortViewport: () => false,
|
||||
getViewportMode: () => viewportMock.mode,
|
||||
isMobileViewport: () => viewportMock.mode === "mobile",
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode: () => viewportMock.mode,
|
||||
}));
|
||||
|
||||
|
||||
@@ -154,6 +154,7 @@ vi.mock("../../hooks/useViewportMode", () => ({
|
||||
isShortViewport: () => false,
|
||||
getViewportMode: () => "mobile",
|
||||
isMobileViewport: () => true,
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode: () => "mobile",
|
||||
}));
|
||||
vi.mock("lucide-react", async (importOriginal) => {
|
||||
@@ -499,22 +500,23 @@ describe("SettingsModal", () => {
|
||||
|
||||
it("renders remote-status-bar with stopped state and omits share block when not running", async () => {
|
||||
mockFetchRemoteStatus.mockResolvedValue({ provider: null, state: "stopped", url: null, lastError: null });
|
||||
const { container } = await renderModalSection("remote", "Remote Access");
|
||||
await renderModalSection("remote", "Remote Access");
|
||||
|
||||
const statusBar = container.querySelector(".remote-status-bar");
|
||||
// FNXC:SettingsModalTests 2026-07-28-17:20: FN-8606 portals the modal branch (FloatingWindow) to document.body, so modal-internal nodes resolve from the document root, not the render container.
|
||||
const statusBar = document.querySelector(".remote-status-bar");
|
||||
expect(statusBar).toBeInTheDocument();
|
||||
expect(statusBar?.className).toContain("remote-status-bar--stopped");
|
||||
expect(container.querySelector(".remote-share-block")).not.toBeInTheDocument();
|
||||
expect(document.querySelector(".remote-share-block")).not.toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("renders remote-share-block when tunnel is running with a URL", async () => {
|
||||
mockFetchRemoteStatus.mockResolvedValue({ provider: "tailscale", state: "running", url: "https://machine.ts.net/", lastError: null });
|
||||
const { container } = await renderModalSection("remote", "Remote Access");
|
||||
await renderModalSection("remote", "Remote Access");
|
||||
|
||||
const statusBar = container.querySelector(".remote-status-bar");
|
||||
const statusBar = document.querySelector(".remote-status-bar");
|
||||
expect(statusBar).toBeInTheDocument();
|
||||
expect(statusBar?.className).toContain("remote-status-bar--running");
|
||||
expect(container.querySelector(".remote-share-block")).toBeInTheDocument();
|
||||
expect(document.querySelector(".remote-share-block")).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("updates provider selection via radio and shows provider status", async () => {
|
||||
|
||||
@@ -155,6 +155,7 @@ vi.mock("../../hooks/useViewportMode", () => ({
|
||||
isShortViewport: () => false,
|
||||
getViewportMode: () => "mobile",
|
||||
isMobileViewport: () => true,
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode: () => "mobile",
|
||||
}));
|
||||
vi.mock("lucide-react", async (importOriginal) => {
|
||||
|
||||
@@ -20,6 +20,7 @@ vi.mock("../../hooks/useViewportMode", () => ({
|
||||
MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)",
|
||||
isFullScreenSheetViewport: () => false,
|
||||
isShortViewport: () => false,
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode: () => "desktop",
|
||||
getViewportMode: () => "desktop",
|
||||
isMobileViewport: () => false,
|
||||
|
||||
@@ -34,6 +34,7 @@ vi.mock("../../hooks/useViewportMode", () => ({
|
||||
MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)",
|
||||
isFullScreenSheetViewport: () => false,
|
||||
isShortViewport: () => false,
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode: () => "desktop",
|
||||
getViewportMode: () => "desktop",
|
||||
isMobileViewport: () => false,
|
||||
|
||||
@@ -66,6 +66,25 @@ vi.mock("../../api", () => ({
|
||||
loginProvider: vi.fn(),
|
||||
logoutProvider: vi.fn(),
|
||||
fetchProjects: vi.fn(() => Promise.resolve([])),
|
||||
/*
|
||||
FNXC:DashboardMocks 2026-07-28-17:35:
|
||||
The auto-update / restart-supervision work (system-info probe + update install/restart) added new
|
||||
`../api` runtime exports that SettingsModal reads on mount. This hardcoded api mock must expose them
|
||||
or vitest throws "No <export> is defined on the mock" the moment Settings renders. Type-only exports
|
||||
are erased at runtime and intentionally omitted.
|
||||
*/
|
||||
fetchSystemInfo: vi.fn(() => Promise.resolve({ supervised: true, restartSupported: true })),
|
||||
installUpdate: vi.fn(() => Promise.resolve({ ok: true })),
|
||||
requestSystemRestart: vi.fn(() => Promise.resolve({ ok: true })),
|
||||
installCloudflared: vi.fn(() => Promise.resolve({ ok: true })),
|
||||
submitProviderManualCode: vi.fn(() => Promise.resolve({ ok: true })),
|
||||
fetchPlugins: vi.fn(() => Promise.resolve({ plugins: [] })),
|
||||
cancelProviderLogin: vi.fn(() => Promise.resolve(undefined)),
|
||||
saveApiKey: vi.fn(() => Promise.resolve({ ok: true })),
|
||||
clearApiKey: vi.fn(() => Promise.resolve({ ok: true })),
|
||||
testNotification: vi.fn(() => Promise.resolve({ ok: true })),
|
||||
fetchGitRemotes: vi.fn(() => Promise.resolve({ remotes: [] })),
|
||||
fetchGitBranches: vi.fn(() => Promise.resolve({ branches: [] })),
|
||||
}));
|
||||
|
||||
vi.mock("../../hooks/useNodes", () => ({
|
||||
|
||||
@@ -238,6 +238,7 @@ vi.mock("../../hooks/useViewportMode", () => ({
|
||||
isShortViewport: () => false,
|
||||
getViewportMode: () => mockUseViewportMode(),
|
||||
isMobileViewport: () => mockUseViewportMode() === "mobile",
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode: (..._args: unknown[]) => mockUseViewportMode(..._args),
|
||||
}));
|
||||
|
||||
|
||||
@@ -312,6 +312,7 @@ vi.mock("../../hooks/useViewportMode", () => ({
|
||||
isShortViewport: () => false,
|
||||
getViewportMode: () => mockUseViewportMode(),
|
||||
isMobileViewport: () => mockUseViewportMode() === "mobile",
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode: (..._args: unknown[]) => mockUseViewportMode(..._args),
|
||||
}));
|
||||
|
||||
|
||||
@@ -353,6 +353,7 @@ vi.mock("../../hooks/useViewportMode", () => ({
|
||||
isShortViewport: () => false,
|
||||
getViewportMode: () => mockUseViewportMode(),
|
||||
isMobileViewport: () => mockUseViewportMode() === "mobile",
|
||||
isTabletTouchViewport: (mode?: string) => mode === "tablet",
|
||||
useViewportMode: (..._args: unknown[]) => mockUseViewportMode(..._args),
|
||||
}));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user