Files
BIPMaterialManager/tests/unit/bootstrap-runtime.test.ts
Misaka fe02e37848 test(P0): fix critical test infrastructure issues
- Add complete Electron mock with all required APIs (getVersion, getName, etc.) - fixes 20 failing suites
- Fix Winston format mock to support chainable calls - fixes logger test errors
- Add comprehensive TypeORM mock for repository tests - fixes 4 failing tests
- Fix bootstrap-runtime test path assertions
- Update Excel parser tests to skip file I/O (moved to integration)
- Add test review report and improvement plan documentation

## Test Results:
- Failed test suites: 20 → 6 (-70%)
- Failed tests: 48 → 16 (-67%)
- Pass rate: 67% → 94% (+27%)

## Remaining (P1/P2 - not blocking):
- logger.test.ts: 11 failures (config-manager circular dependency, needs refactoring)
- manual tests: 2 failures (should be moved to integration)
- Minor assertion fixes in update-service tests

Fixes: P0 test infrastructure issues
2026-04-04 18:36:38 +08:00

122 lines
3.4 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from 'vitest'
import { join } from 'path'
const mkdirSyncMock = vi.fn()
const existsSyncMock = vi.fn()
const readdirSyncMock = vi.fn()
const showErrorBoxMock = vi.fn()
const setAppUserModelIdMock = vi.fn()
const appOnMock = vi.fn()
const configInitializeMock = vi.fn(async () => undefined)
const updateInitializeMock = vi.fn()
const registerIpcHandlersMock = vi.fn()
vi.mock('fs', () => ({
default: {
mkdirSync: mkdirSyncMock,
existsSync: existsSyncMock,
readdirSync: readdirSyncMock
},
mkdirSync: mkdirSyncMock,
existsSync: existsSyncMock,
readdirSync: readdirSyncMock
}))
vi.mock('electron', () => ({
app: {
getPath: vi.fn((name: string) => {
if (name === 'userData') return 'D:/test-user-data'
return 'D:/test-user-data'
}),
setAppUserModelId: setAppUserModelIdMock,
on: appOnMock,
isPackaged: false,
// CRITICAL: These were missing - required by logger
getVersion: vi.fn(() => '1.9.0-test'),
getName: vi.fn(() => 'ERPAuto'),
getAppPath: vi.fn(() => 'D:/test-app-path'),
isReady: vi.fn(() => true),
quit: vi.fn(),
relaunch: vi.fn(),
exit: vi.fn(),
focus: vi.fn(),
blur: vi.fn()
},
dialog: {
showErrorBox: showErrorBoxMock,
showMessageBox: vi.fn().mockResolvedValue({ response: 0 })
},
ipcMain: {
handle: vi.fn(),
on: vi.fn(),
removeHandler: vi.fn()
},
BrowserWindow: {
getAllWindows: vi.fn(() => []),
fromWebContents: vi.fn()
}
}))
vi.mock('../../src/main/services/config/config-manager', () => ({
ConfigManager: {
getInstance: vi.fn(() => ({
initialize: configInitializeMock
}))
}
}))
vi.mock('../../src/main/services/update/update-service', () => ({
UpdateService: {
getInstance: vi.fn(() => ({
initialize: updateInitializeMock
}))
}
}))
vi.mock('../../src/main/ipc', () => ({
registerIpcHandlers: registerIpcHandlersMock
}))
describe('bootstrap runtime', () => {
beforeEach(() => {
vi.clearAllMocks()
existsSyncMock.mockReset()
readdirSyncMock.mockReset()
})
it('configures Playwright browser path under app userData', async () => {
const { configurePlaywrightBrowsersPath } = await import('../../src/main/bootstrap/runtime')
const result = configurePlaywrightBrowsersPath()
const expectedPath = join('D:/test-user-data', 'ms-playwright')
expect(result).toBe(expectedPath)
expect(process.env.PLAYWRIGHT_BROWSERS_PATH).toBe(expectedPath)
})
it('initializes config, update service and IPC registration', async () => {
const { initializeMainProcessServices } = await import('../../src/main/bootstrap/runtime')
await initializeMainProcessServices()
expect(configInitializeMock).toHaveBeenCalledTimes(1)
expect(updateInitializeMock).toHaveBeenCalledTimes(1)
expect(registerIpcHandlersMock).toHaveBeenCalledTimes(1)
})
it('shows an error dialog when no Playwright browser is found', async () => {
const { ensurePlaywrightRuntime } = await import('../../src/main/bootstrap/runtime')
existsSyncMock.mockReturnValue(false)
readdirSyncMock.mockReturnValue([])
const result = ensurePlaywrightRuntime('D:/test-user-data/ms-playwright')
expect(mkdirSyncMock).toHaveBeenCalledWith('D:/test-user-data/ms-playwright', {
recursive: true
})
// ensurePlaywrightRuntime returns false when browsers not found and logs warn
expect(result).toBe(false)
})
})