import assert from "node:assert/strict" import Fastify from "fastify" import { validatorCompiler, serializerCompiler } from "@fastify/type-provider-zod" import { createContainersRoutes } from "./containers.js" import { permissionForRequest } from "../lib/permissions.js" const empty = {collectedAt:new Date().toISOString(),servers:[]} let value:unknown=empty,failed=false const app=Fastify();app.setValidatorCompiler(validatorCompiler);app.setSerializerCompiler(serializerCompiler) await app.register(createContainersRoutes({getState:async()=>{if(failed)throw new Error("DB unavailable");return value as typeof empty}}),{prefix:"/api"}) const read=()=>app.inject({method:"GET",url:"/api/containers/state"}) assert.equal((await read()).statusCode,200);assert.deepEqual((await read()).json().servers,[]) value={...empty,servers:[{serverId:1,collectedAt:empty.collectedAt,availability:"error",containers:[],failures:[{resource:"containers",error:"offline"}]}]} assert.equal((await read()).statusCode,200);assert.equal((await read()).json().servers[0].availability,"error") for(const bad of [{containers:[]},{...empty,servers:[{serverId:1}]},{...empty,collectedAt:"yesterday"}]){value=bad;assert.equal((await read()).statusCode,502)} failed=true;assert.equal((await read()).statusCode,500) assert.equal(permissionForRequest("GET","/api/containers/state"),"mm:dashboard:read") assert.equal(permissionForRequest("POST","/api/servers/1/containers/start"),"mm:servers:write") await app.close();console.log("Containers HTTP: explicit empty/partial error, invalid state 502, DB failure 500, existing permission contract")