test(e2e): event log entries + restart persistence
smoke: jump (shared helper) + scan, then assert both events are in GET /api/events with the newer one first, and that the EVENT LOG terminal renders both T<turn> // <MESSAGE> lines. Idempotent across retries — asserts on this run's own entries by turn/message, never absolute counts. state: the latest five log lines come back identical (ids included) after the mid-run container restart.
This commit is contained in:
@@ -17,6 +17,7 @@ interface ShipSystemDto { id: number; type: string; level: number; capacity: num
|
||||
interface ShipState { systems: ShipSystemDto[]; inventory: { kind: string; name: string; qty: number }[]; turn: number }
|
||||
interface TechDto { id: number; slug: string; name: string; costKind: string; costQty: number; prereqs: string[]; effect: string; state: string; missingPrereqs: string[] }
|
||||
interface MissionDto { id: number; type: string; description: string; targetSystemId: number | null; conditionKind: string | null; progressTarget: number; progress: number; rewardKind: string; rewardQty: number; state: string }
|
||||
interface EventDto { id: number; turn: number; type: string; message: string; createdAt: string }
|
||||
|
||||
test('app survives a container restart (stack + volume persistence)', async ({ page }) => {
|
||||
test.setTimeout(180_000);
|
||||
@@ -59,6 +60,11 @@ test('app survives a container restart (stack + volume persistence)', async ({ p
|
||||
const missionsBefore = (await (await page.request.get('/api/missions')).json()) as MissionDto[];
|
||||
expect(missionsBefore.length).toBeGreaterThan(0); // the board is always seeded on new game
|
||||
|
||||
// Event log baseline: append-only, and nothing writes between this snapshot and the restart — so the
|
||||
// latest lines must come back byte-identical (ids included) after it.
|
||||
const eventsBefore = (await (await page.request.get('/api/events?limit=5')).json()) as EventDto[];
|
||||
expect(eventsBefore.length).toBeGreaterThan(0);
|
||||
|
||||
// Restart the app container mid-run — the named DB volume must survive it.
|
||||
execSync(`docker compose ${composeArgs} restart space-wanderer`, { cwd: repoRoot, stdio: 'pipe' });
|
||||
|
||||
@@ -105,6 +111,10 @@ test('app survives a container restart (stack + volume persistence)', async ({ p
|
||||
const missionsAfter = (await (await page.request.get('/api/missions')).json()) as MissionDto[];
|
||||
expect(missionsAfter).toEqual(missionsBefore);
|
||||
|
||||
// Event log survived too: same latest lines, in the same order.
|
||||
const eventsAfter = (await (await page.request.get('/api/events?limit=5')).json()) as EventDto[];
|
||||
expect(eventsAfter).toEqual(eventsBefore);
|
||||
|
||||
// The page itself serves again with the landing title.
|
||||
await page.goto('/');
|
||||
await expect(page.getByRole('heading', { name: 'SpaceWanderer' })).toBeVisible();
|
||||
|
||||
Reference in New Issue
Block a user