34 lines
2.1 KiB
JavaScript
34 lines
2.1 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import {readFileSync} from 'node:fs';
|
|
const base=process.env.TEST_PANEL_URL;
|
|
assert.ok(base && process.env.TEST_PASSWORD_FILE);
|
|
let csrf='',cookie='';
|
|
async function req(path,method='GET',body){
|
|
const r=await fetch(base+path,{method,headers:{Cookie:cookie,Origin:base,'Content-Type':'application/json','X-CSRF-Token':csrf},body:body===undefined?undefined:JSON.stringify(body)});
|
|
if(path==='/api/login')cookie=r.headers.getSetCookie().map(v=>v.split(';')[0]).join('; ');
|
|
return {status:r.status,data:await r.json()};
|
|
}
|
|
const login=await req('/api/login','POST',{username:'admin',password:readFileSync(process.env.TEST_PASSWORD_FILE,'utf8').trim()});
|
|
assert.equal(login.status,200);csrf=login.data.csrf_token;
|
|
const before=(await req('/api/instances')).data;assert.equal(before.length,1,'run with exactly one retained test instance');
|
|
const intent=await req('/api/intents','POST',{name:'Design real intent',version:'0.2.0-rc.2'});assert.equal(intent.status,202);
|
|
let created;
|
|
try {
|
|
for(let n=0;n<60;n++){
|
|
const item=(await req('/api/intents')).data.find(x=>x.id===intent.data.id);
|
|
assert.notEqual(item.status,'failed');
|
|
if(item.instance_id){created=item.instance_id;break;}
|
|
await new Promise(r=>setTimeout(r,1000));
|
|
}
|
|
assert.ok(created,'intent must create a real instance');
|
|
const list=(await req('/api/instances')).data;assert.equal(list.length,2);assert.ok(list.every(i=>i.status==='running'));
|
|
const extra=await req('/api/instances','POST',{name:'must reject third',image_id:list[0].image_id});assert.equal(extra.status,409);
|
|
assert.equal((await req('/api/intents','POST',{name:'must reject extra reservation',version:'0.2.0-rc.2'})).status,409);
|
|
console.log('PASS persisted intent -> real runtime; two running instances; third create and reservation rejected');
|
|
} finally {
|
|
if(created)assert.equal((await req('/api/instances/'+created,'DELETE')).status,200);
|
|
else await req('/api/intents/'+intent.data.id,'DELETE');
|
|
}
|
|
assert.equal((await req('/api/instances')).data.length,1);
|
|
console.log('PASS deleted only this test runtime, retained data and prior instance');
|