Files
MikrotikManager/backend/src/routes/containers-state.test.ts
T

19 lines
1.6 KiB
TypeScript

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")