amical/apps/desktop/tests/setup.ts
2025-11-12 14:39:47 +05:30

235 lines
5.5 KiB
TypeScript

import { vi, beforeAll, afterAll, beforeEach, afterEach } from 'vitest';
import { TEST_USER_DATA_PATH } from './helpers/electron-mocks';
import fs from 'fs-extra';
import path from 'path';
// Set test environment variable
process.env.NODE_ENV = 'test';
process.env.VITEST = 'true';
// Global test database instance - will be set by each test
let currentTestDb: any = null;
// Helper function to set the current test database
export function setTestDatabase(db: any) {
currentTestDb = db;
}
// Helper function to get the current test database
export function getTestDatabase() {
if (!currentTestDb) {
throw new Error('Test database not set. Call setTestDatabase() in beforeEach.');
}
return currentTestDb;
}
// Mock the database module to return the current test database
vi.mock('@db', () => ({
get db() {
return getTestDatabase();
},
get dbPath() {
return '/test/db/path';
},
initializeDatabase: vi.fn().mockResolvedValue(undefined),
closeDatabase: vi.fn().mockResolvedValue(undefined),
}));
// Mock electron module
vi.mock('electron', async () => {
const { createElectronMocks } = await import('./helpers/electron-mocks');
return createElectronMocks();
});
// Mock native modules
vi.mock('onnxruntime-node', () => ({
InferenceSession: {
create: vi.fn(function() {
return Promise.resolve({
run: vi.fn(function() {
return Promise.resolve({
output: {
data: new Float32Array([0.5, 0.5, 0.5]),
dims: [1, 3],
},
});
}),
release: vi.fn(),
});
}),
},
Tensor: vi.fn(),
env: {
wasm: {
numThreads: 1,
},
},
}));
vi.mock('@amical/whisper-wrapper', () => ({
WhisperModel: vi.fn().mockImplementation(function() {
return {
transcribe: vi.fn(function() {
return Promise.resolve({
text: 'Test transcription',
segments: [
{
start: 0,
end: 1.5,
text: 'Test transcription',
},
],
});
}),
dispose: vi.fn(),
};
}),
downloadModel: vi.fn(function() { return Promise.resolve(); }),
getModelPath: vi.fn(function() { return '/mock/model/path'; }),
}));
vi.mock('keytar', () => ({
getPassword: vi.fn(function(service: string, account: string) {
return Promise.resolve(null);
}),
setPassword: vi.fn(function(service: string, account: string, password: string) {
return Promise.resolve();
}),
deletePassword: vi.fn(function(service: string, account: string) {
return Promise.resolve(true);
}),
findPassword: vi.fn(function(service: string) {
return Promise.resolve(null);
}),
findCredentials: vi.fn(function(service: string) {
return Promise.resolve([]);
}),
}));
vi.mock('node-machine-id', () => ({
machineIdSync: vi.fn(function() { return 'test-machine-id-12345'; }),
machineId: vi.fn(function() { return Promise.resolve('test-machine-id-12345'); }),
}));
vi.mock('systeminformation', () => ({
system: vi.fn(function() {
return Promise.resolve({
manufacturer: 'Test Manufacturer',
model: 'Test Model',
version: '1.0',
serial: 'TEST123',
uuid: 'test-uuid',
sku: 'TEST-SKU',
});
}),
cpu: vi.fn(function() {
return Promise.resolve({
manufacturer: 'Test CPU',
brand: 'Test Brand',
speed: 2.5,
cores: 4,
});
}),
mem: vi.fn(function() {
return Promise.resolve({
total: 16000000000,
free: 8000000000,
used: 8000000000,
});
}),
osInfo: vi.fn(function() {
return Promise.resolve({
platform: 'darwin',
distro: 'macOS',
release: '14.0',
arch: 'arm64',
});
}),
}));
vi.mock('posthog-node', () => ({
PostHog: vi.fn().mockImplementation(function() {
return {
capture: vi.fn(),
identify: vi.fn(),
alias: vi.fn(),
shutdown: vi.fn(function() { return Promise.resolve(); }),
};
}),
}));
vi.mock('update-electron-app', () => ({
default: vi.fn(),
}));
// Mock electron-log
vi.mock('electron-log', () => ({
default: {
info: vi.fn(),
error: vi.fn(),
warn: vi.fn(),
debug: vi.fn(),
verbose: vi.fn(),
silly: vi.fn(),
transports: {
file: { level: 'info' },
console: { level: 'info' },
},
scope: vi.fn(() => ({
info: vi.fn(),
error: vi.fn(),
warn: vi.fn(),
debug: vi.fn(),
})),
},
info: vi.fn(),
error: vi.fn(),
warn: vi.fn(),
debug: vi.fn(),
verbose: vi.fn(),
silly: vi.fn(),
}));
// Mock electron-squirrel-startup
vi.mock('electron-squirrel-startup', () => ({
default: false,
}));
// Mock electron-trpc-experimental
vi.mock('electron-trpc-experimental/main', () => ({
createIPCHandler: vi.fn(() => ({
handle: vi.fn(),
})),
}));
// Global test setup
beforeAll(async () => {
// Create test user data directory
await fs.ensureDir(TEST_USER_DATA_PATH);
await fs.ensureDir(path.join(TEST_USER_DATA_PATH, 'databases'));
await fs.ensureDir(path.join(TEST_USER_DATA_PATH, 'models'));
await fs.ensureDir(path.join(TEST_USER_DATA_PATH, 'logs'));
});
// Global test teardown
afterAll(async () => {
// Clean up test user data directory
try {
await fs.remove(TEST_USER_DATA_PATH);
} catch (error) {
console.error('Failed to clean up test directory:', error);
}
});
// Reset mocks between tests
beforeEach(() => {
// Clear all mock calls and instances
vi.clearAllMocks();
});
afterEach(() => {
// Additional cleanup if needed
});
// Export for use in tests
export { TEST_USER_DATA_PATH };