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,requestBody; const context=vm.createContext({AbortSignal,Parse:{Config:{get:async()=>({get:()=>token})}},fetch:async(_url,options)=>{calls++;requestBody=JSON.parse(options.body);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,body:()=>requestBody}; } 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('阅读生成使用已验证的 DeepSeek 模型并返回内容',async()=>{const {run,calls,body}=setup(200);assert.equal((await run()).content,'A complete article');assert.equal(calls(),1);assert.equal(body().model,'deepseek-flash');assert.equal(body().thinking.type,'disabled');assert.equal(body().stream,false);});