import { describe, it, expect, vi, beforeEach } from 'vitest';
import { AssemblyAI } from 'assemblyai';
vi.mock('assemblyai', () => ({
AssemblyAI: vi.fn().mockImplementation(() => ({
transcripts: {
transcribe: vi.fn().mockResolvedValue({
id: 'mock-transcript-id',
status: 'completed',
text: 'Hello world, this is a test transcription.',
audio_duration: 5.2,
words: [
{ text: 'Hello', start: 0, end: 300, confidence: 0.99 },
{ text: 'world', start: 310, end: 600, confidence: 0.98 },
],
utterances: [
{ speaker: 'A', text: 'Hello world, this is a test transcription.', start: 0, end: 5200 },
],
}),
get: vi.fn(),
list: vi.fn().mockResolvedValue({
transcripts: [{ id: 'mock-1', status: 'completed' }],
}),
delete: vi.fn().mockResolvedValue({}),
},
lemur: {
task: vi.fn().mockResolvedValue({
request_id: 'mock-lemur-id',
response: 'This is a greeting recording.',
}),
summary: vi.fn().mockResolvedValue({
response: 'The audio contains a greeting.',
}),
},
})),
}));
describe('TranscriptionService', () => {
it('should transcribe audio and return text', async () => {
const client = new AssemblyAI({ apiKey: 'test-key' });
const result = await client.transcripts.transcribe({
audio: 'https://example.com/test.wav',
});
expect(result.status).toBe('completed');
expect(result.text).toContain('Hello world');
expect(result.words).toHaveLength(2);
});
it('should handle speaker diarization', async () => {
const client = new AssemblyAI({ apiKey: 'test-key' });
const result = await client.transcripts.transcribe({
audio: 'https://example.com/test.wav',
speaker_labels: true,
});
expect(result.utterances).toBeDefined();
expect(result.utterances![0].speaker).toBe('A');
});
it('should run LeMUR task', async () => {
const client = new AssemblyAI({ apiKey: 'test-key' });
const { response } = await client.lemur.task({
transcript_ids: ['mock-transcript-id'],
prompt: 'Summarize.',
});
expect(response).toBeTruthy();
});
});
import { describe, it, expect } from 'vitest';
import { AssemblyAI } from 'assemblyai';
const TEST_AUDIO = 'https://storage.googleapis.com/aai-web-samples/5_common_sports_702.wav';
const skipIfNoKey = !process.env.ASSEMBLYAI_API_KEY;
describe.skipIf(skipIfNoKey)('AssemblyAI Integration', () => {
const client = new AssemblyAI({
apiKey: process.env.ASSEMBLYAI_API_KEY!,
});
it('should transcribe a short audio file', async () => {
const transcript = await client.transcripts.transcribe({
audio: TEST_AUDIO,
});
expect(transcript.status).toBe('completed');
expect(transcript.text).toBeTruthy();
expect(transcript.audio_duration).toBeGreaterThan(0);
expect(transcript.words?.length).toBeGreaterThan(0);
}, 60_000);
it('should list recent transcripts', async () => {
const page = await client.transcripts.list({ limit: 5 });
expect(page.transcripts).toBeDefined();
expect(Array.isArray(page.transcripts)).toBe(true);
});
it('should run LeMUR on a transcript', async () => {
const transcript = await client.transcripts.transcribe({
audio: TEST_AUDIO,
});
const { response } = await client.lemur.task({
transcript_ids: [transcript.id],
prompt: 'What is this about? One sentence.',
});
expect(response).toBeTruthy();
expect(response.length).toBeGreaterThan(10);
}, 90_000);
});