Files
sausage/userland/web/browser-check.mjs
T

45 lines
3.1 KiB
JavaScript

// Manual check: run against a fresh world on localhost:8080. Requires agent-browser and Chrome.
// Set AGENT_BROWSER_EXECUTABLE_PATH if Chrome is not available at the default path.
import {execFileSync} from 'node:child_process';
import assert from 'node:assert/strict';
const session='sausage-credential-ui-check';
const browser=(...args)=>execFileSync('agent-browser',['--session',session,...args],{encoding:'utf8'}).trim();
let socket;
try{
console.log(browser('open','http://localhost:8080/'));
socket=new WebSocket(browser('get','cdp-url'));
await new Promise((resolve,reject)=>{socket.onopen=resolve;socket.onerror=reject;});
let next=0;
const pending=new Map();
socket.onmessage=event=>{const message=JSON.parse(event.data);const promise=pending.get(message.id);if(promise){pending.delete(message.id);message.error?promise.reject(new Error(JSON.stringify(message.error))):promise.resolve(message.result);}};
const cdp=(method,params={},sessionId)=>new Promise((resolve,reject)=>{const id=++next;pending.set(id,{resolve,reject});socket.send(JSON.stringify({id,method,params,sessionId}));});
const {targetInfos}=await cdp('Target.getTargets');
const page=targetInfos.find(target=>target.type==='page'&&target.url==='http://localhost:8080/');
assert.ok(page,'Chat tab exists');
const {sessionId}=await cdp('Target.attachToTarget',{targetId:page.targetId,flatten:true});
await cdp('WebAuthn.enable',{},sessionId);
await cdp('WebAuthn.addVirtualAuthenticator',{options:{protocol:'ctap2',transport:'internal',hasResidentKey:true,hasUserVerification:true,isUserVerified:true,automaticPresenceSimulation:true}},sessionId);
browser('wait','#credential-notice:not([hidden])');
browser('click','#register-first');
browser('wait','input[name=label]');
browser('fill','input[name=label]','Browser check');
browser('click','#credential-view form button');
browser('wait','--text','Complete.');
const name='Browser check '+Date.now();
const filed=await fetch('http://localhost:8080/api/cred/requests',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({kind:'edit',key:name,request:{item:null,base_version:null,change:[{op:'create_item',config:{name,rules:[],transform_js:'',fields:[]}}]}})});
assert.equal(filed.status,200);
const {request}=await filed.json();
browser('click','#credential-close');
browser('wait',`#approvals a[href="/#approve/${request}"]`);
browser('click',`#approvals a[href="/#approve/${request}"]`);
browser('wait','#credential-view button[value=approve]');
browser('click','#credential-view button[value=approve]');
browser('wait','--text','Complete.');
const record=await (await fetch('http://localhost:8080/api/cred/requests/'+request)).json();
assert.equal(record.state,'approved');
const items=await (await fetch('http://localhost:8080/api/cred/items')).json();
assert.ok(items.some(item=>item.name===name));
console.log('PASS: first registration, passkey approval, approved request, and created item.');
console.log(browser('screenshot','/tmp/sausage-credential-check.png'));
}finally{socket?.close();browser('close');}