import { describe, expect, it, vi } from 'vitest'; import { generateSubtitlePipeline } from './subtitleGeneration'; import { SubtitlePipelineResult } from '../types'; describe('generateSubtitlePipeline', () => { it('uses the requested provider and video path when building subtitles', async () => { const subtitleResult: SubtitlePipelineResult = { subtitles: [], speakers: [], quality: 'fallback', targetLanguage: 'English', }; const generateSubtitlesFromVideo = vi.fn(async () => subtitleResult); await generateSubtitlePipeline({ videoPath: 'clip.mp4', targetLanguage: 'English', provider: 'gemini', env: { GEMINI_API_KEY: 'gemini-key', ARK_API_KEY: 'ark-key', }, deps: { generateSubtitlesFromVideo, }, }); expect(generateSubtitlesFromVideo).toHaveBeenCalledWith( expect.objectContaining({ videoPath: 'clip.mp4', targetLanguage: 'English', providerConfig: { provider: 'gemini', apiKey: 'gemini-key', model: 'gemini-2.5-flash', }, }), ); }); it('falls back to the env default provider when the request omits it', async () => { const subtitleResult: SubtitlePipelineResult = { subtitles: [], speakers: [], quality: 'fallback', targetLanguage: 'English', }; const generateSubtitlesFromVideo = vi.fn(async () => subtitleResult); await generateSubtitlePipeline({ videoPath: 'clip.mp4', targetLanguage: 'English', env: { DEFAULT_LLM_PROVIDER: 'doubao', ARK_API_KEY: 'ark-key', }, deps: { generateSubtitlesFromVideo, }, }); expect(generateSubtitlesFromVideo).toHaveBeenCalledWith( expect.objectContaining({ providerConfig: { provider: 'doubao', apiKey: 'ark-key', model: 'doubao-seed-2-0-pro-260215', baseUrl: 'https://ark.cn-beijing.volces.com/api/v3/responses', timeoutMs: 600000, }, }), ); }); it('passes fetch implementation into video subtitle generation', async () => { const subtitleResult: SubtitlePipelineResult = { subtitles: [], speakers: [], quality: 'fallback', targetLanguage: 'English', }; const generateSubtitlesFromVideo = vi.fn(async () => subtitleResult); const fetchImpl = vi.fn(); await generateSubtitlePipeline({ videoPath: 'clip.mp4', targetLanguage: 'English', provider: 'doubao', env: { ARK_API_KEY: 'ark-key', }, fetchImpl, requestId: 'req-123', deps: { generateSubtitlesFromVideo, }, }); expect(generateSubtitlesFromVideo).toHaveBeenCalledWith( expect.objectContaining({ fetchImpl, requestId: 'req-123', }), ); }); it('passes file id through to video subtitle generation', async () => { const subtitleResult: SubtitlePipelineResult = { subtitles: [], speakers: [], quality: 'fallback', targetLanguage: 'English', }; const generateSubtitlesFromVideo = vi.fn(async () => subtitleResult); await generateSubtitlePipeline({ fileId: 'file-123', targetLanguage: 'English', provider: 'doubao', env: { ARK_API_KEY: 'ark-key', }, deps: { generateSubtitlesFromVideo, }, }); expect(generateSubtitlesFromVideo).toHaveBeenCalledWith( expect.objectContaining({ fileId: 'file-123', videoPath: undefined, }), ); }); it('passes tts language through to video subtitle generation', async () => { const subtitleResult: SubtitlePipelineResult = { subtitles: [], speakers: [], quality: 'fallback', targetLanguage: 'English', }; const generateSubtitlesFromVideo = vi.fn(async () => subtitleResult); await generateSubtitlePipeline({ videoPath: 'clip.mp4', targetLanguage: 'English', ttsLanguage: 'fr', provider: 'doubao', env: { ARK_API_KEY: 'ark-key', }, deps: { generateSubtitlesFromVideo, }, } as any); expect(generateSubtitlesFromVideo).toHaveBeenCalledWith( expect.objectContaining({ targetLanguage: 'English', ttsLanguage: 'fr', }), ); }); });