reading-ai-errors.test.mjs 1.6 KB

12345678910111213141516
  1. import {test} from 'node:test';
  2. import assert from 'node:assert/strict';
  3. import {readFileSync} from 'node:fs';
  4. import vm from 'node:vm';
  5. const source=readFileSync(new URL('../deploy-admin-functions.mjs',import.meta.url),'utf8');
  6. const start=source.indexOf('async function readingAi(input,current){'),end=source.indexOf('\nasync function uploadAppMedia',start);
  7. function setup(status,token='fixture-token'){
  8. let calls=0;
  9. const context=vm.createContext({AbortSignal,Parse:{Config:{get:async()=>({get:()=>token})}},fetch:async()=>{calls++;return{status,ok:status===200,text:async()=>JSON.stringify(status===200?{choices:[{message:{content:'A complete article'}}]}:{error:{message:'private-provider-details'}})};},fail:(status,message)=>{throw Object.assign(new Error(message),{status});}});
  10. vm.runInContext(source.slice(start,end),context);return{run:()=>context.readingAi({prompt:'Read a short story'},{id:'teacher'}),calls:()=>calls};
  11. }
  12. for(const status of [401,403])test('生成授权失败 '+status+' 返回可处理的配置错误,不泄露上游内容',async()=>{
  13. const {run,calls}=setup(status);await assert.rejects(run(),error=>error.status===424&&error.message==='阅读生成服务授权异常,请联系管理员处理');assert.equal(calls(),1);
  14. });
  15. test('阅读服务缺少配置时不发送生成请求',async()=>{const {run,calls}=setup(200,'');await assert.rejects(run(),error=>error.status===424&&error.message.includes('尚未配置'));assert.equal(calls(),0);});
  16. test('正常阅读生成仍返回原有内容',async()=>{const {run,calls}=setup(200);assert.equal((await run()).content,'A complete article');assert.equal(calls(),1);});