返回 oh-my-ppt
history-handlers.test.ts
根目录 / tests / unit / ipc / history-handlers.test.ts
1 import { beforeEach, describe, expect, it, vi } from 'vitest'
2
3 const state = vi.hoisted(() => {
4 const handlers = new Map<string, (...args: unknown[]) => Promise<unknown>>()
5 const serviceInstances: Array<{ ensureBaseline: ReturnType<typeof vi.fn>; listVersions: ReturnType<typeof vi.fn> }> = []
6 return {
7 handlers,
8 serviceInstances,
9 ipcMain: {
10 handle: vi.fn((channel: string, handler: (...args: unknown[]) => Promise<unknown>) => {
11 handlers.set(channel, handler)
12 })
13 },
14 GitHistoryService: vi.fn().mockImplementation(function GitHistoryService() {
15 const service = {
16 ensureBaseline: vi.fn().mockResolvedValue(undefined),
17 listVersions: vi.fn().mockResolvedValue([])
18 }
19 serviceInstances.push(service)
20 return service
21 })
22 }
23 })
24
25 vi.mock('electron', () => ({ ipcMain: state.ipcMain }))
26 vi.mock('electron-log/main.js', () => ({ default: { warn: vi.fn() } }))
27 vi.mock('../../../src/main/history/git-history-service', () => ({
28 GitHistoryService: state.GitHistoryService
29 }))
30
31 describe('registerHistoryHandlers', () => {
32 beforeEach(() => {
33 vi.resetModules()
34 state.handlers.clear()
35 state.serviceInstances.length = 0
36 state.ipcMain.handle.mockClear()
37 state.GitHistoryService.mockClear()
38 })
39
40 it('caps history list requests at 20 versions in the main process', async () => {
41 const { registerHistoryHandlers } = await import('../../../src/main/history/handlers')
42 const ctx = {
43 db: {},
44 resolveSessionProjectDir: vi.fn().mockResolvedValue('/tmp/session-1'),
45 sessionRunStates: new Map()
46 }
47 registerHistoryHandlers(ctx as never)
48
49 const handler = state.handlers.get('history:listVersions')
50 await handler?.({}, { sessionId: ' session-1 ', limit: 99 })
51
52 expect(state.serviceInstances[0]?.ensureBaseline).toHaveBeenCalledWith(
53 'session-1',
54 '/tmp/session-1'
55 )
56 expect(state.serviceInstances[0]?.listVersions).toHaveBeenCalledWith('session-1', 20)
57 })
58 })
59
59 lines TYPESCRIPT