48 lines
2.9 KiB
JavaScript
48 lines
2.9 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
let API;
|
|
try { ({API}=await import('../api.js')); } catch {}
|
|
assert.ok(API,'Same-origin authenticated API client must exist');
|
|
|
|
const requests=[];
|
|
const transport=async (path,options) => {
|
|
requests.push({path,options});
|
|
if (path==='/api/auth/login') return {ok:true,status:200,json:async()=>({csrfToken:'session-csrf',user:{name:'Alice'}})};
|
|
if (path==='/api/failure') return {ok:false,status:409,json:async()=>({detail:'资料已更新'})};
|
|
if (path==='/api/validation') return {ok:false,status:422,json:async()=>({detail:[{msg:'Value error, 请输入有效日期'}]})};
|
|
return {ok:true,status:200,json:async()=>({workspace:{cards:[{name:'Persisted SIM'}]}})};
|
|
};
|
|
const client=new API(transport);
|
|
await client.request('POST','/api/auth/login',{email:'alice@example.com',password:' password '});
|
|
const result=await client.request('POST','/api/cards',{name:'Persisted SIM'});
|
|
assert.equal(requests[0].options.credentials,'same-origin');
|
|
assert.equal(JSON.parse(requests[0].options.body).password,' password ');
|
|
assert.equal(requests[1].options.headers['X-CSRF-Token'],'session-csrf');
|
|
assert.equal(result.workspace.cards[0].name,'Persisted SIM');
|
|
await assert.rejects(client.request('GET','/api/failure'),error=>error.status===409 && error.message==='资料已更新');
|
|
await assert.rejects(client.request('GET','/api/validation'),error=>error.message==='请输入有效日期');
|
|
const offline=new API(async()=>{throw new TypeError('Failed to fetch')});
|
|
await assert.rejects(offline.request('GET','/api/workspace'),/无法连接服务器/);
|
|
client.clear();
|
|
await client.request('GET','/api/workspace');
|
|
assert.equal(requests.at(-1).options.headers['X-CSRF-Token'],undefined);
|
|
let finishOldRead, finishOldError;
|
|
const deferred = new API((path) => {
|
|
if(path==='/api/old-workspace') return new Promise(resolve=>{finishOldRead=resolve;});
|
|
if(path==='/api/old-error') return new Promise(resolve=>{finishOldError=resolve;});
|
|
return Promise.resolve({ok:true,status:200,json:async()=>({csrfToken:'bob-csrf',user:{id:'bob'},workspace:{cards:[]}})});
|
|
});
|
|
const oldRead=deferred.request('GET','/api/old-workspace');
|
|
const oldError=deferred.request('GET','/api/old-error');
|
|
deferred.clear();
|
|
const bob=await deferred.request('POST','/api/auth/login',{email:'bob@example.com',password:'long-password'});
|
|
const rejectOld=assert.rejects(oldRead,error=>error.name==='StaleResponse');
|
|
const rejectError=assert.rejects(oldError,error=>error.name==='StaleResponse');
|
|
finishOldRead({ok:true,status:200,json:async()=>({csrfToken:'alice-csrf',workspace:{cards:[{name:'Alice private SIM'}]}})});
|
|
finishOldError({ok:false,status:401,json:async()=>({detail:'请先登录'})});
|
|
await rejectOld;await rejectError;
|
|
assert.equal(bob.user.id,'bob');
|
|
assert.equal(deferred.csrf,'bob-csrf');
|
|
deferred.clear();
|
|
assert.throws(()=>deferred.assertCurrent(bob),error=>error.name==='StaleResponse');
|
|
console.log('API client: 12 checks passed');
|