From 4af9d3de69d407f55059b6cdbc17643c5640a534 Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Tue, 21 Apr 2026 13:36:53 +0000 Subject: [PATCH] test(ui): cover degraded overview health semantics --- test/ui-server_test.ts | 55 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 test/ui-server_test.ts diff --git a/test/ui-server_test.ts b/test/ui-server_test.ts new file mode 100644 index 0000000..5bd9d7a --- /dev/null +++ b/test/ui-server_test.ts @@ -0,0 +1,55 @@ +import { assertEquals } from 'jsr:@std/assert@^1.0.0'; +import { ClusterManager } from '../ts/cluster/cluster-manager.ts'; +import { UiServer } from '../ts/ui/server.ts'; + +Deno.test('UiServer overview mirrors degraded API health semantics', async () => { + const port = 20300 + Math.floor(Math.random() * 1000); + const cluster = new ClusterManager(); + cluster.configure({ + enabled: false, + nodeName: 'ui-test-node', + role: 'standalone', + bindHost: '127.0.0.1', + gossipPort: 7946, + heartbeatIntervalMs: 5000, + seedNodes: [], + }); + + const server = new UiServer( + { enabled: true, port, host: '127.0.0.1', assetSource: 'disk' }, + { + async getAllStatus() { + return new Map([ + ['vllm-1', { running: false, health: 'unhealthy' }], + ]); + }, + async getAllAvailableModels() { + return new Map(); + }, + } as never, + cluster, + ); + + (server as unknown as { + gpuDetector: { detectGpus: () => Promise }; + }).gpuDetector = { + async detectGpus() { + return [{ id: 'nvidia-0' }]; + }, + }; + + await server.start(); + + try { + const response = await fetch(`http://127.0.0.1:${port}/_ui/overview`); + const body = await response.json(); + + assertEquals(response.status, 200); + assertEquals(body.health.status, 'degraded'); + assertEquals(body.health.reasons.includes('unhealthy_container'), true); + assertEquals(body.health.reasons.includes('no_models_available'), true); + assertEquals(body.node.name, 'ui-test-node'); + } finally { + await server.stop(); + } +});