Skip to content

Commit e6bc7d4

Browse files
committed
test(preload): enhance IPC mock to assert event listener invocation
1 parent 7662012 commit e6bc7d4

File tree

2 files changed

+566
-556
lines changed

2 files changed

+566
-556
lines changed

electron/preload/__tests__/index.test.ts

+17-8
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
import type { ContextBridge, IpcRenderer } from 'electron';
1+
import type { ContextBridge, IpcRenderer, IpcRendererEvent } from 'electron';
22
import { afterEach, beforeAll, describe, expect, it, vi } from 'vitest';
33
import type {
44
AccountWithPassword,
55
Character,
66
} from '../../common/account/types.js';
7+
import { GameCode } from '../../common/game/types.js';
78
import type { Layout } from '../../common/layout/types.js';
89
import type { LogMessage } from '../../common/logger/types.js';
910
import { LogLevel } from '../../common/logger/types.js';
@@ -16,7 +17,11 @@ const { mockContextBridge, mockIpcRenderer } = vi.hoisted(() => {
1617
const mockIpcRenderer = {
1718
send: vi.fn<IpcRenderer['send']>(),
1819
invoke: vi.fn<IpcRenderer['invoke']>(),
19-
on: vi.fn<IpcRenderer['on']>(),
20+
on: vi.fn<IpcRenderer['on']>().mockImplementation((channel, callback) => {
21+
// Invoke our callbacks so we can assert they're being registered.
22+
callback({} as IpcRendererEvent, 'test-message');
23+
return {} as IpcRenderer;
24+
}),
2025
off: vi.fn<IpcRenderer['off']>(),
2126
removeAllListeners: vi.fn<IpcRenderer['removeAllListeners']>(),
2227
};
@@ -132,7 +137,7 @@ describe('index', () => {
132137
const mockCharacter: Character = {
133138
accountName: 'test-account-name',
134139
characterName: 'test-character-name',
135-
gameCode: 'DR',
140+
gameCode: GameCode.PRIME,
136141
};
137142

138143
it('invokes saveCharacter', async () => {
@@ -148,7 +153,7 @@ describe('index', () => {
148153
const mockCharacter: Character = {
149154
accountName: 'test-account-name',
150155
characterName: 'test-character-name',
151-
gameCode: 'DR',
156+
gameCode: GameCode.PRIME,
152157
};
153158

154159
it('invokes removeCharacter', async () => {
@@ -164,7 +169,7 @@ describe('index', () => {
164169
const mockCharacter: Character = {
165170
accountName: 'test-account-name',
166171
characterName: 'test-character-name',
167-
gameCode: 'DR',
172+
gameCode: GameCode.PRIME,
168173
};
169174

170175
it('invokes listCharacters', async () => {
@@ -179,7 +184,7 @@ describe('index', () => {
179184
const mockCharacter: Character = {
180185
accountName: 'test-account-name',
181186
characterName: 'test-character-name',
182-
gameCode: 'DR',
187+
gameCode: GameCode.PRIME,
183188
};
184189

185190
it('invokes playCharacter', async () => {
@@ -299,19 +304,23 @@ describe('index', () => {
299304

300305
describe('#onMessage', async () => {
301306
it('invokes on, then off when unsubscribe', async () => {
307+
// The `onMessage` API wraps our callback so to assert that
308+
// our function is being used then we need to assert it is invoked.
302309
const mockListener = vi.fn();
303310

304311
const unsubscribe = api.onMessage('test-channel', mockListener);
305312
expect(mockIpcRenderer.on).toHaveBeenCalledWith(
306313
'test-channel',
307-
mockListener
314+
expect.any(Function)
308315
);
309316

310317
unsubscribe();
311318
expect(mockIpcRenderer.off).toHaveBeenCalledWith(
312319
'test-channel',
313-
mockListener
320+
expect.any(Function)
314321
);
322+
323+
expect(mockListener).toHaveBeenCalledWith('test-message');
315324
});
316325
});
317326

0 commit comments

Comments
 (0)