orca/src/main/ipc/register-core-handlers.test.ts

244 lines
8.4 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from 'vitest'
const {
registerCliHandlersMock,
registerPreflightHandlersMock,
registerClaudeUsageHandlersMock,
registerCodexUsageHandlersMock,
registerGitHubHandlersMock,
registerFeedbackHandlersMock,
registerStatsHandlersMock,
registerNotificationHandlersMock,
registerSettingsHandlersMock,
registerShellHandlersMock,
registerSessionHandlersMock,
registerUIHandlersMock,
registerFilesystemHandlersMock,
registerRuntimeHandlersMock,
registerCodexAccountHandlersMock,
registerClipboardHandlersMock,
registerUpdaterHandlersMock,
registerRateLimitHandlersMock,
registerBrowserHandlersMock,
setAgentBrowserBridgeRefMock,
setTrustedBrowserRendererWebContentsIdMock,
registerFilesystemWatcherHandlersMock,
registerAppHandlersMock,
registerExportHandlersMock
} = vi.hoisted(() => ({
registerCliHandlersMock: vi.fn(),
registerPreflightHandlersMock: vi.fn(),
registerClaudeUsageHandlersMock: vi.fn(),
registerCodexUsageHandlersMock: vi.fn(),
registerGitHubHandlersMock: vi.fn(),
registerFeedbackHandlersMock: vi.fn(),
registerStatsHandlersMock: vi.fn(),
registerNotificationHandlersMock: vi.fn(),
registerSettingsHandlersMock: vi.fn(),
registerShellHandlersMock: vi.fn(),
registerSessionHandlersMock: vi.fn(),
registerUIHandlersMock: vi.fn(),
registerFilesystemHandlersMock: vi.fn(),
registerRuntimeHandlersMock: vi.fn(),
registerCodexAccountHandlersMock: vi.fn(),
registerClipboardHandlersMock: vi.fn(),
registerUpdaterHandlersMock: vi.fn(),
registerRateLimitHandlersMock: vi.fn(),
registerBrowserHandlersMock: vi.fn(),
setAgentBrowserBridgeRefMock: vi.fn(),
setTrustedBrowserRendererWebContentsIdMock: vi.fn(),
registerFilesystemWatcherHandlersMock: vi.fn(),
registerAppHandlersMock: vi.fn(),
registerExportHandlersMock: vi.fn()
}))
vi.mock('./cli', () => ({
registerCliHandlers: registerCliHandlersMock
}))
vi.mock('./preflight', () => ({
registerPreflightHandlers: registerPreflightHandlersMock
}))
vi.mock('./claude-usage', () => ({
registerClaudeUsageHandlers: registerClaudeUsageHandlersMock
}))
vi.mock('./codex-usage', () => ({
registerCodexUsageHandlers: registerCodexUsageHandlersMock
}))
vi.mock('./github', () => ({
registerGitHubHandlers: registerGitHubHandlersMock
}))
vi.mock('./feedback', () => ({
registerFeedbackHandlers: registerFeedbackHandlersMock
}))
vi.mock('./export', () => ({
registerExportHandlers: registerExportHandlersMock
}))
vi.mock('./stats', () => ({
registerStatsHandlers: registerStatsHandlersMock
}))
vi.mock('./notifications', () => ({
registerNotificationHandlers: registerNotificationHandlersMock
}))
vi.mock('./settings', () => ({
registerSettingsHandlers: registerSettingsHandlersMock
}))
vi.mock('./shell', () => ({
registerShellHandlers: registerShellHandlersMock
}))
vi.mock('./session', () => ({
registerSessionHandlers: registerSessionHandlersMock
}))
vi.mock('./ui', () => ({
registerUIHandlers: registerUIHandlersMock
}))
vi.mock('./filesystem', () => ({
registerFilesystemHandlers: registerFilesystemHandlersMock
}))
vi.mock('./filesystem-watcher', () => ({
registerFilesystemWatcherHandlers: registerFilesystemWatcherHandlersMock
}))
vi.mock('./rate-limits', () => ({
registerRateLimitHandlers: registerRateLimitHandlersMock
}))
vi.mock('./runtime', () => ({
registerRuntimeHandlers: registerRuntimeHandlersMock
}))
vi.mock('./codex-accounts', () => ({
registerCodexAccountHandlers: registerCodexAccountHandlersMock
}))
vi.mock('../window/attach-main-window-services', () => ({
registerClipboardHandlers: registerClipboardHandlersMock,
registerUpdaterHandlers: registerUpdaterHandlersMock
}))
vi.mock('./browser', () => ({
registerBrowserHandlers: registerBrowserHandlersMock,
setTrustedBrowserRendererWebContentsId: setTrustedBrowserRendererWebContentsIdMock,
setAgentBrowserBridgeRef: setAgentBrowserBridgeRefMock
}))
vi.mock('./app', () => ({
registerAppHandlers: registerAppHandlersMock
}))
import { registerCoreHandlers } from './register-core-handlers'
describe('registerCoreHandlers', () => {
beforeEach(() => {
registerCliHandlersMock.mockReset()
registerPreflightHandlersMock.mockReset()
registerClaudeUsageHandlersMock.mockReset()
registerCodexUsageHandlersMock.mockReset()
registerGitHubHandlersMock.mockReset()
registerFeedbackHandlersMock.mockReset()
registerStatsHandlersMock.mockReset()
registerNotificationHandlersMock.mockReset()
registerSettingsHandlersMock.mockReset()
registerShellHandlersMock.mockReset()
registerSessionHandlersMock.mockReset()
registerUIHandlersMock.mockReset()
registerFilesystemHandlersMock.mockReset()
registerRuntimeHandlersMock.mockReset()
registerCodexAccountHandlersMock.mockReset()
registerClipboardHandlersMock.mockReset()
registerUpdaterHandlersMock.mockReset()
registerRateLimitHandlersMock.mockReset()
registerBrowserHandlersMock.mockReset()
setAgentBrowserBridgeRefMock.mockReset()
setTrustedBrowserRendererWebContentsIdMock.mockReset()
registerFilesystemWatcherHandlersMock.mockReset()
registerAppHandlersMock.mockReset()
registerExportHandlersMock.mockReset()
})
it('passes the store through to handler registrars that need it', () => {
const store = { marker: 'store' }
const runtime = { marker: 'runtime', getAgentBrowserBridge: () => null }
const stats = { marker: 'stats' }
const claudeUsage = { marker: 'claudeUsage' }
const codexUsage = { marker: 'codexUsage' }
const codexAccounts = { marker: 'codexAccounts' }
const rateLimits = { marker: 'rateLimits' }
registerCoreHandlers(
store as never,
runtime as never,
stats as never,
claudeUsage as never,
codexUsage as never,
codexAccounts as never,
rateLimits as never
)
expect(registerClaudeUsageHandlersMock).toHaveBeenCalledWith(claudeUsage)
expect(registerCodexUsageHandlersMock).toHaveBeenCalledWith(codexUsage)
expect(registerCodexAccountHandlersMock).toHaveBeenCalledWith(codexAccounts)
expect(registerRateLimitHandlersMock).toHaveBeenCalledWith(rateLimits)
expect(registerGitHubHandlersMock).toHaveBeenCalledWith(store, stats)
expect(registerFeedbackHandlersMock).toHaveBeenCalled()
expect(registerStatsHandlersMock).toHaveBeenCalledWith(stats)
expect(registerNotificationHandlersMock).toHaveBeenCalledWith(store)
expect(registerSettingsHandlersMock).toHaveBeenCalledWith(store)
expect(registerSessionHandlersMock).toHaveBeenCalledWith(store)
expect(registerUIHandlersMock).toHaveBeenCalledWith(store)
expect(registerFilesystemHandlersMock).toHaveBeenCalledWith(store)
expect(registerRuntimeHandlersMock).toHaveBeenCalledWith(runtime)
expect(registerCliHandlersMock).toHaveBeenCalled()
expect(registerPreflightHandlersMock).toHaveBeenCalled()
expect(registerShellHandlersMock).toHaveBeenCalled()
expect(registerClipboardHandlersMock).toHaveBeenCalled()
expect(registerUpdaterHandlersMock).toHaveBeenCalled()
expect(setTrustedBrowserRendererWebContentsIdMock).toHaveBeenCalledWith(null)
expect(registerBrowserHandlersMock).toHaveBeenCalled()
expect(registerFilesystemWatcherHandlersMock).toHaveBeenCalled()
})
it('only registers IPC handlers once but always updates web contents id', () => {
// The first test already called registerCoreHandlers, so the module-level
// guard is now set. beforeEach reset all mocks, so call counts are 0.
const store2 = { marker: 'store2' }
const runtime2 = { marker: 'runtime2', getAgentBrowserBridge: () => null }
const stats2 = { marker: 'stats2' }
const claudeUsage2 = { marker: 'claudeUsage2' }
const codexUsage2 = { marker: 'codexUsage2' }
const codexAccounts2 = { marker: 'codexAccounts2' }
const rateLimits2 = { marker: 'rateLimits2' }
registerCoreHandlers(
store2 as never,
runtime2 as never,
stats2 as never,
claudeUsage2 as never,
codexUsage2 as never,
codexAccounts2 as never,
rateLimits2 as never,
42
)
// Web contents ID should always be updated
expect(setTrustedBrowserRendererWebContentsIdMock).toHaveBeenCalledWith(42)
// IPC handlers should NOT be registered again
expect(registerCliHandlersMock).not.toHaveBeenCalled()
expect(registerPreflightHandlersMock).not.toHaveBeenCalled()
expect(registerBrowserHandlersMock).not.toHaveBeenCalled()
})
})