word-audio-worker.test.mjs 2.0 KB

123456789101112131415161718192021222324252627
  1. import {test} from 'node:test';
  2. import assert from 'node:assert/strict';
  3. import {once} from 'node:events';
  4. import {createWordAudioWorker} from '../word-audio-worker.mjs';
  5. const token='test-token-abcdefghijklmnopqrstuvwxyz0123456789';
  6. async function setup(t,synthesize){
  7. const server=createWordAudioWorker({token,voice:'english',concurrency:1},synthesize);
  8. server.listen(0,'127.0.0.1');await once(server,'listening');t.after(()=>new Promise(resolve=>server.close(resolve)));
  9. const base='http://127.0.0.1:'+server.address().port;
  10. 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})})};
  11. }
  12. test('worker只接受鉴权后的固定发音配置,错误不泄漏供应商信息',async t=>{
  13. let calls=0;const {base,post}=await setup(t,async()=>{calls++;return 'SUQzYWJj';});
  14. assert.equal((await fetch(base+'/healthz')).status,200);
  15. assert.equal((await post({}, {Authorization:'Bearer invalid'})).status,401);
  16. assert.equal((await post({voice:'unapproved'})).status,400);
  17. assert.equal((await post({word:'<speak>injection</speak>'})).status,400);
  18. const valid=await post();assert.equal(valid.status,200);assert.equal((await valid.json()).audio,'SUQzYWJj');assert.equal(calls,1);
  19. });
  20. test('worker并发受限;未完成的任务不重复占用讯飞连接',async t=>{
  21. let done;const {post}=await setup(t,()=>new Promise(resolve=>done=resolve));const first=post();
  22. while(!done)await new Promise(resolve=>setTimeout(resolve,5));assert.equal((await post()).status,429);
  23. done('SUQzYWJj');assert.equal((await first).status,200);
  24. });
  25. test('worker向调用方只返回固定错误,不暴露密钥或签名URL',async t=>{
  26. 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"}');
  27. });