Files
goodbuddy/src/main/device-sharing-ipc.test.ts
T

26 lines
1.7 KiB
TypeScript

import { expect, it, vi } from 'vitest'
import { registerDeviceSharingIpc } from './device-sharing-ipc'
import { ipcChannels } from '../shared/ipc-channels'
const handlers = vi.hoisted(() => new Map<string, (event: unknown, input?: unknown) => unknown>())
vi.mock('electron', () => ({ ipcMain: {
handle: (channel: string, handler: (event: unknown, input?: unknown) => unknown) => handlers.set(channel, handler),
removeHandler: (channel: string) => handlers.delete(channel)
} }))
it('checks the trusted main frame on every explicit method and validates mutation input', () => {
const webContents = { mainFrame: { url: 'file:///app.html' }, getURL: () => 'file:///app.html' }
const service = { getSettings: vi.fn(), saveSettings: vi.fn(), registerDevice: vi.fn(), getCatalog: vi.fn(), publish: vi.fn(), revoke: vi.fn() }
const dispose = registerDeviceSharingIpc({ webContents } as never, service as never)
const event = { sender: webContents, senderFrame: webContents.mainFrame }
expect(handlers.size).toBe(6)
for (const handler of handlers.values()) {
expect(() => handler({ sender: {}, senderFrame: webContents.mainFrame })).toThrow('IPC')
expect(() => handler({ sender: webContents, senderFrame: { url: 'file:///app.html' } })).toThrow('IPC')
}
expect(() => handlers.get(ipcChannels.sharingSettingsSave)!(event, { deviceId: 'forged', name: 'x', serverUrl: 'http://localhost' })).toThrow()
expect(() => handlers.get(ipcChannels.sharingPublish)!(event, { name: 'x' })).toThrow()
expect(() => handlers.get(ipcChannels.sharingRevoke)!(event, '')).toThrow()
handlers.get(ipcChannels.sharingRegister)!(event)
expect(service.registerDevice).toHaveBeenCalledOnce()
dispose(); expect(handlers.size).toBe(0)
})