27 lines
1.6 KiB
JavaScript
27 lines
1.6 KiB
JavaScript
|
|
import assert from 'node:assert/strict'
|
||
|
|
import { readFileSync } from 'node:fs'
|
||
|
|
import test from 'node:test'
|
||
|
|
|
||
|
|
const read = (path) => readFileSync(new URL(`../${path}`, import.meta.url), 'utf8')
|
||
|
|
const contract = JSON.parse(read('contracts/human-authorization.json'))
|
||
|
|
const webview = JSON.parse(read('contracts/numbered-ipc-registry.json'))
|
||
|
|
const broker = JSON.parse(read('contracts/direct-local-broker-numbered-registry.json'))
|
||
|
|
|
||
|
|
test('human authorization is a durable numbered state machine rather than a UI-only button', () => {
|
||
|
|
assert.equal(contract.state, 'NATIVE_FAIL_CLOSED')
|
||
|
|
assert.deepEqual(contract.lifecycle, ['PENDING_HUMAN', 'APPROVED', 'DENIED', 'EXPIRED', 'CONSUMED'])
|
||
|
|
assert.equal(contract.destructive_purge.enabled, false)
|
||
|
|
assert.equal(contract.ticket.single_use, true)
|
||
|
|
assert.equal(contract.ticket.requester_session_bound, true)
|
||
|
|
assert.equal(contract.invariants.proposal_is_not_authorization, true)
|
||
|
|
assert.equal(contract.invariants.approval_is_not_execution, true)
|
||
|
|
})
|
||
|
|
|
||
|
|
test('the human client and external execution carrier meet through distinct exact numbered routes', () => {
|
||
|
|
const webviewNumbers = new Set(webview.operations.map((item) => item.operation_number))
|
||
|
|
const brokerNumbers = new Set(broker.operations.map((item) => item.operation_number))
|
||
|
|
assert.ok(contract.routes.human_client.every((number) => webviewNumbers.has(number)))
|
||
|
|
assert.ok(contract.routes.external_execution_carrier.every((number) => brokerNumbers.has(number)))
|
||
|
|
const decisions = webview.operations.filter((item) => contract.routes.human_client.includes(item.operation_number))
|
||
|
|
assert.ok(decisions.every((item) => item.admission === 'VERIFIED_HUMAN_ROUTE'))
|
||
|
|
})
|