Auto-refuel on dispatch; remove manual refueling UI/API/action (ISS-082, v0.42.0)
CI / build + unit + e2e (pull_request) Successful in 17m25s

This commit is contained in:
2026-09-21 15:19:39 +00:00
parent b2d03846f5
commit 64da8e67bf
28 changed files with 479 additions and 1008 deletions
+15 -9
View File
@@ -15,6 +15,7 @@ const QUEUE = 'EHAM'; // Amsterdam — a third airport, distinct from hub and de
interface PlaneState {
id: string;
status: 'available' | 'flying';
maxFuel: number;
locationIcao: string;
destIcao: string | null;
queue: string[];
@@ -69,6 +70,14 @@ async function createPackage(page: Page, fromIcao: string, toIcao: string): Prom
return (await created.json()) as PackageState;
}
// Test hook (FLIGHT_TEST_HOOKS=1): top the starter's tank back to full — replaces the removed /refuel
// endpoint (ISS-082). Reads maxFuel from the snapshot so no catalog mirror is needed.
async function setFuelFull(page: Page, planeId: string): Promise<void> {
const s = await getState(page);
const p = s.planes.find((x) => x.id === planeId)!;
expect((await page.request.post('/api/test/set-fuel', { data: { planeId, fuel: p.maxFuel } })).status()).toBe(200);
}
// Self-heal: let any in-flight leg finish, reposition plane-starter home via the API, and abandon
// leftover cargo so every test starts from the canonical state even after an interrupted run.
async function flyHomeViaApi(page: Page): Promise<void> {
@@ -201,9 +210,8 @@ test('queue display + cancel via UI (ISS-043 part 2)', async ({ page }) => {
test.setTimeout(300_000); // self-heal can take minutes after an interrupted run
await flyHomeViaApi(page); // deterministic: the starter sits grounded at EDDF
// Full tank before departure — keeps the long EDDF→LEMD leg fuel-feasible (same as tests 2 & 3).
const refuel = await page.request.post('/api/planes/plane-starter/refuel');
expect(refuel.status()).toBe(200);
// Full tank before departure — deterministic baseline (ISS-082 hook; dispatch would auto-refuel anyway).
await setFuelFull(page, 'plane-starter');
const pkg = await createPackage(page, HUB, DEST);
@@ -272,9 +280,8 @@ test('dotted queue line renders the queued path on the map (ISS-043 part 2)', as
test.setTimeout(300_000); // self-heal + one flight at scale 1000 + fly-home cleanup
await flyHomeViaApi(page);
// Full tank before departure — keeps the state canonical for whatever the cleanup does.
const refuel = await page.request.post('/api/planes/plane-starter/refuel');
expect(refuel.status()).toBe(200);
// Full tank before departure — keeps the state canonical for whatever the cleanup does (ISS-082 hook).
await setFuelFull(page, 'plane-starter');
// Load + queue + fly via the API: a package EDDF→LEMD, one queued leg LEMD→EHAM (works while
// grounded — part 1), then start leg 1. The dotted line must show ONLY dest → queue[0].
@@ -412,9 +419,8 @@ test('landing auto-starts the next queued leg (ISS-043 chain end-to-end)', async
test.setTimeout(300_000); // self-heal + two chained legs at scale 1000
await flyHomeViaApi(page);
// Full tank so fuel covers the chained return leg (same feasibility rule as /fly).
const refuel = await page.request.post('/api/planes/plane-starter/refuel');
expect(refuel.status()).toBe(200);
// Full tank for a deterministic baseline — the engine auto-chains (and auto-refuels, ISS-082) the return leg regardless.
await setFuelFull(page, 'plane-starter');
// Package EDDF→LEMD + a queued return leg LEMD→EDDF, then start leg 1.
const pkg = await createPackage(page, HUB, DEST);