42 lines
4.6 KiB
JavaScript
42 lines
4.6 KiB
JavaScript
import {spawn} from 'node:child_process';
|
|
import {mkdtemp,rm} from 'node:fs/promises';
|
|
import {tmpdir} from 'node:os';
|
|
import path from 'node:path';
|
|
import assert from 'node:assert/strict';
|
|
const dataDir=await mkdtemp(path.join(tmpdir(),'fieldwork-check-'));
|
|
const server=spawn(process.execPath,['node_modules/next/dist/bin/next','start','-H','127.0.0.1','-p','3211'],{env:{...process.env,EXTRACTOR_API_KEY:'local-test-only',EXTRACTOR_DATA_DIR:dataDir},stdio:'ignore'});
|
|
const base='http://127.0.0.1:3211',auth={Authorization:'Bearer local-test-only'};
|
|
const post=(url,body)=>fetch(base+url,{method:'POST',headers:{...auth,'Content-Type':'application/json'},body:JSON.stringify(body)});
|
|
try{let ready=false;for(let i=0;i<60;i++){try{if((await fetch(base+'/api/v1/health')).ok){ready=true;break;}}catch{}await new Promise(r=>setTimeout(r,300));}assert.ok(ready);
|
|
assert.equal((await fetch(base)).status,200);
|
|
assert.equal((await fetch(base+'/api/v1/tasks',{method:'POST'})).status,401);
|
|
const fields=[{name:'name',type:'string',description:'姓名'},{name:'items',type:'array',description:'项目',fields:[{name:'value',type:'number',description:'数值'}]}];
|
|
assert.equal((await post('/api/v1/tasks',{fields:[],text:'x'})).status,400);
|
|
const schemaResponse=await post('/api/v1/schemas',{name:'API schema',fields});assert.equal(schemaResponse.status,201);const saved=await schemaResponse.json();assert.equal(saved.version,1);
|
|
const readSchema=await fetch(base+'/api/v1/schemas/'+saved.id,{headers:auth});assert.deepEqual((await readSchema.json()).fields,fields);
|
|
assert.equal((await fetch(base+'/api/v1/schemas')).status,401);
|
|
const listed=await fetch(base+'/api/v1/schemas',{headers:auth});assert.equal((await listed.json()).schemas.length,1);
|
|
const referenced=await post('/api/v1/tasks',{schemaId:saved.id,text:'snapshot'});assert.equal(referenced.status,201);const snapshot=await referenced.json();
|
|
const updated=await fetch(base+'/api/v1/schemas/'+saved.id,{method:'PUT',headers:{...auth,'Content-Type':'application/json'},body:JSON.stringify({name:'Updated',fields:[{name:'total',type:'number',description:'金额'}]})});assert.equal((await updated.json()).version,2);
|
|
const unchanged=await fetch(base+snapshot.links.schema,{headers:auth});assert.deepEqual((await unchanged.json()).fields,fields);
|
|
assert.equal((await post('/api/v1/tasks',{schemaId:saved.id,fields,text:'bad'})).status,400);
|
|
assert.equal((await post('/api/v1/schemas',{name:'bad',fields:[]})).status,400);
|
|
assert.equal((await fetch(base+'/api/v1/schemas/invalid',{headers:auth})).status,404);
|
|
assert.equal((await fetch(base+'/pdfjs/pdf.worker.min.mjs')).status,200);
|
|
|
|
const created=await post('/api/v1/tasks',{fields,text:'测试文档',title:'T'.repeat(150)});assert.equal(created.status,201);const task=await created.json();assert.equal(task.title.length,120);
|
|
const get=url=>fetch(base+url,{headers:auth});
|
|
assert.deepEqual((await (await get(task.links.schema)).json()).fields,fields);
|
|
assert.equal(await (await get(task.links.document)).text(),'测试文档');
|
|
assert.ok((await (await get(task.links.instructions)).text()).includes(task.id));
|
|
assert.equal((await get(task.links.result)).status,202);
|
|
assert.equal((await post(task.links.result,{data:{name:42,items:[]}})).status,400);
|
|
assert.equal((await post(task.links.result,{data:{name:null,items:[]},tables:[{name:'x',columns:['a'],rows:[[{},2]]}]})).status,400);
|
|
const submitted=await post(task.links.result,{data:{name:'测试',items:[{value:7}]}});assert.equal(submitted.status,200);const result=await submitted.json();assert.equal(result.tables.length,2);
|
|
assert.equal((await (await get(task.links.schema)).json()).status,'completed');
|
|
assert.deepEqual((await (await get(task.links.result)).json()).data,{name:'测试',items:[{value:7}]});
|
|
const form=new FormData();form.append('fields',JSON.stringify(fields));form.append('file',new Blob(['%PDF-1.4\nAPI transport fixture'],{type:'application/pdf'}),'fixture.pdf');const upload=await fetch(base+'/api/v1/tasks',{method:'POST',headers:auth,body:form});assert.equal(upload.status,201);const pdf=await upload.json();assert.equal(await(await get(pdf.links.document)).text(),'%PDF-1.4\nAPI transport fixture');
|
|
assert.equal((await get('/api/v1/tasks/not-a-valid-id')).status,404);
|
|
console.log('PASS: page, authentication, task creation, schema, document download, Markdown, pending result, validation, table generation, result persistence, PDF transport, invalid ID. Schema CRUD, schema reference and immutable snapshots, PDF worker assets. No model used.');
|
|
}finally{server.kill('SIGTERM');await new Promise(r=>server.once('exit',r));await rm(dataDir,{recursive:true,force:true});}
|