| 123456789101112131415161718192021222324252627 |
- import {test} from 'node:test';
- import assert from 'node:assert/strict';
- import {once} from 'node:events';
- import {createWordAudioWorker} from '../word-audio-worker.mjs';
- const token='test-token-abcdefghijklmnopqrstuvwxyz0123456789';
- async function setup(t,synthesize){
- const server=createWordAudioWorker({token,voice:'english',concurrency:1},synthesize);
- server.listen(0,'127.0.0.1');await once(server,'listening');t.after(()=>new Promise(resolve=>server.close(resolve)));
- const base='http://127.0.0.1:'+server.address().port;
- return {base,post:(input={},headers={})=>fetch(base+'/synthesize',{method:'POST',headers:{'Content-Type':'application/json',Authorization:'Bearer '+token,...headers},body:JSON.stringify({word:'apple',voice:'english',speed:50,...input})})};
- }
- test('worker只接受鉴权后的固定发音配置,错误不泄漏供应商信息',async t=>{
- let calls=0;const {base,post}=await setup(t,async()=>{calls++;return 'SUQzYWJj';});
- assert.equal((await fetch(base+'/healthz')).status,200);
- assert.equal((await post({}, {Authorization:'Bearer invalid'})).status,401);
- assert.equal((await post({voice:'unapproved'})).status,400);
- assert.equal((await post({word:'<speak>injection</speak>'})).status,400);
- const valid=await post();assert.equal(valid.status,200);assert.equal((await valid.json()).audio,'SUQzYWJj');assert.equal(calls,1);
- });
- test('worker并发受限;未完成的任务不重复占用讯飞连接',async t=>{
- let done;const {post}=await setup(t,()=>new Promise(resolve=>done=resolve));const first=post();
- while(!done)await new Promise(resolve=>setTimeout(resolve,5));assert.equal((await post()).status,429);
- done('SUQzYWJj');assert.equal((await first).status,200);
- });
- test('worker向调用方只返回固定错误,不暴露密钥或签名URL',async t=>{
- const {post}=await setup(t,async()=>{throw Error('sensitive-provider-url');});const response=await post();assert.equal(response.status,502);assert.equal(await response.text(),'{"error":"synthesis_failed"}');
- });
|