const modulePath = './13-douyinInsightManager'; const transcriptionEnvNames = [ 'TRANSCRIPTION_VOC_TOKEN', 'VOICE_TOKEN', 'OPENCLAW_VOC_TOKEN', 'VOC_TOKEN', 'VOC_SOCIAL_TOKEN', ]; const originalNodeEnv = process.env.NODE_ENV; const originalTranscriptionEnv = Object.fromEntries(transcriptionEnvNames.map(name => [name, process.env[name]])); function loadHelpers(env = {}) { process.env.NODE_ENV = 'test'; transcriptionEnvNames.forEach(name => { delete process.env[name]; }); Object.entries(env).forEach(([key, value]) => { process.env[key] = value; }); delete require.cache[require.resolve(modulePath)]; return require(modulePath).__test; } describe('douyinInsightManager transcript helpers', () => { afterAll(() => { process.env.NODE_ENV = originalNodeEnv; transcriptionEnvNames.forEach(name => { if (originalTranscriptionEnv[name] === undefined) { delete process.env[name]; } else { process.env[name] = originalTranscriptionEnv[name]; } }); delete require.cache[require.resolve(modulePath)]; }); it('prefers Douyin video audio candidates before music fallback', () => { const helpers = loadHelpers(); const payload = { data: { aweme_detail: { aweme_id: '7636915997076770089', video: { duration: 380, dynamic_audio_list: [ { url_list: ['https://sf6-cdn-tos.douyinstatic.com/obj/ies-music/dynamic-audio.m4a'], data_size: 1200, bit_rate: 64000, }, ], play_addr: { url_list: ['https://v3-web.douyinvod.com/aweme/v1/play/video.mp4?mime_type=video_mp4'], }, }, music: { play_url: { url_list: ['https://sf6-cdn-tos.douyinstatic.com/obj/ies-music/music-fallback.mp3'], }, }, }, }, }; const detail = helpers.findAwemeDetail(payload); const selected = helpers.selectMediaCandidate(detail, 'audio'); expect(selected.url).toContain('dynamic-audio.m4a'); expect(selected.kind).toBe('audio'); expect(selected.keyPath).toBe('video.dynamic_audio_list.0.url_list'); expect(selected.durationMs).toBe(0); expect(helpers.durationFromDetail(detail)).toBe(380000); }); it('decodes base64 encoded media urls from Douyin payloads', () => { const helpers = loadHelpers(); const encoded = Buffer.from('https://v3-web.douyinvod.com/aweme/v1/play/video.mp4?mime_type=video_mp4').toString('base64'); expect(helpers.decodeMaybeBase64Url(encoded)).toContain('/aweme/v1/play/video.mp4'); }); it('uses current Parse session token for transcription gateway auth', () => { const helpers = loadHelpers({ TRANSCRIPTION_VOC_TOKEN: 'global-token' }); expect(helpers.transcriptionGatewayToken({ sessionToken: 'r:current-user-session' })).toBe('r:current-user-session'); expect(helpers.transcriptTokenSource('r:current-user-session')).toBe('current_user_sessionToken'); }); it('can fall back to a configured transcription gateway token for diagnostics or legacy callers', () => { const helpers = loadHelpers({ TRANSCRIPTION_VOC_TOKEN: 'gateway-token' }); expect(helpers.transcriptionGatewayToken()).toBe('gateway-token'); expect(helpers.transcriptTokenSource('gateway-token')).toBe('TRANSCRIPTION_VOC_TOKEN'); }); it('reports no gateway token when neither session nor env token is available', () => { const helpers = loadHelpers(); expect(helpers.transcriptionGatewayToken()).toBe(''); expect(helpers.transcriptTokenSource('')).toBe(''); }); it('formats gateway unauthorized responses as operator-readable token errors', () => { const helpers = loadHelpers(); expect(helpers.readGatewayError({ type: 'unauthorized' })).toContain('转写网关鉴权失败'); }); });