251 lines
5.6 KiB
TypeScript
251 lines
5.6 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 };
|