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:'injection'})).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"}'); });