amical/apps/desktop/tests/helpers/fixtures.ts
2025-11-12 17:10:28 +05:30

276 lines
6.1 KiB
TypeScript

import type { TestDatabase } from "./test-db";
import * as schema from "@db/schema";
import type {
NewTranscription,
NewVocabulary,
NewModel,
NewAppSettings,
NewNote,
AppSettingsData,
} from "@db/schema";
/**
* Default app settings for testing
*/
export const defaultAppSettings: AppSettingsData = {
formatterConfig: {
model: "gpt-4o-mini",
enabled: false,
},
ui: {
theme: "system",
},
transcription: {
language: "en",
autoTranscribe: true,
confidenceThreshold: 0.7,
enablePunctuation: true,
enableTimestamps: false,
preloadWhisperModel: false,
},
recording: {
defaultFormat: "wav",
sampleRate: 16000,
autoStopSilence: true,
silenceThreshold: -45,
maxRecordingDuration: 600,
},
shortcuts: {
pushToTalk: "CommandOrControl+Shift+Space",
toggleRecording: "CommandOrControl+Shift+R",
toggleWindow: "CommandOrControl+Shift+W",
},
modelProvidersConfig: {
defaultSpeechModel: "local-whisper:ggml-base.en",
},
dictation: {
autoDetectEnabled: true,
selectedLanguage: "en",
},
preferences: {
launchAtLogin: false,
minimizeToTray: true,
showWidgetWhileInactive: true,
},
telemetry: {
enabled: false,
},
auth: {
isAuthenticated: false,
idToken: null,
refreshToken: null,
expiresAt: null,
},
};
/**
* Sample transcriptions for testing
*/
export const sampleTranscriptions: NewTranscription[] = [
{
text: "This is a test transcription",
language: "en",
confidence: 0.95,
duration: 5,
speechModel: "whisper-base",
formattingModel: null,
},
{
text: "Another test transcription with more content",
language: "en",
confidence: 0.88,
duration: 8,
speechModel: "whisper-base",
formattingModel: "gpt-4o-mini",
},
{
text: "A third transcription for comprehensive testing",
language: "en",
confidence: 0.92,
duration: 6,
speechModel: "whisper-large",
formattingModel: null,
},
];
/**
* Sample vocabulary items for testing
*/
export const sampleVocabulary: NewVocabulary[] = [
{
word: "Amical",
replacementWord: null,
isReplacement: false,
usageCount: 5,
},
{
word: "API",
replacementWord: null,
isReplacement: false,
usageCount: 3,
},
{
word: "teh",
replacementWord: "the",
isReplacement: true,
usageCount: 2,
},
];
/**
* Sample models for testing
*/
export const sampleModels: NewModel[] = [
{
id: "ggml-base.en",
provider: "local-whisper",
name: "Whisper Base English",
type: "speech",
size: "~147 MB",
description: "Optimized for English transcription",
localPath: "/test/models/ggml-base.en.bin",
sizeBytes: 147964211,
checksum: "test-checksum-base",
downloadedAt: new Date(),
speed: 4,
accuracy: 3,
},
{
id: "gpt-4o-mini",
provider: "openrouter",
name: "GPT-4o Mini",
type: "language",
context: "128k",
description: "Fast and efficient language model",
speed: 5,
accuracy: 4,
},
];
/**
* Sample notes for testing
*/
export const sampleNotes: NewNote[] = [
{
title: "Test Note 1",
content: "This is the first test note",
icon: "📝",
},
{
title: "Test Note 2",
content: "This is the second test note with more content",
icon: "📄",
},
];
/**
* Fixture presets
*/
export const fixtures = {
/**
* Empty database with only default settings
*/
empty: async (testDb: TestDatabase) => {
// Clear existing settings first
await testDb.db.delete(schema.appSettings);
// Insert default settings
await testDb.db.insert(schema.appSettings).values({
id: 1,
data: defaultAppSettings,
version: 1,
});
},
/**
* Database with existing transcriptions
*/
withTranscriptions: async (testDb: TestDatabase) => {
await fixtures.empty(testDb);
await testDb.db.insert(schema.transcriptions).values(sampleTranscriptions);
},
/**
* Database with vocabulary items
*/
withVocabulary: async (testDb: TestDatabase) => {
await fixtures.empty(testDb);
await testDb.db.insert(schema.vocabulary).values(sampleVocabulary);
},
/**
* Database with downloaded models
*/
withModels: async (testDb: TestDatabase) => {
await fixtures.empty(testDb);
await testDb.db.insert(schema.models).values(sampleModels);
},
/**
* Database with notes
*/
withNotes: async (testDb: TestDatabase) => {
await fixtures.empty(testDb);
await testDb.db.insert(schema.notes).values(sampleNotes);
},
/**
* Full database with all types of data
*/
full: async (testDb: TestDatabase) => {
await fixtures.empty(testDb);
await testDb.db.insert(schema.transcriptions).values(sampleTranscriptions);
await testDb.db.insert(schema.vocabulary).values(sampleVocabulary);
await testDb.db.insert(schema.models).values(sampleModels);
await testDb.db.insert(schema.notes).values(sampleNotes);
},
/**
* Database with custom settings
*/
withCustomSettings: async (
testDb: TestDatabase,
settings: Partial<AppSettingsData>,
) => {
// Clear existing settings first
await testDb.db.delete(schema.appSettings);
// Insert custom settings
await testDb.db.insert(schema.appSettings).values({
id: 1,
data: { ...defaultAppSettings, ...settings },
version: 1,
});
},
/**
* Database with authenticated user
*/
withAuth: async (testDb: TestDatabase) => {
await fixtures.withCustomSettings(testDb, {
auth: {
isAuthenticated: true,
idToken: "test-id-token",
refreshToken: "test-refresh-token",
expiresAt: Date.now() + 3600000, // 1 hour from now
userInfo: {
sub: "test-user-123",
email: "test@example.com",
name: "Test User",
},
},
});
},
};
/**
* Helper to seed specific data
*/
export async function seedDatabase(
testDb: TestDatabase,
fixture: keyof typeof fixtures | ((testDb: TestDatabase) => Promise<void>),
): Promise<void> {
if (typeof fixture === "function") {
await fixture(testDb);
} else {
await fixtures[fixture](testDb);
}
}