235 lines
5.5 KiB
TypeScript
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 };
|