Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/main/config.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ vi.mock('./utils', () => ({
vi.mock('electron', () => ({
app: {
isPackaged: true,
},
} satisfies Pick<Electron.App, 'isPackaged'>,
}));

describe('main/config.ts', () => {
Expand Down
2 changes: 1 addition & 1 deletion src/main/events.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ vi.mock('electron', () => ({
ipcMain: {
on: (...args: unknown[]) => onMock(...args),
handle: (...args: unknown[]) => handleMock(...args),
},
} satisfies Pick<Electron.IpcMain, 'on' | 'handle'>,
}));

import type { Menubar } from 'menubar';
Expand Down
4 changes: 2 additions & 2 deletions src/main/handlers/app.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ vi.mock('electron', () => ({
ipcMain: {
handle: (...args: unknown[]) => handleMock(...args),
on: (...args: unknown[]) => onMock(...args),
},
} satisfies Pick<Electron.IpcMain, 'handle' | 'on'>,
app: {
getVersion: vi.fn(() => '1.0.0'),
},
} satisfies Pick<Electron.App, 'getVersion'>,
}));

vi.mock('../config', () => ({
Expand Down
8 changes: 4 additions & 4 deletions src/main/handlers/system.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,17 @@ vi.mock('electron', () => ({
ipcMain: {
on: (...args: unknown[]) => onMock(...args),
handle: (...args: unknown[]) => handleMock(...args),
},
} satisfies Pick<Electron.IpcMain, 'on' | 'handle'>,
globalShortcut: {
register: vi.fn(),
unregister: vi.fn(),
},
} satisfies Pick<Electron.GlobalShortcut, 'register' | 'unregister'>,
app: {
setLoginItemSettings: vi.fn(),
},
} satisfies Pick<Electron.App, 'setLoginItemSettings'>,
shell: {
openExternal: vi.fn(),
},
} satisfies Pick<Electron.Shell, 'openExternal'>,
}));

describe('main/handlers/system.ts', () => {
Expand Down
4 changes: 2 additions & 2 deletions src/main/handlers/tray.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ const onMock = vi.fn();
vi.mock('electron', () => ({
ipcMain: {
on: (...args: unknown[]) => onMock(...args),
},
} satisfies Pick<Electron.IpcMain, 'on'>,
net: {
isOnline: vi.fn().mockReturnValue(true),
},
} satisfies Pick<Electron.Net, 'isOnline'>,
}));

