Files
StarPilot/openpilot/starpilot/galaxy/tests/test_drive_state.mjs
T
2026-10-22 10:52:58 -05:00

52 lines
3.2 KiB
JavaScript

import assert from 'node:assert/strict'
import { DriveStatePanel, validDriveState } from '../web/js/drive-state.js'
const snapshot=(mode='auto',revision='a'.repeat(32))=>({mode,revision,available:true,effective:'offroad',overrideAllowed:true})
const response=(value,status=200)=>({ok:status===200,json:async()=>value})
const flush=async()=>{for(let i=0;i<10;i++)await Promise.resolve()}
assert(validDriveState(snapshot()))
assert(!validDriveState({...snapshot(),mode:'driving'}))
assert(!validDriveState({...snapshot(),effective:'driving'}))
const requests=[]
globalThis.fetch=(url,options)=>new Promise(resolve=>requests.push({url,options,resolve}))
function panel(){const value={...DriveStatePanel.data(),active:true,generation:0};for(const [key,fn] of Object.entries(DriveStatePanel.methods))value[key]=fn.bind(value);return value}
const value=panel();value.state=snapshot()
const old=value.load();assert.equal(requests.length,1)
const changed=value.change('onroad');assert.equal(requests.length,2)
assert.deepEqual(JSON.parse(requests[1].options.body),{mode:'onroad',revision:'a'.repeat(32)})
assert.equal(requests[0].options.signal.aborted,true)
requests[1].resolve(response(snapshot('onroad','b'.repeat(32))));await flush()
assert.equal(value.state.mode,'onroad');assert.equal(requests.length,3)
requests[0].resolve(response(snapshot('offroad','c'.repeat(32))));await old
assert.equal(value.state.mode,'onroad')
requests[2].resolve(response(snapshot('onroad','b'.repeat(32))));await changed;await flush()
const pending=value.load();const last=requests.at(-1)
DriveStatePanel.beforeUnmount.call(value)
assert.equal(last.options.signal.aborted,true)
last.resolve(response(snapshot('offroad')));await pending
assert.equal(value.state.mode,'onroad')
const denied=panel();const loading=denied.load();requests.at(-1).resolve(response({error:'Sign in to Galaxy'},401));await loading
assert.equal(denied.state,null)
assert.equal(denied.error,'Drive state unavailable')
console.log('PASS: strict status; captured revision; aborted/out-of-order status; requested versus effective; unmount; unauthorized state')
const onroad=panel();onroad.state={...snapshot(),effective:'onroad',overrideAllowed:false}
let before=requests.length
const forceOffroad=onroad.change('offroad')
assert.equal(requests.length,before+1)
assert.equal(JSON.parse(requests.at(-1).options.body).mode,'offroad')
requests.at(-1).resolve(response({error:'Park the vehicle'},409));await flush()
requests.at(-1).resolve(response(snapshot()));await forceOffroad;await flush()
assert.match(DriveStatePanel.template,/role="switch"/)
before=requests.length
// A missing parked admission must not disable Galaxy Force Onroad.
onroad.state.overrideAllowed=false
const forceOnroad=onroad.change('onroad')
assert.equal(requests.length,before+1)
assert.deepEqual(JSON.parse(requests.at(-1).options.body),{mode:'onroad',revision:'a'.repeat(32)})
const live={...snapshot('onroad','d'.repeat(32)),effective:'onroad',overrideAllowed:false}
requests.at(-1).resolve(response(live));await flush()
requests.at(-1).resolve(response(live));await forceOnroad;await flush()
assert.equal(onroad.state.mode,'onroad')
assert.equal(DriveStatePanel.computed.pending.call(onroad),false)
console.log('PASS: Galaxy Offroad dispatch uses server admission; Force Onroad remains available')