eigent/test/unit/electron/main/processUtilsDemo.test.ts
2025-10-03 03:52:56 +03:00

199 lines
No EOL
7.4 KiB
TypeScript

/**
* Simple demonstration test for the new process utilities mocking
* This shows how to test the functions from process.ts with our enhanced mocks
*/
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'
import {
setupMockEnvironment,
createFileSystemMock,
createProcessMock,
createElectronAppMock,
createOsMock,
createPathMock,
createLogMock,
createProcessUtilsMock
} from '../../../mocks/environmentMocks'
// Set up vi.mock calls at the top level to avoid hoisting issues
vi.mock('fs', () => createFileSystemMock())
vi.mock('child_process', () => createProcessMock())
vi.mock('os', () => ({ default: createOsMock() }))
vi.mock('path', () => ({ default: createPathMock() }))
vi.mock('electron', () => ({
app: createElectronAppMock(),
BrowserWindow: vi.fn()
}))
vi.mock('electron-log', () => ({ default: createLogMock() }))
vi.mock('../../../../electron/main/utils/process', () => createProcessUtilsMock())
describe('Process Utils Mocking Demo', () => {
let mockEnv: ReturnType<typeof setupMockEnvironment>
beforeEach(() => {
mockEnv = setupMockEnvironment()
})
afterEach(() => {
mockEnv.reset()
})
describe('Binary Path Functions', () => {
it('should return correct binary paths based on platform', async () => {
// Test Windows binary naming
mockEnv.mockState.system.platform = 'win32'
const uvBinaryName = await mockEnv.processUtilsMock.getBinaryName('uv')
expect(uvBinaryName).toBe('uv.exe')
const uvBinaryPath = await mockEnv.processUtilsMock.getBinaryPath('uv')
expect(uvBinaryPath).toContain('.eigent/bin')
expect(uvBinaryPath).toContain('uv.exe')
})
it('should return correct binary paths for macOS', async () => {
mockEnv.scenarios.macOSEnvironment()
const uvBinaryName = await mockEnv.processUtilsMock.getBinaryName('uv')
expect(uvBinaryName).toBe('uv')
const uvBinaryPath = await mockEnv.processUtilsMock.getBinaryPath('uv')
expect(uvBinaryPath).toContain('.eigent/bin')
expect(uvBinaryPath).toContain('/uv')
expect(uvBinaryPath).not.toContain('.exe')
})
})
describe('Directory Path Functions', () => {
it('should return correct backend path for development mode', () => {
mockEnv.mockState.app.isPackaged = false
const backendPath = mockEnv.processUtilsMock.getBackendPath()
expect(backendPath).toContain('/backend')
expect(backendPath).not.toContain('resources')
})
it('should return correct backend path for packaged app', () => {
mockEnv.scenarios.packagedApp()
const backendPath = mockEnv.processUtilsMock.getBackendPath()
expect(backendPath).toContain('backend')
// In packaged mode, it should use resources path
expect(mockEnv.mockState.app.isPackaged).toBe(true)
})
it('should return correct cache paths', () => {
const cachePath = mockEnv.processUtilsMock.getCachePath('models')
expect(cachePath).toContain('.eigent/cache/models')
})
it('should return correct venv paths', () => {
const venvPath = mockEnv.processUtilsMock.getVenvPath('1.0.0')
expect(venvPath).toContain('.eigent/venvs/backend-1.0.0')
})
})
describe('Binary Existence Checking', () => {
it('should correctly check binary existence', async () => {
// Set up scenario where uv exists but bun doesn't
mockEnv.mockState.filesystem.binariesExist = { 'uv': true, 'bun': false }
const uvExists = await mockEnv.processUtilsMock.isBinaryExists('uv')
const bunExists = await mockEnv.processUtilsMock.isBinaryExists('bun')
expect(uvExists).toBe(true)
expect(bunExists).toBe(false)
})
})
describe('Old Venv Cleanup', () => {
it('should cleanup old venvs correctly', async () => {
// Set up scenario with multiple old venvs
mockEnv.scenarios.multipleOldVenvs('1.0.0')
const initialOldVenvs = [...mockEnv.mockState.filesystem.oldVenvsExist]
expect(initialOldVenvs).toContain('backend-0.9.0')
expect(initialOldVenvs).toContain('backend-0.9.5')
expect(initialOldVenvs).toContain('backend-1.0.1-beta')
// Run cleanup
await mockEnv.processUtilsMock.cleanupOldVenvs('1.0.0')
// Should keep current version but remove others
const remainingVenvs = mockEnv.mockState.filesystem.oldVenvsExist
console.log(remainingVenvs);
expect(remainingVenvs).toContain('backend-1.0.0')
expect(remainingVenvs).not.toContain('backend-0.9.0')
expect(remainingVenvs).not.toContain('backend-0.9.5')
expect(remainingVenvs).not.toContain('backend-1.0.1-beta')
})
})
describe('Installation Decision Matrix', () => {
it('should correctly determine when installation is needed', () => {
// Test the decision logic that createWindow uses
const checkInstallationNeeded = (mockState: any) => {
const currentVersion = mockState.app.currentVersion
const versionExists = mockState.filesystem.versionFileExists
const savedVersion = versionExists ? mockState.filesystem.versionFileContent : ''
const uvExists = mockState.filesystem.binariesExist['uv'] || false
const bunExists = mockState.filesystem.binariesExist['bun'] || false
const installationCompleted = mockState.filesystem.installedLockExists
return !versionExists ||
savedVersion !== currentVersion ||
!uvExists ||
!bunExists ||
!installationCompleted
}
// Test fresh install scenario
mockEnv.scenarios.freshInstall()
expect(checkInstallationNeeded(mockEnv.mockState)).toBe(true)
// Test version update scenario
mockEnv.scenarios.versionUpdate('0.9.0', '1.0.0')
expect(checkInstallationNeeded(mockEnv.mockState)).toBe(true)
// Test all good scenario
mockEnv.mockState.filesystem.versionFileExists = true
mockEnv.mockState.filesystem.versionFileContent = '1.0.0'
mockEnv.mockState.app.currentVersion = '1.0.0'
mockEnv.mockState.filesystem.binariesExist = { 'uv': true, 'bun': true }
mockEnv.mockState.filesystem.installedLockExists = true
expect(checkInstallationNeeded(mockEnv.mockState)).toBe(false)
})
})
describe('File System Operations', () => {
it('should handle directory creation correctly', () => {
// Test .eigent directory creation
mockEnv.scenarios.missingEigentDirectories()
expect(mockEnv.mockState.filesystem.eigentDirExists).toBe(false)
expect(mockEnv.mockState.filesystem.eigentBinDirExists).toBe(false)
// Simulate directory creation
mockEnv.fsMock.mkdirSync('/mock/home/.eigent', { recursive: true })
mockEnv.fsMock.mkdirSync('/mock/home/.eigent/bin', { recursive: true })
expect(mockEnv.mockState.filesystem.eigentDirExists).toBe(true)
expect(mockEnv.mockState.filesystem.eigentBinDirExists).toBe(true)
})
it('should handle file operations correctly', () => {
// Test version file operations
expect(mockEnv.mockState.filesystem.versionFileExists).toBe(true)
// Write new version
mockEnv.fsMock.writeFileSync('/path/to/version.txt', '2.0.0')
expect(mockEnv.mockState.filesystem.versionFileContent).toBe('2.0.0')
// Delete version file
mockEnv.fsMock.unlinkSync('/path/to/version.txt')
expect(mockEnv.mockState.filesystem.versionFileExists).toBe(false)
})
})
})