From 703cceb512bfa16c3aac5abd00aa94527e0b6da7 Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Tue, 21 Apr 2026 13:33:38 +0000 Subject: [PATCH] test(config): cover config init and show output --- test/config-handler_test.ts | 111 ++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 test/config-handler_test.ts diff --git a/test/config-handler_test.ts b/test/config-handler_test.ts new file mode 100644 index 0000000..f41782b --- /dev/null +++ b/test/config-handler_test.ts @@ -0,0 +1,111 @@ +import { assertEquals } from 'jsr:@std/assert@^1.0.0'; +import { ConfigHandler } from '../ts/cli/config-handler.ts'; +import { PATHS } from '../ts/constants.ts'; +import { logger } from '../ts/logger.ts'; + +Deno.test('ConfigHandler init writes the current default config shape', async () => { + const tempDir = await Deno.makeTempDir(); + const originalConfigDir = PATHS.CONFIG_DIR; + const originalConfigFile = PATHS.CONFIG_FILE; + (PATHS as { CONFIG_DIR: string }).CONFIG_DIR = tempDir; + (PATHS as { CONFIG_FILE: string }).CONFIG_FILE = `${tempDir}/config.json`; + + try { + const handler = new ConfigHandler(); + await handler.init(); + + const config = JSON.parse(await Deno.readTextFile(`${tempDir}/config.json`)); + assertEquals(config.ui.enabled, true); + assertEquals(config.ui.assetSource, 'bundle'); + assertEquals(config.cluster.role, 'standalone'); + assertEquals(config.models.registryUrl, 'https://list.modelgrid.com/catalog/models.json'); + assertEquals(config.models.autoDeploy, true); + assertEquals(config.models.defaultEngine, 'vllm'); + } finally { + (PATHS as { CONFIG_DIR: string }).CONFIG_DIR = originalConfigDir; + (PATHS as { CONFIG_FILE: string }).CONFIG_FILE = originalConfigFile; + await Deno.remove(tempDir, { recursive: true }); + } +}); + +Deno.test('ConfigHandler show renders canonical model and ui settings', async () => { + const tempDir = await Deno.makeTempDir(); + const originalConfigFile = PATHS.CONFIG_FILE; + const boxes: Array<{ title: string; lines: string[] }> = []; + const originalLog = logger.log; + const originalLogBox = logger.logBox; + + (PATHS as { CONFIG_FILE: string }).CONFIG_FILE = `${tempDir}/config.json`; + + logger.log = (_message: string) => {}; + logger.logBox = ( + title: string, + lines: string[], + ) => { + boxes.push({ title, lines }); + }; + + try { + await Deno.writeTextFile( + `${tempDir}/config.json`, + JSON.stringify({ + version: '1.0.0', + api: { + port: 8080, + host: '0.0.0.0', + apiKeys: ['sk-test'], + rateLimit: 60, + cors: true, + corsOrigins: ['*'], + }, + ui: { + enabled: true, + port: 8081, + host: '0.0.0.0', + assetSource: 'bundle', + }, + docker: { + networkName: 'modelgrid', + runtime: 'docker', + }, + gpus: { + autoDetect: true, + assignments: {}, + }, + containers: [], + models: { + registryUrl: 'https://example.com/catalog.json', + autoDeploy: false, + defaultEngine: 'vllm', + autoLoad: ['meta-llama/Llama-3.1-8B-Instruct'], + }, + cluster: { + enabled: false, + nodeName: 'modelgrid-local', + role: 'standalone', + bindHost: '0.0.0.0', + gossipPort: 7946, + heartbeatIntervalMs: 5000, + seedNodes: [], + }, + checkInterval: 30000, + }), + ); + + const handler = new ConfigHandler(); + await handler.show(); + + const modelsBox = boxes.find((box) => box.title === 'Models'); + assertEquals(modelsBox?.lines.some((line) => line.includes('Auto Deploy:')), true); + assertEquals(modelsBox?.lines.some((line) => line.includes('Default Engine: vllm')), true); + assertEquals(modelsBox?.lines.some((line) => line.includes('https://example.com/catalog.json')), true); + + const apiBox = boxes.find((box) => box.title === 'API Server'); + assertEquals(apiBox?.lines.some((line) => line.includes('Rate Limit: 60 req/min')), true); + } finally { + logger.log = originalLog; + logger.logBox = originalLogBox; + (PATHS as { CONFIG_FILE: string }).CONFIG_FILE = originalConfigFile; + await Deno.remove(tempDir, { recursive: true }); + } +});