import {test} from 'node:test'; import assert from 'node:assert/strict'; import {readFileSync} from 'node:fs'; import vm from 'node:vm'; const source=readFileSync(new URL('../deploy-admin-functions.mjs',import.meta.url),'utf8'); const start=source.indexOf('async function readingAi(input,current){'),end=source.indexOf('\nasync function uploadAppMedia',start); function setup(status,token='fixture-token'){ let calls=0; 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});}}); vm.runInContext(source.slice(start,end),context);return{run:()=>context.readingAi({prompt:'Read a short story'},{id:'teacher'}),calls:()=>calls}; } for(const status of [401,403])test('生成授权失败 '+status+' 返回可处理的配置错误,不泄露上游内容',async()=>{ const {run,calls}=setup(status);await assert.rejects(run(),error=>error.status===424&&error.message==='阅读生成服务授权异常,请联系管理员处理');assert.equal(calls(),1); }); test('阅读服务缺少配置时不发送生成请求',async()=>{const {run,calls}=setup(200,'');await assert.rejects(run(),error=>error.status===424&&error.message.includes('尚未配置'));assert.equal(calls(),0);}); test('正常阅读生成仍返回原有内容',async()=>{const {run,calls}=setup(200);assert.equal((await run()).content,'A complete article');assert.equal(calls(),1);});