describe('main/handlers/tray.ts', () => {
Expand Down
24 changes: 19 additions & 5 deletions src/main/lifecycle/first-run.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,23 @@ const moveToApplicationsFolderMock = vi.fn();
const isInApplicationsFolderMock = vi.fn(() => false);
const getPathMock = vi.fn(() => '/User/Data');

const showMessageBoxMock = vi.fn(async () => ({ response: 0 }));
const showMessageBoxMock = vi.fn(async () => ({
response: 0,
checkboxChecked: false,
}));

vi.mock('electron', () => ({
app: {
getPath: () => getPathMock(),
isInApplicationsFolder: () => isInApplicationsFolderMock(),
moveToApplicationsFolder: () => moveToApplicationsFolderMock(),
},
dialog: { showMessageBox: () => showMessageBoxMock() },
} satisfies Pick<
Electron.App,
'getPath' | 'isInApplicationsFolder' | 'moveToApplicationsFolder'
>,
dialog: {
showMessageBox: () => showMessageBoxMock(),
} satisfies Pick<Electron.Dialog, 'showMessageBox'>,
}));

// Ensure the module under test thinks we're not in dev mode
Expand Down Expand Up @@ -97,7 +105,10 @@ describe('main/lifecycle/first-run', () => {
it('prompts and moves app on macOS when user accepts', async () => {
existsSyncMock.mockReturnValueOnce(false); // marker
existsSyncMock.mockReturnValueOnce(false); // folder
showMessageBoxMock.mockResolvedValueOnce({ response: 0 });
showMessageBoxMock.mockResolvedValueOnce({
response: 0,
checkboxChecked: false,
});

await onFirstRunMaybe();

Expand All @@ -107,7 +118,10 @@ describe('main/lifecycle/first-run', () => {
it('does not move when user declines', async () => {
existsSyncMock.mockReturnValueOnce(false);
existsSyncMock.mockReturnValueOnce(false);
showMessageBoxMock.mockResolvedValueOnce({ response: 1 });
showMessageBoxMock.mockResolvedValueOnce({
response: 1,
checkboxChecked: false,
});

await onFirstRunMaybe();

Expand Down
4 changes: 3 additions & 1 deletion src/main/lifecycle/reset.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import type { Menubar } from 'menubar';

vi.mock('electron', () => ({
dialog: { showMessageBoxSync: vi.fn(() => 0) },
dialog: {
showMessageBoxSync: vi.fn(() => 0),
} satisfies Pick<Electron.Dialog, 'showMessageBoxSync'>,
}));

const sendRendererEventMock = vi.fn();
Expand Down
2 changes: 1 addition & 1 deletion src/main/lifecycle/startup.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ vi.mock('electron', () => ({
requestSingleInstanceLock: () => requestSingleInstanceLockMock(),
on: (...a: unknown[]) => appOnMock(...a),
quit: () => appQuitMock(),
},
} satisfies Pick<Electron.App, 'requestSingleInstanceLock' | 'on' | 'quit'>,
}));

const sendRendererEventMock = vi.fn();
Expand Down
6 changes: 4 additions & 2 deletions src/main/menu.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,11 @@ vi.mock('electron', () => {
return {
Menu: {
buildFromTemplate: vi.fn(),
},
} satisfies Pick<typeof Electron.Menu, 'buildFromTemplate'>,
MenuItem: MockMenuItem,
shell: { openExternal: vi.fn() },
shell: {
openExternal: vi.fn(),
} satisfies Pick<Electron.Shell, 'openExternal'>,
};
});

Expand Down
12 changes: 9 additions & 3 deletions src/main/updater.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,16 @@ vi.mock('electron', () => {
}
}
return {
dialog: { showMessageBox: vi.fn() },
dialog: {
showMessageBox: vi.fn(),
} satisfies Pick<Electron.Dialog, 'showMessageBox'>,
MenuItem,
Menu: { buildFromTemplate: vi.fn() },
shell: { openExternal: vi.fn() },
Menu: {
buildFromTemplate: vi.fn(),
} satisfies Pick<typeof Electron.Menu, 'buildFromTemplate'>,
shell: {
openExternal: vi.fn(),
} satisfies Pick<Electron.Shell, 'openExternal'>,
};
});

Expand Down
10 changes: 7 additions & 3 deletions src/main/utils.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,13 @@ vi.mock('node:os', () => ({
vi.mock('electron', () => ({
app: {
isPackaged: true,
},
shell: { openPath: vi.fn(() => Promise.resolve('')) },
dialog: { showMessageBoxSync: vi.fn(() => 0) },
} satisfies Pick<Electron.App, 'isPackaged'>,
shell: {
openPath: vi.fn(() => Promise.resolve('')),
} satisfies Pick<Electron.Shell, 'openPath'>,
dialog: {
showMessageBoxSync: vi.fn(() => 0),
} satisfies Pick<Electron.Dialog, 'showMessageBoxSync'>,
}));

const fileGetFileMock = vi.fn(() => ({ path: '/var/log/app/app.log' }));
Expand Down
4 changes: 2 additions & 2 deletions src/preload/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,11 @@ vi.mock('electron', () => ({
contextBridge: {
exposeInMainWorld: (key: string, value: unknown) =>
exposeInMainWorldMock(key, value),
},
} satisfies Pick<Electron.ContextBridge, 'exposeInMainWorld'>,
webFrame: {
getZoomLevel: () => getZoomLevelMock(),
setZoomLevel: (level: number) => setZoomLevelMock(level),
},
} satisfies Pick<Electron.WebFrame, 'getZoomLevel' | 'setZoomLevel'>,
}));

// Simple Notification stub
Expand Down
28 changes: 18 additions & 10 deletions src/preload/utils.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,30 @@ import { EVENTS } from '../shared/events';
import { invokeMainEvent, onRendererEvent, sendMainEvent } from './utils';

vi.mock('electron', () => {
type Listener = (event: unknown, ...args: unknown[]) => void;
type Listener = Parameters<Electron.IpcRenderer['on']>[1];
const listeners: Record<string, Listener[]> = {};
const ipcRendererStub = {
send: vi.fn(),
invoke: vi.fn().mockResolvedValue('response'),
on: vi.fn(function (
this: Electron.IpcRenderer,
channel: string,
listener: Listener,
) {
if (!listeners[channel]) {
listeners[channel] = [];
}
listeners[channel].push(listener);
return this;
}),
} satisfies Pick<Electron.IpcRenderer, 'send' | 'invoke' | 'on'>;
return {
ipcRenderer: {
send: vi.fn(),
invoke: vi.fn().mockResolvedValue('response'),
on: vi.fn((channel: string, listener: Listener) => {
if (!listeners[channel]) {
listeners[channel] = [];
}
listeners[channel].push(listener);
}),
...ipcRendererStub,
__emit: (channel: string, ...args: unknown[]) => {
const list = listeners[channel] || [];
for (const l of list) {
l({}, ...args);
l({} as Electron.IpcRendererEvent, ...args);
}
},
__listeners: listeners,
Expand Down
Loading