Connect policy-gated browser review and audit runtime
Assistant: codex Assistant-Model: gpt-6-astra Assistant-Session: 01a07ff8-19d0-7820-b4d0-1353833cb7fc
This commit is contained in:
parent
2cc32168ac
commit
83849b75d4
35 changed files with 2381 additions and 83 deletions
117
tests/browser_review.mjs
Normal file
117
tests/browser_review.mjs
Normal file
|
|
@ -0,0 +1,117 @@
|
|||
// Automated browser contract exercise. All identities and grants are synthetic.
|
||||
import assert from 'node:assert/strict';
|
||||
import fs from 'node:fs/promises';
|
||||
import path from 'node:path';
|
||||
import {createRequire} from 'node:module';
|
||||
const require=createRequire(import.meta.url);
|
||||
const {chromium}=require(process.env.INFD_PLAYWRIGHT_PACKAGE || 'playwright');
|
||||
const directory=process.argv[2];
|
||||
const fixture=JSON.parse(await fs.readFile(path.join(directory,'server.json'),'utf8'));
|
||||
const checks=[];
|
||||
const browser=await chromium.launch({headless:true,executablePath:process.env.INFD_CHROMIUM_EXECUTABLE,args:[
|
||||
'--no-proxy-server',
|
||||
'--host-resolver-rules=MAP decisions.coulomb.social 127.0.0.1, MAP keycape.test 127.0.0.1',
|
||||
'--ignore-certificate-errors-spki-list='+fixture.certificate_spki
|
||||
]});
|
||||
const context=await browser.newContext({viewport:{width:1360,height:1000},acceptDownloads:true});
|
||||
const errors=[];
|
||||
const navigation=[];
|
||||
const formOrigins=[];
|
||||
try {
|
||||
// Both test names resolve to the disposable HTTPS server. All redirects,
|
||||
// browser cookies and form Origins travel through real HTTP/TLS. Only this
|
||||
// fixture certificate's public key is trusted by the browser override.
|
||||
const page=await context.newPage();page.setDefaultTimeout(10000);
|
||||
page.on('pageerror',error=>errors.push(String(error)));
|
||||
page.on('request',request=>{if(request.method()==='POST')formOrigins.push({
|
||||
path:new URL(request.url()).pathname,origin:request.headers().origin || null});});
|
||||
page.on('response',response=>navigation.push({path:new URL(response.url()).pathname,status:response.status()}));
|
||||
page.on('dialog',async dialog=>{errors.push('Unexpected script dialog');await dialog.dismiss();});
|
||||
await page.goto(fixture.public_origin+'/');
|
||||
await page.getByRole('link',{name:'Sign in with KeyCape'}).click();
|
||||
await page.getByRole('heading',{name:'Open a decision review'}).waitFor({timeout:10000});
|
||||
const cookies=await context.cookies();
|
||||
const session=cookies.find(c=>c.name==='__Host-infd-session');
|
||||
assert(session?.secure && session?.httpOnly && session?.sameSite==='Lax');
|
||||
checks.push('PKCE callback and secure browser session');
|
||||
await page.getByLabel('Memo identifier').fill(fixture.memo_id);
|
||||
await page.getByRole('button',{name:'Open review',exact:true}).click();
|
||||
await page.getByRole('heading',{name:'The request',exact:true}).waitFor();
|
||||
const accept=()=>page.getByRole('button',{name:'Accept the complete request',exact:true});
|
||||
assert(await accept().isDisabled());
|
||||
assert.equal(await page.locator('img,script').count(),0);
|
||||
await page.screenshot({path:path.join(directory,'review-desktop.png'),fullPage:true});
|
||||
checks.push('Entitled page escapes memo and packet markup');
|
||||
await accept().evaluate(button=>button.disabled=false);
|
||||
await accept().click();
|
||||
await page.getByText('Record all required highlight acknowledgments before accepting or declining.').waitFor();
|
||||
let state=await (await fetch(fixture.origin+'/_fixture/status')).json();
|
||||
assert.equal(state.entries,0);assert.equal(state.entry_posts,0);
|
||||
checks.push('Server refuses bypass of missing acknowledgments');
|
||||
await page.goBack();
|
||||
await page.getByLabel('I have reviewed this highlight').check();
|
||||
await page.getByRole('button',{name:'Record acknowledgments',exact:true}).click();
|
||||
assert(await accept().isEnabled());
|
||||
checks.push('Explicit acknowledgment unlocks the form');
|
||||
await page.locator('summary').filter({hasText:'Whole fixture document'}).click();
|
||||
const [download]=await Promise.all([
|
||||
page.waitForEvent('download'),page.getByRole('link',{name:'Download complete document',exact:true}).click()
|
||||
]);
|
||||
const bytes=await fs.readFile(await download.path());
|
||||
assert(bytes.includes(Buffer.from('Full fixture terms.')));
|
||||
checks.push('Complete attachment download stays behind entitlement');
|
||||
await page.locator('summary').filter({hasText:'Return for improvement'}).click();
|
||||
const returned=page.locator('form').filter({has:page.locator('select[name="reason"]')});
|
||||
await returned.locator('select').selectOption('clarification_needed');
|
||||
await returned.locator('textarea').fill('Synthetic browser return: clarify the fixture scope.');
|
||||
await returned.getByRole('button',{name:'Return for improvement',exact:true}).click();
|
||||
await page.getByText('Synthetic browser return: clarify the fixture scope.').waitFor();
|
||||
state=await (await fetch(fixture.origin+'/_fixture/status')).json();assert.equal(state.entries,0);
|
||||
checks.push('Return records a memo response without an engine entry');
|
||||
await page.setViewportSize({width:390,height:844});
|
||||
assert(await page.evaluate(()=>document.documentElement.scrollWidth<=innerWidth+1));
|
||||
await page.screenshot({path:path.join(directory,'review-mobile.png'),fullPage:true});
|
||||
checks.push('Mobile review fits the viewport');
|
||||
await page.setViewportSize({width:1360,height:1000});
|
||||
await accept().click();
|
||||
await page.getByText('Approval entry recorded.',{exact:true}).waitFor();
|
||||
assert.equal(await page.getByRole('button',{name:'Accept the complete request',exact:true}).count(),0);
|
||||
await page.screenshot({path:path.join(directory,'recorded-desktop.png'),fullPage:true});
|
||||
await page.reload();await page.getByText('Approval entry recorded.',{exact:true}).waitFor();
|
||||
state=await (await fetch(fixture.origin+'/_fixture/status')).json();
|
||||
assert.equal(state.entries,1);assert.equal(state.entry_posts,1);assert.equal(state.consume_calls,0);
|
||||
assert(state.outbox_states.every(s=>s==='delivered'));
|
||||
assert(state.decision_attributable.every(value=>value===0));
|
||||
checks.push('One actual approval entry, stable on browser reload');
|
||||
checks.push('Audit receiver holds all commitments; unsigned decision gap retained');
|
||||
await fetch(fixture.origin+'/_fixture/refuse-caller');
|
||||
await page.reload();await page.getByRole('heading',{name:'Review unavailable'}).waitFor();
|
||||
assert(!(await page.content()).includes('private-brief-sentinel'));
|
||||
state=await (await fetch(fixture.origin+'/_fixture/status')).json();
|
||||
assert.equal(state.policy_outcomes.at(-1),'caller_refused');assert.equal(state.entries,1);
|
||||
checks.push('Real workload caller refusal hides review content');
|
||||
await page.goto(fixture.public_origin+'/');
|
||||
await page.getByRole('button',{name:'Sign out',exact:true}).click();
|
||||
await page.getByRole('link',{name:'Sign in with KeyCape'}).waitFor();
|
||||
assert(!(await context.cookies()).some(c=>c.name==='__Host-infd-session'));
|
||||
assert(formOrigins.every(form=>form.origin===fixture.public_origin));
|
||||
checks.push('Sign-out clears the session; all forms carry the exact origin');
|
||||
assert.deepEqual(errors,[]);
|
||||
checks.push('No page errors or injected script execution');
|
||||
const receipt={fixture_only:true,browser:'Chromium',checks_passed:checks.length,checks,
|
||||
fixture_transport:'real HTTPS on ephemeral ports; synthetic issuer and TokenReview',
|
||||
native_human_login_proven:false,native_policy_admitted:false,factory_attempts:0,paid_model_calls:0,
|
||||
final_component_state:state};
|
||||
await fs.writeFile(path.join(directory,'browser-result.json'),JSON.stringify(receipt,null,2)+'\n');
|
||||
process.stdout.write(JSON.stringify({checks_passed:checks.length,entries:state.entries,entry_posts:state.entry_posts,fixture_only:true})+'\n');
|
||||
} finally {
|
||||
if(checks.length<12 && context.pages()[0]) {
|
||||
const page=context.pages()[0], url=new URL(page.url());
|
||||
await fs.writeFile(path.join(directory,'browser-debug.json'),JSON.stringify({
|
||||
path:url.pathname,body:await page.locator('body').innerText(),navigation,formOrigins,
|
||||
cookie_names:(await context.cookies()).map(c=>c.name),errors},null,2));
|
||||
await page.screenshot({path:path.join(directory,'browser-debug.png'),fullPage:true});
|
||||
}
|
||||
await browser.close();
|
||||
await fetch(fixture.origin+'/_fixture/stop').catch(()=>{});
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue