xiaoshu-runtime-compat.test.mjs 3.1 KB

12345678
  1. import test from 'node:test';import assert from 'node:assert/strict';
  2. import {resolveXiaoshuRuntime,withXiaoshuRuntime} from '../lib/xiaoshu-runtime-compat.mjs';
  3. const fixture=()=>{const calls=[];const sdk={initialize:(...args)=>calls.push(['initialize',...args]),Object:{fromJSON:j=>({id:j.objectId,fetch:async()=>{},get:k=>j[k],toJSON:()=>j})},User:function(){}};const core={set:(...args)=>calls.push(['set',...args])};const workerData={companyId:'7pIbDBJmKx',token:'worker-secret',config:{appId:'7pIbDBJmKx_main',masterKey:'master'}};const native={applicationId:'7pIbDBJmKx_main',masterKey:'master',serverURL:'http://127.0.0.1:12345/data',User:{className:'_User'}};const db={tx:async work=>work(db),query:async()=>[]};return{calls,sdk,core,workerData,native,db,load:async()=>({SDK:sdk,CoreManager:core,workerData})};};
  4. test('existing full SDK and transaction service pass through without reconfiguration',async()=>{const Parse={User:function(){}},Psql={tx(){}};const r=await resolveXiaoshuRuntime(Parse,Psql,{},()=>{throw Error('must not load');});assert.equal(r.Parse,Parse);assert.equal(r.Psql,Psql);});
  5. test('isolated worker restores rich user and exact transaction context without changing shared facades',async()=>{const f=fixture(),raw={objectId:'user1',className:'_User',username:'student'},request={user:raw};const facade={db:f.db};const r=await resolveXiaoshuRuntime(f.native,facade,request,f.load);assert.equal(r.Parse,f.sdk);assert.equal(r.Psql,f.db);assert.equal(request.user.id,'user1');assert.equal(request.user.get('username'),'student');assert.equal(typeof request.user.fetch,'function');assert.equal(typeof f.native.User,'object');assert.equal(facade.db,f.db);assert.equal(raw.fetch,undefined);assert.ok(f.calls.some(c=>c[0]==='set'&&c[1]==='REQUEST_HEADERS'&&c[2]['x-fmode-worker-token']==='worker-secret'));assert.equal(f.sdk.serverURL,f.native.serverURL);await r.Psql.tx(async tx=>assert.equal(tx,f.db));});
  6. test('login without a prior session is left unauthenticated until real login succeeds',async()=>{const f=fixture(),request={};await resolveXiaoshuRuntime(f.native,{db:f.db},request,f.load);assert.equal(request.user,undefined);});
  7. test('foreign app, missing worker token and unsupported SQL context fail before SDK reconfiguration',async()=>{for(const mutate of [f=>f.workerData.companyId='other',f=>f.workerData.config.appId='other',f=>f.workerData.config.masterKey='wrong',f=>f.workerData.token='',f=>f.native.serverURL='https://outside.example/data',f=>f.db={}]){const f=fixture();mutate(f);await assert.rejects(resolveXiaoshuRuntime(f.native,{db:f.db},{},f.load));assert.equal(f.calls.length,0);}});
  8. test('wrapper preserves handler return and only replaces local bindings',async()=>{const code=withXiaoshuRuntime('async function handler(request,response){return {ok:Parse.User===request.expectedUser,db:Psql};}');const P={User:function(){}},db={tx(){}};const run=new Function('Parse','Psql','request','response',code+'\nreturn handler(request,response);');assert.deepEqual(await run(P,db,{expectedUser:P.User},{}),{ok:true,db});assert.equal(withXiaoshuRuntime(code),code);assert.throws(()=>withXiaoshuRuntime('const other=1'),/handler/);});