29 lines
3.2 KiB
JavaScript
29 lines
3.2 KiB
JavaScript
'use strict'
|
|
const assert=require('assert'),http=require('http'),fs=require('fs'),path=require('path'),vm=require('vm')
|
|
const {install,ORIGIN}=require('./runtime')
|
|
const store={},transport=[]
|
|
const wx={getStorageSync:k=>store[k],setStorageSync:(k,v)=>store[k]=v,removeStorageSync:k=>delete store[k],getStorageInfoSync:()=>({keys:Object.keys(store)}),showToast(){},request(options){
|
|
const url=new URL(options.url);assert.equal(url.origin,'http://127.0.0.1:18766');transport.push(url.pathname)
|
|
const body=options.data?JSON.stringify(options.data):''
|
|
const request=http.request(url,{method:options.method||'GET',headers:{...(options.header||{}),'Content-Type':'application/json','Content-Length':Buffer.byteLength(body)}},res=>{let raw='';res.on('data',data=>raw+=data);res.on('end',()=>{const r={statusCode:res.statusCode,data:JSON.parse(raw),errMsg:'request:ok'};if(options.success)options.success(r);if(options.complete)options.complete(r)})})
|
|
request.setTimeout(8000,()=>request.destroy(Error('Local timeout')));request.on('error',e=>{if(options.fail)options.fail(e)});request.end(body);return {abort:()=>request.destroy()}
|
|
}}
|
|
const local=install(wx,{apiOrigin:'http://127.0.0.1:18766'})
|
|
const request=(route,method='GET',data)=>new Promise((resolve,reject)=>wx.request({url:ORIGIN+route,method,data,header:{Authorization:'Bearer '+(wx.getStorageSync('token')||'')},success:r=>resolve(r.data),fail:reject}))
|
|
async function main(){
|
|
let r=await request('/login','POST',{code:'LOCAL-MOCK-CODE'});assert.equal(r.code,0);wx.setStorageSync('token',r.data.token)
|
|
r=await request('/user/profile');assert.equal(r.code,0);const previous=r.data.introduction
|
|
try{assert.equal((await request('/user/other/profie','PUT',{introduction:'LOCAL_BRIDGE_CHECK'})).code,0);assert.equal((await request('/user/profile')).data.introduction,'LOCAL_BRIDGE_CHECK')}
|
|
finally{await request('/user/other/profie','PUT',{introduction:previous})}
|
|
assert.equal((await request('/user/status')).data.is_base_profile,true)
|
|
assert.equal((await request('/dma/carousel/list')).code,0)
|
|
const before=transport.length;assert.equal((await request('/moment/list')).code,0);assert.equal((await request('/order/refund','POST',{})).code,1);assert.equal(transport.length,before)
|
|
local.scenario('failure',true);assert.equal((await request('/user/profile')).code,1);assert.equal(transport.length,before);local.scenario('failure',false)
|
|
const output=path.resolve(__dirname,'../../../.local-acceptance/mp-local-api-build/weapp')
|
|
let files=0;function walk(dir){for(const e of fs.readdirSync(dir,{withFileTypes:true})){const p=path.join(dir,e.name);if(e.isDirectory())walk(p);else if(p.endsWith('.js')){new vm.Script(fs.readFileSync(p,'utf8'),{filename:p});files++}}}walk(output)
|
|
const app=fs.readFileSync(path.join(output,'app.js'),'utf8');assert(app.startsWith("require('./acceptance-runtime').install(wx, {apiOrigin:'http://127.0.0.1:18766'});"))
|
|
assert.equal(fs.readFileSync(path.join(output,'acceptance-runtime.js'),'utf8'),fs.readFileSync(path.join(__dirname,'runtime.js'),'utf8'))
|
|
console.log('PASS: mini-program adapter -> local gateway -> actual Go API -> MySQL read/write/read-back; mock-only and blocked routes never use transport; '+files+' generated JS files parse.')
|
|
}
|
|
main().catch(error=>{console.error('FAIL: '+error.message);process.exitCode=1})
|