Files
fusion/packages/desktop/src/__tests__/main-local-mode.test.ts
Fusion 695cb0bca5 feat(FN-3405): persist and restore desktop launch mode via IPC bridge
Merges five features: **Launch mode persistence** (FN-3405) — desktop now remembers and restores the user's preferred window mode across restarts via an IPC bridge; **Mailbox detail pane** (FN-3719/3720) — clicking messages in the Mail tab and Mailbox opens the detail pane and reply panel; **Remote

Fusion-Task-Id: FN-3405
2026-05-07 23:21:05 -07:00

78 lines
2.7 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from "vitest";
const mocks = vi.hoisted(() => {
const appHandlers = new Map<string, (...args: unknown[]) => void>();
const app = {
whenReady: vi.fn(async () => undefined),
on: vi.fn((event: string, handler: (...args: unknown[]) => void) => {
appHandlers.set(event, handler);
return app;
}),
quit: vi.fn(),
};
const browserWindow = {
on: vi.fn(),
loadURL: vi.fn(),
loadFile: vi.fn(),
isDestroyed: vi.fn(() => false),
getBounds: vi.fn(() => ({ x: 0, y: 0, width: 800, height: 600 })),
isMaximized: vi.fn(() => false),
hide: vi.fn(),
maximize: vi.fn(),
webContents: { send: vi.fn() },
};
const BrowserWindow = vi.fn(() => browserWindow);
const Tray = vi.fn(() => ({ destroy: vi.fn() }));
const localRuntimeManager = {
startLocal: vi.fn(async () => ({ source: "embedded-local", state: "running", port: 4041 })),
stopLocal: vi.fn(async () => ({ source: "none", state: "stopped" })),
getStatus: vi.fn(() => ({ source: "none", state: "stopped" })),
getServerPort: vi.fn(() => undefined),
};
return { app, appHandlers, BrowserWindow, Tray, browserWindow, localRuntimeManager };
});
vi.mock("electron", () => ({
app: mocks.app,
BrowserWindow: mocks.BrowserWindow,
Tray: mocks.Tray,
nativeImage: { createEmpty: vi.fn(() => ({})) },
}));
vi.mock("../renderer.js", () => ({ isUrlRenderer: vi.fn(() => true), getRendererUrl: vi.fn(() => "http://localhost"), getRendererFilePath: vi.fn(() => "index.html") }));
vi.mock("../menu.js", () => ({ buildAppMenu: vi.fn() }));
vi.mock("../tray.js", () => ({ setupTray: vi.fn() }));
vi.mock("../ipc.js", () => ({ registerIpcHandlers: vi.fn() }));
vi.mock("../native.js", () => ({
DEFAULT_WINDOW_STATE: { width: 1000, height: 800 },
loadWindowState: vi.fn(async () => null),
loadDesktopLaunchMode: vi.fn(async () => "choose"),
saveDesktopLaunchMode: vi.fn(async () => undefined),
saveWindowState: vi.fn(),
setupAutoUpdater: vi.fn(),
}));
vi.mock("../deep-link.js", () => ({ registerDeepLinkProtocol: vi.fn(), setupDeepLinkHandler: vi.fn() }));
vi.mock("../local-runtime.js", () => ({ LocalRuntimeManager: vi.fn(() => mocks.localRuntimeManager) }));
describe("main local mode", () => {
beforeEach(() => {
vi.resetModules();
vi.clearAllMocks();
mocks.appHandlers.clear();
delete process.env.FUSION_DESKTOP_MODE;
});
it("starts local runtime manager when FUSION_DESKTOP_MODE is local", async () => {
process.env.FUSION_DESKTOP_MODE = "local";
const { initializeApp } = await import("../main.ts");
await initializeApp();
expect(mocks.localRuntimeManager.startLocal).toHaveBeenCalled();
delete process.env.FUSION_DESKTOP_MODE;
});
});