This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
import { expect, it, vi } from 'vitest';
|
||||
import { render } from 'svelte/server';
|
||||
import { writable } from 'svelte/store';
|
||||
import type { ComponentProps } from 'svelte';
|
||||
import Page from '../../src/routes/+page.svelte';
|
||||
import { syncServerTime } from '../../src/lib/ui/stores/servers.js';
|
||||
import type { FleetServer } from '../../src/lib/fleet-overview.js';
|
||||
|
||||
vi.mock('$app/navigation', () => ({
|
||||
afterNavigate: vi.fn(),
|
||||
replaceState: vi.fn(),
|
||||
goto: vi.fn(),
|
||||
beforeNavigate: vi.fn()
|
||||
}));
|
||||
vi.mock('$app/stores', () => ({
|
||||
page: writable({ url: new URL('http://localhost/'), data: { user: { role: 'viewer' } } })
|
||||
}));
|
||||
|
||||
const now = Date.parse('2026-10-19T22:46:00.000Z');
|
||||
const healthAt = new Date(now - 8000).toISOString();
|
||||
const failedAt = '2026-10-19T18:48:42.000Z';
|
||||
const server: FleetServer = {
|
||||
name: 't5_zombie_sumpf_1',
|
||||
game: 't5',
|
||||
map: 'zombie_sumpf',
|
||||
last_map: 'zombie_sumpf',
|
||||
last_players: 0,
|
||||
last_gametype: 'zom',
|
||||
last_seen_at: healthAt,
|
||||
last_checked_at: healthAt,
|
||||
container_state: 'running',
|
||||
container_checked_at: healthAt,
|
||||
last_error: null,
|
||||
roster: [],
|
||||
health: 'online',
|
||||
held: [],
|
||||
active_since: null,
|
||||
inactive_since: null,
|
||||
game_started_at: null,
|
||||
game_ended_at: null
|
||||
};
|
||||
|
||||
it.each([true, false])(
|
||||
'dates the displayed attention reason when the server is healthy=%s',
|
||||
(healthy) => {
|
||||
syncServerTime(now);
|
||||
const data = {
|
||||
user: null,
|
||||
setupRequired: false,
|
||||
fleetSnapshot: {
|
||||
serverNow: now,
|
||||
hostAttention: 0,
|
||||
reservedNames: [],
|
||||
servers: [
|
||||
healthy ? server : { ...server, health: 'offline', container_state: 'stopped' }
|
||||
],
|
||||
integrations: {
|
||||
native: true,
|
||||
hostsReady: 1,
|
||||
hostsTotal: 1,
|
||||
rcon: true,
|
||||
rconTimeoutMs: 2000,
|
||||
defaultRconHost: 'localhost'
|
||||
},
|
||||
operations: [
|
||||
{
|
||||
key: 'campaign:one',
|
||||
group: 'campaign:one',
|
||||
kind: 'campaign',
|
||||
server: server.name,
|
||||
label: 'Update needs attention',
|
||||
detail: 'Download timed out',
|
||||
href: '/campaigns/one',
|
||||
state: 'attention',
|
||||
startedAt: '2026-10-19T18:38:00.000Z',
|
||||
evidenceAt: failedAt
|
||||
}
|
||||
]
|
||||
}
|
||||
// Rendering needs the public Fleet fields, without the registry's storage metadata.
|
||||
} as unknown as ComponentProps<typeof Page>['data'];
|
||||
const body = render(Page, { props: { data } }).body;
|
||||
const evidence = body.match(/class="evidence-time[^"]*" title="([^"]+)"/)?.[1];
|
||||
expect(evidence).toBe(healthy ? failedAt : healthAt);
|
||||
if (healthy) {
|
||||
expect(body).toContain('Update needs attention');
|
||||
expect(body).toContain('Evidence 3h 57m ago');
|
||||
}
|
||||
}
|
||||
);
|
||||
Reference in New Issue
Block a user