| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- 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('转写网关鉴权失败');
- });
- });
|