import test from 'node:test'; import assert from 'node:assert/strict'; import { createServer, serviceRoutes } from './server.mjs'; test('independent services expose only their own API and preserve response contracts', async () => { const servers = {}; const addresses = {}; try { for (const role of Object.keys(serviceRoutes)) { const server = createServer({ role, env: {}, fetcher: async () => ({ok:true,json:async()=>({ current: {temperature_2m:18, wind_speed_10m:8, weather_code:2, time:'2026-09-13T10:00'}, daily: {temperature_2m_min:[12],temperature_2m_max:[22]} })}) }); await new Promise(resolve => server.listen(0,'127.0.0.1',resolve)); servers[role] = server; addresses[role] = `http://127.0.0.1:${server.address().port}`; assert.equal((await fetch(addresses[role]+'/api/health')).status,200); assert.equal((await fetch(addresses[role]+'/')).status,404); for (const [other, paths] of Object.entries(serviceRoutes)) { if (other !== role) for (const path of paths) assert.equal((await fetch(addresses[role]+path)).status,404); } } const data = await (await fetch(addresses.telemetry+'/api/telemetry?profile=arret')).json(); assert.equal(data.speedKph,0); assert.equal(data.source,'demo'); assert.equal((await (await fetch(addresses.weather+'/api/weather?lat=48&lon=2')).json()).temperature,18); assert.match((await (await fetch(addresses.navigation+'/api/map-config')).json()).tileUrl,/openstreetmap/); assert.equal((await fetch(addresses.navigation+'/api/search?q=a')).status,400); assert.equal((await fetch(addresses.weather+'/api/weather',{method:'POST'})).status,405); await new Promise(resolve=>servers.weather.close(resolve)); delete servers.weather; assert.equal((await fetch(addresses.telemetry+'/api/telemetry')).status,200); assert.equal((await fetch(addresses.navigation+'/api/map-config')).status,200); } finally { await Promise.all(Object.values(servers).map(server=>new Promise(resolve=>server.close(resolve)))); } }); test('invalid service roles cannot silently expose the combined development API', () => { assert.throws(()=>createServer({role:'unknown'}),/Unknown service/); });