Files
StarPilot/openpilot/starpilot/galaxy/tests/test_settings_defaults.mjs
T
Prabhaav Pillai c532223fa0 Restore V-Adj Spot Monitoring warnings and polish Galaxy settings, cameras, and updates
Bundle the verified VASM model, enable it at startup, and split VASM and vision speed-sign inference across little cores when both are active.
Restore VASM warnings in PiP activation, red outlines, and onroad blind-spot borders, including expanded Android Auto views.
Improve cabin snapshots with longer warm-up, adjusted capture timeouts, a fresh preview frame, and clearer capture buttons and save prompts.
Polish Galaxy settings with dimmed gated controls and icons, clearer vehicle fingerprinting and steering availability descriptions, rounded speed-offset ranges, and immediate refresh after saving.
Improve updater startup messages and preserve update/reconnect screens across service interruptions and restarts.
Add regression tests for the updated behavior.
2026-10-19 23:07:19 -04:00

77 lines
4.8 KiB
JavaScript

import assert from "node:assert/strict"
import { SettingsFeed } from "../web/js/settings.js"
import { GalaxySettingRow } from "../web/js/galaxy-setting-row.js"
import { compile } from "../web/vendor/vue/vue.esm-browser.js"
const requests = [], updates = []
const flush = async () => { for (let i = 0; i < 12; i++) await Promise.resolve() }
const feed = new SettingsFeed({ publish: state => updates.push(state), later: () => 1, cancelTimer: () => {},
fetcher: (url, options) => new Promise(resolve => requests.push({ url, options, resolve })) })
async function reply(index, body, status = 200) {
requests[index].resolve({ ok: status === 200, status, json: async () => body }); await flush()
}
const row = { label: "Use StarPilot Widgets", value: "Off", defaultValue: "On", resetAvailable: true,
choices: ["Off", "On"], page: "", available: true, action: true, revision: "same-settings" }
const page = { page: "appearance", parked: true, view: "opaque-view", rows: [row] }
feed.start("appearance")
await reply(0, page)
feed.resetDefault(0)
assert.equal(requests[1].url, "./api/settings/reset-default")
assert.deepEqual(JSON.parse(requests[1].options.body), { view: "opaque-view", row: 0 })
await reply(1, { intent: "reset-intent", question: "Reset to default?", proposed: "On" })
assert.equal(updates.at(-1).pending, null, "defaults never display a per-setting confirmation")
assert.equal(requests[2].url, "./api/settings/confirm")
assert.deepEqual(JSON.parse(requests[2].options.body), { intent: "reset-intent", confirmed: true, page: "appearance" })
await reply(2, { saved: true })
await reply(3, { ...page, view: "fresh", rows: [{ ...row, value: "On", resetAvailable: false }] })
feed.resetDefault(0)
assert.equal(requests.length, 4, "an unavailable default cannot be submitted")
feed.stop()
assert.ok(GalaxySettingRow.emits.includes("reset-default"))
const renderTemplate = compile(GalaxySettingRow.template, { decodeEntities: raw => raw })
const rowContext = context => ({ ...context, presentedRow: GalaxySettingRow.computed.presentedRow.call(context) })
const render = (context, cache) => renderTemplate(rowContext(context), cache)
function buttons(node) {
if (!node || typeof node !== "object") return []
return [...(node.type === "button" ? [node] : []), ...(Array.isArray(node.children) ? node.children.flatMap(buttons) : [])]
}
const context = { row, index: 2, control: "switch", currentValue: "Off", dimmed: false, locked: false, busy: false, updating: false,
showDefault: true, onSwitch: () => {}, $emit: (...args) => events.push(args) }
const events = []
const button = buttons(render(context, [])).find(node => node.children === "Default")
assert.ok(button, "the button is actually rendered for a setting with a default")
assert.equal(button.props.disabled, false)
assert.equal(button.props["aria-label"], "Reset Use StarPilot Widgets to default")
button.props.onClick()
assert.deepEqual(events, [["reset-default", 2]])
const savingRow = render({ ...context, locked: true, busy: true }, [])
assert.equal(savingRow.props.inert, true, "saving blocks interaction without dimming controls")
assert.equal(buttons(savingRow).find(node => node.children === "Default").props.disabled, false)
assert.equal(buttons(render({ ...context, dimmed: true }, [])).find(node => node.children === "Default").props.disabled, true)
assert.equal(buttons(render({ ...context, row: { ...row, defaultValue: null }, showDefault: false }, [])).some(node => node.children === "Default"), false)
// A successful mutation invalidates every active consumer without user refreshes.
let savedValue = "Off"
const dependent = []
const sharedFetcher = async (url) => ({ ok: true, status: 200, json: async () => {
if (url.endsWith("/reset-default")) return { intent: "shared-default" }
if (url.endsWith("/confirm")) { savedValue = "On"; return { saved: true } }
const pageName = url.split("/").at(-1)
return { page: pageName, view: pageName + savedValue, parked: true, rows: [{ ...row, value: savedValue }] }
} })
const source = new SettingsFeed({ publish() {}, fetcher: sharedFetcher, later: () => 1, cancelTimer() {} })
const consumer = new SettingsFeed({ publish: value => dependent.push(value), fetcher: sharedFetcher, later: () => 1, cancelTimer() {} })
await source.start("appearance")
await consumer.start("pip")
await source.resetDefault(0)
await flush()
assert.equal(dependent.at(-1).data.rows[0].value, "On")
source.stop()
consumer.stop()
assert.equal(GalaxySettingRow.computed.showDefault.call(rowContext({ row })), true)
assert.equal(GalaxySettingRow.computed.showDefault.call(rowContext({ row: { ...row, value: 'On' } })), false)
assert.equal(GalaxySettingRow.computed.showDefault.call(rowContext({ row: { ...row, value: '0.9', defaultValue: '0.90' } })), false)
assert.equal(buttons(render({ ...context, showDefault: false }, [])).some(node => node.children === 'Default'), false)